package com.energy.manage.service.util;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil;
import com.energy.manage.common.reponse.HttpResult;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class HttpGetClient {

    // 默认超时时间5秒
    private static final int DEFAULT_TIMEOUT = 5000;

    /**
     * 发送带Authorization头和动态参数的GET请求
     *
     * @param baseUrl 基础URL（不包含参数部分）
     * @param token   认证令牌
     * @param params  动态请求参数
     * @return 响应结果封装对象
     */
    public static HttpResult sendWithAuthAndParams(String baseUrl, String token, Map<String, Object> params) {
        return sendWithAuthAndParams(baseUrl, token, params, new HashMap<>(), DEFAULT_TIMEOUT);
    }

    /**
     * 发送带Authorization头和动态参数的GET请求，可自定义头信息和超时时间
     *
     * @param baseUrl 基础URL（不包含参数部分）
     * @param token   认证令牌
     * @param params  动态请求参数
     * @param headers 额外的头信息
     * @param timeout 超时时间(毫秒)
     * @return 响应结果封装对象
     */
    public static HttpResult sendWithAuthAndParams(String baseUrl, String token, Map<String, Object> params,
                                                   Map<String, String> headers, int timeout) {
        // 参数校验
        if (baseUrl == null || baseUrl.trim().isEmpty()) {
            return HttpResult.fail("请求基础URL不能为空");
        }
        if (token == null || token.trim().isEmpty()) {
            return HttpResult.fail("认证令牌不能为空");
        }

        try {
            // 构建完整URL（自动处理参数拼接和编码）
            String url = HttpUtil.urlWithForm(baseUrl, params, Charset.forName("UTF-8"), false);
            log.info("请求url 地址 >>> " + url);
            // 构建请求
            HttpRequest request = HttpRequest.get(url)
                    .header("Authorization", token)
                    .header("Content-Type", "application/json")
                    .timeout(timeout);

            // 添加额外头信息
            if (headers != null && !headers.isEmpty()) {
                headers.forEach(request::header);
            }

            // 执行请求
            HttpResponse response = request.execute();
            int statusCode = response.getStatus();

            // 根据状态码返回不同结果
            if (HttpStatus.HTTP_OK == statusCode) {
                return HttpResult.success(statusCode, response.body());
            } else {
                return HttpResult.fail(statusCode, "请求失败: " + response.body());
            }

        } catch (Exception e) {
            return HttpResult.fail("请求发生异常: " + e.getMessage());
        }
    }

}
