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

import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.integration.common.manager.ScenicConfigManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 景区配置门面类
 * 提供类型安全的配置访问方法，避免配置键的字符串硬编码
 * 集中管理所有景区配置项的访问逻辑
 *
 * @author Claude
 * @since 2025-10-31
 */
@Slf4j
@Component
public class ScenicConfigFacade {

    @Autowired
    private ScenicRepository scenicRepository;

    /**
     * 获取景区配置管理器
     */
    private ScenicConfigManager getConfig(Long scenicId) {
        return scenicRepository.getScenicConfigManager(scenicId);
    }

    // ==================== 人脸识别相关配置 ====================

    /**
     * 是否优先手动选择人脸
     * 如果为 true，则不自动创建任务
     *
     * @param scenicId 景区ID
     * @return true-需要手动选择，false-自动创建任务
     */
    public boolean isFaceSelectFirst(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return false;
        }
        Boolean value = config.getBoolean("face_select_first");
        return Boolean.TRUE.equals(value);
    }

    /**
     * 获取自定义人脸匹配的最大次数
     * 用于限制用户手动重新匹配的次数
     *
     * @param scenicId 景区ID
     * @return 最大匹配次数，null 或 0 表示不限制
     */
    public Integer getFaceSelectMaxCount(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return null;
        }
        return config.getInteger("face_select_max_count");
    }

    /**
     * 获取人脸分数低阈值
     * 低于此分数的匹配结果会被标记为低置信度
     *
     * @param scenicId 景区ID
     * @return 分数阈值，默认 30.0
     */
    public Float getFaceScoreLowThreshold(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return 30.0F;
        }
        return config.getFloat("face_score_low_threshold", 30.0F);
    }

    /**
     * 获取人脸检测辅助阈值
     * 当匹配结果数量少于此阈值时，会触发补救逻辑
     *
     * @param scenicId 景区ID
     * @return 辅助阈值，默认 0（不启用）
     */
    public Integer getFaceDetectHelperThreshold(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return 0;
        }
        return config.getInteger("face_detect_helper_threshold", 0);
    }

    /**
     * 获取人脸选择后处理模式
     * 0-并集模式，1-交集模式
     *
     * @param scenicId 景区ID
     * @return 后处理模式，默认 0
     */
    public Integer getFaceSelectPostMode(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return 0;
        }
        return config.getInteger("face_select_post_mode", 0);
    }

    /**
     * 获取重新匹配模式
     * 用于决定在什么条件下需要重新进行人脸匹配
     *
     * @param scenicId 景区ID
     * @return 匹配模式，默认 0
     */
    public Integer getRematchMode(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return 0;
        }
        return config.getInteger("re_match_mode", 0);
    }

    // ==================== 源文件相关配置 ====================

    /**
     * 是否禁用源图片功能
     *
     * @param scenicId 景区ID
     * @return true-禁用，false-启用
     */
    public boolean isDisableSourceImage(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return false;
        }
        Boolean value = config.getBoolean("disable_source_image");
        return Boolean.TRUE.equals(value);
    }

    /**
     * 是否禁用源视频功能
     *
     * @param scenicId 景区ID
     * @return true-禁用，false-启用
     */
    public boolean isDisableSourceVideo(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return false;
        }
        Boolean value = config.getBoolean("disable_source_video");
        return Boolean.TRUE.equals(value);
    }

    /**
     * 获取免费照片数量
     * 新用户首次识别时赠送的免费照片数量
     *
     * @param scenicId 景区ID
     * @return 免费照片数量，null 或 0 表示不赠送
     */
    public Integer getPhotoFreeNum(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return null;
        }
        return config.getInteger("photo_free_num");
    }

    // ==================== 拼图相关配置 ====================

    /**
     * 获取免费拼图数量
     * 新用户首次识别时赠送的免费拼图数量
     *
     * @param scenicId 景区ID
     * @return 免费拼图数量，null 或 0 表示不赠送
     */
    public Integer getPuzzleFreeNum(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return null;
        }
        return config.getInteger("puzzle_free_num");
    }

    // ==================== 游玩时间相关配置 ====================

    /**
     * 获取最大游玩时间（分钟）
     * 用于判断照片是否在合理的游玩时间范围内
     *
     * @param scenicId 景区ID
     * @return 最大游玩时间（分钟），null 表示不限制
     */
    public Integer getTourTime(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return null;
        }
        return config.getInteger("tour_time");
    }

    /**
     * 获取最小游玩时间（分钟）
     * 用于判断照片是否在合理的游玩时间范围内
     *
     * @param scenicId 景区ID
     * @return 最小游玩时间（分钟），null 表示不限制
     */
    public Integer getTourMinTime(Long scenicId) {
        ScenicConfigManager config = getConfig(scenicId);
        if (config == null) {
            return null;
        }
        return config.getInteger("tour_min_time");
    }

    /**
     * 检查是否配置了游玩时间限制
     *
     * @param scenicId 景区ID
     * @return true-已配置，false-未配置
     */
    public boolean hasTourTimeConfig(Long scenicId) {
        Integer maxTime = getTourTime(scenicId);
        Integer minTime = getTourMinTime(scenicId);
        return maxTime != null && minTime != null;
    }
}
