package com.czg.service.product.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.czg.exception.CzgException;
import lombok.extern.slf4j.Slf4j;


/**
 * 一个木涵
 *
 * @author: ww
 */
@Slf4j
public class MuSmartCountUtils {
    // 基础配置
    private static final String LOGIN_URL = "https://uapi.woobx.cn/user/login";
    private static final String DETECT_URL = "https://uapi.woobx.cn/app/object-det/bamboo-stick";
    // 请求超时时间（毫秒）
    private static final int TIMEOUT = 10000;

    /**
     * 登录接口 - 获取认证Token（线程安全）
     *
     * @return 认证Token
     */
    public static String login(String username, String password) {
        // 构建登录请求
        HttpResponse response = HttpRequest.post(LOGIN_URL)
                .form("username", username)
                .form("password", password)
                .timeout(TIMEOUT)
                .execute();
        // 校验响应状态
        if (!response.isOk()) {
            log.error("登录失败，响应码：{},数据：{}", response.getStatus(), response.body());
            throw new CzgException("登录失败");
        }

        // 解析响应结果
        String responseStr = response.body();
        JSONObject result = JSON.parseObject(responseStr);
        if (200 != result.getIntValue("code")) {
            log.error("登录失败，响应码：{},数据：{}", response.getStatus(), result);
            throw new CzgException("登录失败");
        }

        // 提取并缓存Token
        String token = result.getJSONObject("data").getString("authToken");
        if (StrUtil.isBlank(token)) {
            log.error("登录失败，响应码：{},数据：{}", response.getStatus(), result);
            throw new CzgException("登录失败");
        }
        return token;
    }

    /**
     * 竹签识别核心方法（自动处理Token过期重试）
     *
     * @param imageBase64 图片Base64编码字符串
     * @return 识别结果JSON对象
     * @throws Exception 识别异常
     */
    public static int detectBambooStick(String imageBase64, String token) throws Exception {
        // 参数校验
        if (StrUtil.isBlank(imageBase64)) {
            throw new CzgException("图片Base64编码不能为空");
        }
        // 第一次调用识别接口
        JSONObject detectResult = doDetectRequest(imageBase64, token);
        return MuSmartCountUtils.countBambooStick(detectResult);
    }

    /**
     * 执行竹签识别请求（核心请求逻辑）
     *
     * @param imageBase64 图片Base64编码
     * @param token       认证Token
     * @return 识别结果
     */
    private static JSONObject doDetectRequest(String imageBase64, String token){
        // 构建识别请求
        HttpResponse response = HttpRequest.post(DETECT_URL)
                .header("authorization", "Bearer " + token)
                .form("image", imageBase64)
                .form("base64", "true")
                .timeout(TIMEOUT)
                .execute();

        // 校验响应状态
        if (!response.isOk()) {
            throw new RuntimeException("识别请求失败，响应码：" + response.getStatus());
        }

        // 解析响应结果
        String responseStr = response.body();
        return JSON.parseObject(responseStr);
    }

    /**
     * 解析识别结果，统计竹签数量（自定义分数阈值）
     *
     * @param detectResult 识别结果JSON
     * @return 竹签数量
     */
    private static int countBambooStick(JSONObject detectResult) {
        // 参数校验
        if (detectResult == null || 200 != detectResult.getIntValue("code")) {
            return 0;
        }

        JSONArray dataArray = detectResult.getJSONArray("data");
        if (dataArray == null || dataArray.isEmpty()) {
            return 0;
        }
        return dataArray.size();
    }
}