package com.ycwl.basic.service.pc.helper;

import com.ycwl.basic.util.TtlCacheMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 人脸匹配防重复服务
 * 使用本地缓存实现2秒内的防重复调用机制
 *
 * @author Claude
 * @since 2025-11-27
 */
@Slf4j
@Service
public class FaceMatchDedupService {

    /**
     * 防重复TTL时间（毫秒）
     */
    private static final long DEFAULT_TTL_MILLIS = 2000L;

    /**
     * 缓存Key前缀
     */
    private static final String KEY_PREFIX = "face:match:dedup:";

    /**
     * 防重复缓存
     * Key: face:match:dedup:{scenicId}:{userId}
     * Value: 时间戳
     */
    private final TtlCacheMap<String, Long> dedupCache;

    public FaceMatchDedupService() {
        this.dedupCache = new TtlCacheMap<>(DEFAULT_TTL_MILLIS);
    }

    /**
     * 检查是否应该跳过本次匹配（防重复）
     *
     * @param userId 用户ID
     * @param scenicId 景区ID
     * @return true-应该跳过，false-可以执行
     */
    public boolean shouldSkip(Long userId, Long scenicId) {
        if (userId == null || scenicId == null) {
            return false;
        }

        String key = buildKey(userId, scenicId);
        Long timestamp = dedupCache.get(key);

        if (timestamp != null) {
            long elapsedMs = System.currentTimeMillis() - timestamp;
            log.info("防重复检查：检测到{}秒内的重复调用（已过{}ms），跳过匹配。userId={}, scenicId={}, 上次调用时间={}",
                     DEFAULT_TTL_MILLIS / 1000.0, elapsedMs, userId, scenicId, new Date(timestamp));
            return true;
        }

        return false;
    }

    /**
     * 标记本次匹配已执行（用于防重复）
     *
     * @param userId 用户ID
     * @param scenicId 景区ID
     */
    public void markMatched(Long userId, Long scenicId) {
        if (userId == null || scenicId == null) {
            return;
        }

        String key = buildKey(userId, scenicId);
        long timestamp = System.currentTimeMillis();
        dedupCache.put(key, timestamp, DEFAULT_TTL_MILLIS);

        log.debug("防重复标记：记录匹配调用。userId={}, scenicId={}, TTL={}ms, timestamp={}",
                 userId, scenicId, DEFAULT_TTL_MILLIS, timestamp);
    }

    /**
     * 清除指定用户的防重标记（用于测试或特殊场景）
     *
     * @param userId 用户ID
     * @param scenicId 景区ID
     */
    public void clearMark(Long userId, Long scenicId) {
        if (userId == null || scenicId == null) {
            return;
        }

        String key = buildKey(userId, scenicId);
        dedupCache.remove(key);
        log.info("防重复标记清除：userId={}, scenicId={}", userId, scenicId);
    }

    /**
     * 构建缓存Key
     * 格式：face:match:dedup:{scenicId}:{userId}
     *
     * @param userId 用户ID
     * @param scenicId 景区ID
     * @return 缓存Key
     */
    private String buildKey(Long userId, Long scenicId) {
        return KEY_PREFIX + scenicId + ":" + userId;
    }

    /**
     * 获取缓存统计信息（用于监控）
     *
     * @return 统计信息字符串
     */
    public String getStats() {
        return dedupCache.getStats();
    }
}
