package com.cmvr.common.utils.http;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.ContentType;
import cn.hutool.json.JSONUtil;

import java.io.File;
import java.util.Map;

/**
 * API调用 工具类封装（基于 HuTool）
 */
public class CallAPIUtil {

    /**
     * 发送 GET 请求
     *
     * @param url       请求地址
     * @param headers   请求头（可为 null）
     * @param params    URL 参数（可为 null）
     * @return 响应内容字符串
     */
    public static String doGet(String url, Map<String, String> headers, Map<String, Object> params) {
        HttpRequest request = HttpUtil.createGet(url);

        if (headers != null) {
            request.addHeaders(headers);
        }

        if (params != null) {
            request.form(params); // GET 请求用 form 方式拼接参数
        }

        try (HttpResponse response = request.execute()) {
            return response.body();
        }
    }

    /**
     * 发送 POST 请求 - 表单方式
     *
     * @param url     请求地址
     * @param headers 请求头
     * @param params  参数表单
     * @return 响应字符串
     */
    public static String doPostForm(String url, Map<String, String> headers, Map<String, Object> params) {
        HttpRequest request = HttpUtil.createPost(url);

        if (headers != null) {
            request.addHeaders(headers);
        }

        if (params != null) {
            request.form(params);
        }

        try (HttpResponse response = request.execute()) {
            return response.body();
        }
    }

    /**
     * 发送 POST 请求 - JSON 格式
     *
     * @param url     请求地址
     * @param headers 请求头
     * @param jsonObj 要发送的 JSON 对象（Map 或实体类）
     * @return 响应字符串
     */
    public static String doPostJson(String url, Map<String, String> headers, Object jsonObj) {
        HttpRequest request = HttpUtil.createPost(url)
                .header("Content-Type", ContentType.JSON.toString())
                .body(JSONUtil.toJsonStr(jsonObj));

        if (headers != null) {
            request.addHeaders(headers);
        }

        try (HttpResponse response = request.execute()) {
            return response.body();
        }
    }

    public static HttpResponse doPost(String url, Map<String, String> headers, Object jsonObj) {
        HttpRequest request = HttpUtil.createPost(url)
                .header("Content-Type", ContentType.JSON.toString())
                .body(JSONUtil.toJsonStr(jsonObj));

        if (headers != null) {
            request.addHeaders(headers);
        }

        try (HttpResponse response = request.execute()) {
            return response;
        }
    }

    /**
     * 发送 POST 请求 - 文件上传 (multipart/form-data)
     *
     * @param url     请求地址
     * @param headers 请求头（可为 null）
     * @param fileKey 文件字段名（如 "image"）
     * @param file    文件对象
     * @param params  其他表单参数（可为 null）
     * @return 响应字符串
     */
    public static String doPostFile(String url, Map<String, String> headers, String fileKey, File file, Map<String, Object> params) {
        HttpRequest request = HttpRequest.post(url);

        if (headers != null) {
            request.addHeaders(headers);
        }

        // 添加文件
        request.form(fileKey, file);

        // 其他普通参数
        if (params != null) {
            request.form(params);
        }

        try (HttpResponse response = request.execute()) {
            return response.body();
        }
    }
}
