package com.yifu.cloud.plus.v1.check.utils;

import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Map;

/**
 * @author hgw2
 * @description 发送
 * @date 2022/5/7
 */
public class HttpUtils {
     private static final int REQUEST_TIMEOUT = 3 * 1000; // 设置请求超时10秒钟

     private static final int CONNECT_TIMEOUT = 5 * 1000; // 连接超时时间

     private static final int SO_TIMEOUT = 10 * 1000; // 数据传输超时

     private static final String ENCODING = "UTF-8";

     // 务必单例
     private static CloseableHttpClient client;

     static {
          RequestConfig requestConfig = RequestConfig.custom()
                  .setConnectTimeout(CONNECT_TIMEOUT)
                  .setConnectionRequestTimeout(REQUEST_TIMEOUT)
                  .setSocketTimeout(SO_TIMEOUT)
                  .build();
          client = HttpClients.custom().setDefaultRequestConfig(requestConfig).setMaxConnTotal(50).build();
     }

     public static String get(String url, Map<String, String> paramsMap) {
          return send(RequestBuilder.get(url), paramsMap);
     }


     public static String post(String url, Map<String, String> paramsMap) {
          return send(RequestBuilder.post(url), paramsMap);
     }

     /**
      * 以 multipart/form-data 方式提交POST请求
      * @param url 请求地址
      * @param paramsMap 参数map
      * @return 响应结果
      */
     public static String postMultipart(String url, Map<String, String> paramsMap) {
          return sendMultipart(RequestBuilder.post(url), paramsMap);
     }

     public static String send(RequestBuilder requestBuilder, Map<String, String> paramsMap) {
          requestBuilder.setCharset(Charset.forName(ENCODING));
          String responseText = "";

          if (paramsMap != null) {
               for (Map.Entry<String, String> param : paramsMap.entrySet()) {
                    requestBuilder.addParameter(param.getKey(), param.getValue());
               }

               CloseableHttpResponse response = null;
               try {
                    response = client.execute(requestBuilder.build());
                    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                         HttpEntity entity = response.getEntity();
                         if (entity != null) {
                              responseText = EntityUtils.toString(entity, ENCODING);
                         }
                    }
               } catch (Exception e) {
                    e.printStackTrace();//正式项目中请改为log打印
               } finally {
                    try {
                         response.close();
                    } catch (Exception e) {
                         e.printStackTrace();//正式项目中请改为log打印
                    }
               }

          }
          return responseText;

     }

     /**
      * 以 multipart/form-data 方式发送请求
      * @param requestBuilder 请求构建器
      * @param paramsMap 参数map
      * @return 响应结果
      */
     public static String sendMultipart(RequestBuilder requestBuilder, Map<String, String> paramsMap) {
          String responseText = "";
          if (paramsMap != null) {
               // 创建 multipart/form-data 实体
               MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
               entityBuilder.setCharset(Charset.forName(ENCODING));

               // 添加参数到 multipart 实体
               for (Map.Entry<String, String> param : paramsMap.entrySet()) {
				   try {
					   entityBuilder.addPart(param.getKey(), new StringBody(param.getValue(), Charset.forName(ENCODING)));
				   } catch (UnsupportedEncodingException e) {
					   return  null;
				   }
			   }

               HttpEntity entity = entityBuilder.build();
               requestBuilder.setEntity(entity);

               CloseableHttpResponse response = null;
               try {
                    response = client.execute(requestBuilder.build());
                    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                         HttpEntity responseEntity = response.getEntity();
                         if (responseEntity != null) {
                              responseText = EntityUtils.toString(responseEntity, ENCODING);
                         }
                    }
               } catch (Exception e) {
                    e.printStackTrace();//正式项目中请改为log打印
               } finally {
                    try {
                         response.close();
                    } catch (Exception e) {
                         e.printStackTrace();//正式项目中请改为log打印
                    }
               }
          }
          return responseText;
     }
}