package com.smspod.utils.okhttp;

import okhttp3.*;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class OkHttpUtils {
    private static final int DEFAULT_CONCURRENT_SIZE = 120; // 默认并发数 连接池中保持空闲的最大连接数。
    private static final int DEFAULT_TIMEOUT = 10; // 默认超时时间（秒）

    // 单例实例
    private static volatile OkHttpClient instance;

    private OkHttpUtils() {}

    // 获取单例客户端
    public static OkHttpClient getInstance() {
        if (instance == null) {
            synchronized (OkHttpUtils.class) {
                if (instance == null) {
                    instance = buildClient(DEFAULT_CONCURRENT_SIZE, DEFAULT_TIMEOUT);
                }
            }
        }
        return instance;
    }

    // 自定义配置构建客户端
    public static OkHttpClient buildClient(int concurrentSize, int timeout) {
        Dispatcher dispatcher = new Dispatcher();
        // 调整调度器并发
        dispatcher.setMaxRequests(1000);//整个 OkHttpClient 实例允许的最大并发请求数。
        dispatcher.setMaxRequestsPerHost(200);//单个域名（Host）允许的最大并发数。在微服务内部调用中尤为重要。
        return new OkHttpClient.Builder()
                .connectTimeout(timeout, TimeUnit.SECONDS)
                .readTimeout(timeout, TimeUnit.SECONDS)
                .writeTimeout(timeout, TimeUnit.SECONDS)
                .connectionPool(new ConnectionPool(concurrentSize, 60, TimeUnit.SECONDS))
                .dispatcher(dispatcher)
                .sslSocketFactory(createSSLSocketFactory(), new TrustAllManager()) // SSL 配置
                .hostnameVerifier((hostname, session) -> true) // 忽略证书校验（测试环境）
                .build();
    }

    // 创建 SSL Socket 工厂（忽略证书验证）
    private static SSLSocketFactory createSSLSocketFactory() {
        try {
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, new TrustManager[]{new TrustAllManager()}, new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            throw new RuntimeException("SSL 初始化失败", e);
        }
    }

    // 信任所有证书的 TrustManager
    private static class TrustAllManager implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {}

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) {}

        @Override
        public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
    }



    public static String get(Map<String, String> params) {
        HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
        params.forEach(urlBuilder::addQueryParameter);
        Request request = new Request.Builder()
                .url(urlBuilder.build())
                .get()
                .build();
        return executeRequest(request);
    }

    private static String executeRequest(Request request) {
        try {
            System.out.println("Sending request: " + request.method() + " ," + request.url());
            try (Response response = OkHttpUtils.getInstance().newCall(request).execute()) {
                if (!response.isSuccessful()) throw new IOException("HTTP 错误码: " + response.code());
                return response.body() != null ? response.body().string() : "";
            }
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    private static final String url = "https://api.haosms.net/extra_api/otp_msg";
    private static final String API_KEY = "YOUR_API_KEY";
    public static void main(String[] args) {
        String phone = "13800000000";
        //params
        Map<String, String> params = new HashMap<>();
        params.put("api_key", API_KEY); //required,API key
        params.put("phone", phone);//required,Phone number,No country code needed
        params.put("content", "123456");//required,Verification code
        params.put("platform", "香港OTP通道1");//required,Channel to be sent
        params.put("tmp_id", "123");//template id
        String result = get(params);
        System.out.println(result);
    }

}
