package com.haha.sdk.util;

import java.util.Map;
import java.util.TreeMap;

/**
 * 回调工具类
 * 用于处理哈哈平台的回调通知
 * 
 * 重要说明：
 * 1. 哈哈平台的签名机制仅用于回调通知的验证
 * 2. 商户主动调用哈哈平台的API接口时不需要签名
 * 3. 回调通知使用ticket进行验签（ticket从/token/get接口获取）
 * 
 * @author haha-sdk
 * @version 1.0.0
 */
public class CallbackUtils {
    
    /**
     * 验证回调签名
     * 
     * @param params 回调参数（包含sign字段）
     * @param ticket 票据（从token获取接口返回的ticket字段）
     * @return 签名是否正确
     */
    public static boolean verifySign(Map<String, String> params, String ticket) {
        if (params == null || !params.containsKey("sign")) {
            return false;
        }
        
        String receivedSign = params.get("sign");
        
        // 使用TreeMap自动按key排序
        TreeMap<String, String> sortedParams = new TreeMap<>(params);
        
        // 拼接参数（排除sign字段）
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
            if ("sign".equals(entry.getKey())) {
                continue;
            }
            if (sb.length() > 0) {
                sb.append("&");
            }
            sb.append(entry.getKey()).append("=").append(entry.getValue());
        }
        
        // 拼接ticket
        sb.append("&ticket=").append(ticket);
        
        // MD5加密生成签名
        String calculatedSign = SignUtils.md5(sb.toString());
        
        // 比较签名
        return calculatedSign.equals(receivedSign);
    }
    
    /**
     * 获取回调通知类型
     * 
     * @param params 回调参数
     * @return 通知类型
     */
    public static String getNotifyType(Map<String, String> params) {
        return params.get("notify_type");
    }
    
    /**
     * 回调通知类型枚举
     */
    public static class NotifyType {
        /** 设备状态通知（开关门） */
        public static final String DEVICE_STATUS = "DEVICE_STATUS";
        /** 设备在线状态通知 */
        public static final String ONLINE_STATUS = "ONLINE_STATUS";
        /** 设备音量调节结果通知 */
        public static final String VOICE_RESULT = "VOICE_RESULT";
        /** 新品审核结果通知 */
        public static final String CLIENT_NEW_PRODUCT = "CLIENT_NEW_PRODUCT";
        /** 商品合并结果通知 */
        public static final String MERGE_PRODUCT = "MERGE_PRODUCT";
        /** AI识别结果通知（最重要） */
        public static final String ORC_RESULT = "ORC_RESULT";
    }
    
    /**
     * 回调响应常量
     */
    public static class Response {
        /** 成功响应 */
        public static final String SUCCESS = "success";
    }
}
