package com.ynxbd.common.helper.common;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
 * @Author wsq
 * @Date 2021/3/19 9:50
 * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved.
 */
@Slf4j
public class SoapHelper {
    /**
     * 特殊字符解码
     *
     * @param value 数据
     * @return data
     */
    public static String decodeValue(String value) {
        return value.replaceAll("&", "&")
                .replaceAll("<", "<")
                .replaceAll(">", ">")
                .replaceAll("'", "'")
                .replaceAll(""", "\"");
    }
    public static String getRespXmlData(String xml) {
        if (xml == null) {
            return null;
        }
        xml = decodeValue(xml);
        String leftSign = "";
        String rightSign = "";
        int leftIndex = xml.indexOf(leftSign);
        int rightIndex = xml.lastIndexOf(rightSign);
        return xml.substring(leftIndex, rightIndex + rightSign.length());
    }
    /**
     * 创建一个连接
     *
     * @param projectName    请求项目名
     * @param soapUrl        soapURL
     * @param soapAction     soapAction
     * @param soapRequestXml 请求XML参数
     * @return 数据
     */
    public static String post(String projectName, String soapUrl, String soapAction, String soapRequestXml) {
        return createConnection(projectName, soapUrl, soapAction, "POST", soapRequestXml);
    }
    /**
     * 创建一个连接
     *
     * @param projectName    请求项目名
     * @param soapUrl        soapURL
     * @param soapAction     soapAction
     * @param soapRequestXml 请求XML参数
     * @return 数据
     */
    public static String get(String projectName, String soapUrl, String soapAction, String soapRequestXml) {
        return createConnection(projectName, soapUrl, soapAction, "GET", soapRequestXml);
    }
    /**
     * 创建一个连接
     *
     * @param projectName    请求项目名
     * @param soapUrl        soapURL
     * @param soapAction     soapAction
     * @param soapRequestXml 请求XML参数
     * @return 数据
     */
    public static String createConnection(String projectName, String soapUrl, String soapAction, String httpType, String soapRequestXml) {
        if (soapUrl == null) {
            return null;
        }
        String respData = null; // 返回数据
        HttpURLConnection connection = null;
        OutputStreamWriter out = null;
        BufferedReader reader = null;
        try {
            // 第一步:创建服务地址
            URL url = new URL(soapUrl);
            // 第二步:打开一个通向服务地址的连接
            connection = (HttpURLConnection) url.openConnection();
            // 第三步:设置参数
            // 3.1发送方式设置:POST必须大写
            connection.setRequestMethod(httpType);
            // 3.2设置数据格式:content-msgInterface
            connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
            if (soapAction != null && !"".equals(soapAction)) {
                connection.setRequestProperty("SOAPAction", soapAction);
            }
            // 3.3设置输入输出,因为默认新创建的connection没有读写权限,
            connection.setDoInput(true);
            connection.setDoOutput(true);
            // 将信息以流的方式发送出去
            out = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8);
            // 第四步:组织SOAP数据,发送请求
            out.append(soapRequestXml);
            out.flush();
            // 第五步:接收服务端响应
            int responseCode = connection.getResponseCode();
            StringBuilder sb = new StringBuilder();
            String temp;
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
            while ((temp = reader.readLine()) != null) {
                sb.append(temp);
            }
            if (responseCode == 200) { // 请求成功
                respData = sb.toString();
            } else {
                log.error("{} 请求失败: {}", projectName, sb);
            }
        } catch (IOException e) {
            log.error("{} 请求异常: {}", projectName, e.getMessage());
            ErrorHelper.println(e);
        } finally {
            try {
                if (out != null) out.close();
                if (reader != null) reader.close();
                if (connection != null) connection.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return respData;
    }
    /**
     * 组合请求数据
     *
     * @param params 数据
     * @return 组合好的请求xml数据
     */
    public static String requestParams(String sys, Map params) {
        StringBuilder paramsXml = new StringBuilder();
        String key;
        Object value;
        for (Map.Entry entry : params.entrySet()) {
            key = entry.getKey();
            value = entry.getValue();
            value = value == null ? "" : value.toString();
            paramsXml.append("<").append(key).append(">").append(value).append("").append(key).append(">");
        }
        log.info("{} " + paramsXml + "", sys);
        return paramsXml.toString();
    }
}