package com.czg.service.product.util;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.StrUtil;
import com.czg.exception.CzgException;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.net.URLEncoder;

/**
 * 智能点数上传工具类
 * @author ww
 */
@Slf4j
public class AISmartCountUtils {
    // 基础配置
    private static final String BASE_URL = "https://api.aismartcount.com/api/v1";
    private static final int TIMEOUT = 30000;

    /**
     * 示例：完整调用流程
     */
    public static String getTickCount(String token, byte[] file, String fileName) throws Exception {
        String uploadResponse = uploadImage(token, file, fileName);
        return countImageDots(token, uploadResponse);

    }

    /**
     * 上传图片接口
     * 完全使用你提供的header(String, String)方法设置请求头
     *
     * @param imageData 图片数据（InputStream / byte[] / File）
     * @return 上传响应结果
     * @throws Exception 上传异常
     */
    private static String uploadImage(String token, Object imageData, String fileName) {

        // 1. 构建请求URL
        String uploadUrl = BASE_URL + "/upload/image";

        // 2. 构建POST请求并设置基础参数
        HttpRequest postRequest = HttpUtil.createPost(uploadUrl)
                .header("authorization", token)
                .timeout(TIMEOUT);

        // 3. 根据数据类型设置文件上传参数
        if (imageData instanceof File files) {
            postRequest.form("file", files);
        } else if (imageData instanceof InputStream input) {
            postRequest.form("file", input, fileName);
        } else if (imageData instanceof byte[] bytes) {
            postRequest.form("file", bytes, fileName);
        } else {
            throw new IllegalArgumentException("不支持的图片数据类型：" + (imageData == null ? "null" : imageData.getClass().getName()));
        }
        String body = postRequest.execute().body();
        // 解析上传响应并校验状态码
        JSONObject uploadResult = JSONUtil.parseObj(body);

        // 1. 校验响应码（核心）
        int code = uploadResult.getInt("code", -1);
        if (code != 200) {
            log.error("智能点数 图片上传失败 {}", uploadResult);
            throw new CzgException("图片上传失败");
        }
        JSONObject dataObj = uploadResult.getJSONObject("data");
        if (dataObj == null) {
            log.error("智能点数 图片上传响应中未找到data字段 {}", uploadResult);
            throw new CzgException("图片上传失败");
        }
        String imgUrl = dataObj.getStr("url");
        if (StrUtil.isBlank(imgUrl)) {
            log.error("智能点数 图片上传成功，但未返回图片URL {}", uploadResult);
            throw new CzgException("图片上传成功，但未返回图片URL");
        }
        return imgUrl;
    }

    /**
     * 统计图片点数接口
     * 手动拼接URL参数，使用header方法设置授权头
     *
     * @param imgUrl 图片URL
     * @return 统计响应结果
     * @throws Exception 请求异常
     */
    private static String countImageDots(String token, String imgUrl) throws Exception {
        String countUrl = BASE_URL + "/count/count-image-dots" +
                "?img_url=" + encodeParam(imgUrl) +
                "&type=stick&secure=true&upload_source=pc";

        // 2. 构建请求（仅使用你提供的方法）
        String countResponse = HttpUtil.createPost(countUrl)
                .header("authorization", token)
                .timeout(TIMEOUT)
                .execute()
                .body();
        JSONObject countResult = JSONUtil.parseObj(countResponse);
        int countCode = countResult.getInt("code", -1);
        if (countCode != 200) {
            log.error("智能点数 点数统计失败，未知错误 {}", countResult);
            throw new CzgException("点数统计失败，未知错误");
        }
        // 3. 执行请求并返回结果
        return countResult.getStr("total_count");
    }


    /**
     * 通用URL参数编码
     *
     * @param param 要编码的参数
     * @return 编码后的字符串
     */
    private static String encodeParam(String param) {
        if (StrUtil.isBlank(param)) {
            return "";
        }
        try {
            return URLEncoder.encode(param, StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw new RuntimeException("URL参数编码失败: " + param, e);
        }
    }
}