package com.haha.service;

import java.util.Map;

/**
 * 哈哈平台回调业务逻辑接口
 */
public interface HahaCallbackService {

    /**
     * 处理统一消息回调
     *
     * @param params 回调原始参数
     * @param rawBody 原始请求体（用于签名验证），可为 null
     */
    void handleMessage(Map<String, Object> params, String rawBody);

    /**
     * 处理统一消息回调（兼容旧调用）
     *
     * @deprecated 使用 {@link #handleMessage(Map, String)} 传递原始请求体
     */
    @Deprecated
    default void handleMessage(Map<String, Object> params) {
        handleMessage(params, null);
    }

    /**
     * 处理开关门状态通知 (DEVICE_STATUS)
     */
    void handleDeviceStatus(Map<String, Object> params);

    /**
     * 处理设备在线状态通知 (ONLINE_STATUS)
     */
    void handleOnlineStatus(Map<String, Object> params);

    /**
     * 处理音量调节结果通知 (VOICE_RESULT)
     */
    void handleVoiceResult(Map<String, Object> params);

    /**
     * 处理新品审核结果回调 (CLIENT_NEW_PRODUCT)
     */
    void handleNewProductAudit(Map<String, Object> params);

    /**
     * 处理商品合并结果通知 (MERGE_PRODUCT)
     */
    void handleMergeProduct(Map<String, Object> params);

    /**
     * 处理AI识别结果通知 (ORC_RESULT)
     */
    void handleOrcResult(Map<String, Object> params);

    /**
     * 处理订单信息回调
     *
     * @param params 订单回调参数
     * @param rawBody 原始请求体（用于签名验证），可为 null
     */
    void handleOrderCallback(Map<String, Object> params, String rawBody);

    /**
     * 处理订单信息回调（兼容旧调用）
     *
     * @deprecated 使用 {@link #handleOrderCallback(Map, String)} 传递原始请求体
     */
    @Deprecated
    default void handleOrderCallback(Map<String, Object> params) {
        handleOrderCallback(params, null);
    }
    
    /**
     * 验证回调签名（从已解析的参数Map构建签名，兼容旧逻辑）
     *
     * @deprecated 建议使用 {@link #validateSign(Map, String)} 从原始请求体构建签名
     */
    boolean validateSign(Map<String, Object> params);

    /**
     * 验证回调签名（推荐方式：从原始请求体构建签名）
     * 直接从原始 form-urlencoded body 构建签名字符串，保留 PHP 端的原始 URL 编码，
     * 避免 Spring 的 decode → Java URLEncoder re-encode 往返导致的编码差异。
     *
     * @param params  已解析的参数 Map（用于提取 sign、timestamp 等）
     * @param rawBody 原始请求体字符串（application/x-www-form-urlencoded 格式）
     */
    default boolean validateSign(Map<String, Object> params, String rawBody) {
        return validateSign(params);
    }

    /**
     * 获取订单图像（开门前后图片/视频）
     */
    Map<String, Object> getOrderMedia(String orderId, String activityId);

    /**
     * 从哈哈平台查询订单详情（用于对账补偿）
     */
    Map<String, Object> queryOrderFromHaha(String orderId, String activityId);

    /**
     * 查询回调投递状态
     */
    Map<String, Object> getCallbackInfo(String type, String actId);

    /**
     * 获取静态柜分层识别结果
     */
    Map<String, Object> getLayerRecognize(String orderId, String activityId);
}
