package com.sonic.cow.utils;

import com.sonic.common.AppRuntime;
import com.sonic.cow.enums.PromptTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.validation.constraints.NotNull;

/**
 * 统一的 redis key 管理工具类（方便后续的维护和查找）
 */
@Slf4j
@Service
public class RedisKeyUtils {

    @Autowired
    private AppRuntime appRuntime;

    /**
     * 和AI聊天时的上下文缓存ID（eg: 1010:chat:contextId:xx:xx）
     *
     * @param userId
     * @param aiId
     * @return
     */
    public String chatContextIdCacheKey(Long userId, Long aiId) {
        return appRuntime.buildPrefixKey("chat", "contextId", userId, aiId);
    }

    /**
     * 和AI聊天时的上下文缓存ID（eg: 1010:chat:responseId:xx:xx）
     *
     * @param userId
     * @param aiId
     * @return
     */
    public String chatResponseIdCacheKey(Long userId, Long aiId) {
        return appRuntime.buildPrefixKey("chat", "responseId", userId, aiId);
    }

    /**
     * 和AI聊天时的历史消息缓存（eg: 1010:chat:contextId:xx:xx）
     *
     * @param userId
     * @param aiId
     * @return
     */
    public String chatMemoryCacheKey(Long userId, Long aiId) {
        return appRuntime.buildPrefixKey("chat", "memory", userId, aiId);
    }

    /**
     * 生成图片用户ID限流
     *
     * @param userId
     * @param hl
     * @return
     */
    public String genImageUserLimit(Long userId, Boolean hl) {
        return appRuntime.buildPrefixKey("limit", "genImage", "userId", userId, hl);
    }

    /**
     * 生成图片设备号限流
     *
     * @param deviceId
     * @param hl
     * @return
     */
    public String genImageDeviceLimit(String deviceId, Boolean hl) {
        return appRuntime.buildPrefixKey("limit", "genImage", "deviceId", deviceId, hl);
    }

    /**
     * 生成图片IP限流
     *
     * @param ip
     * @param hl
     * @return
     */
    public String genImageIpLimit(String ip, Boolean hl) {
        return appRuntime.buildPrefixKey("limit", "genImage", "ip", ip, hl);
    }

    /**
     * 轮询获取图片生成结果限流
     *
     * @param batchNo
     * @return
     */
    public String genImagePollingLimit(String batchNo) {
        return appRuntime.buildPrefixKey("limit", "genImage", "polling", batchNo);
    }

    /**
     * 轮询获取图片生成结果限流
     *
     * @param batchNo
     * @return
     */
    public String getGenImageCacheKey(String batchNo) {
        return appRuntime.buildPrefixKey("cache", "getGenImage", batchNo);
    }

    /**
     * 生成图片的锁
     *
     * @param userId
     * @return
     */
    public String genImageLockKey(Long userId) {
        return appRuntime.buildPrefixKey("lock", "genImage", userId);
    }

    /**
     * AI用户基础信息key 在sonic_cow服务中使用，构建聊天提示词,图片生成提示词等
     *
     * @param aiId
     * @return
     */
    public String aiUserCacheInfoKey(Long aiId) {
        return "aiUserCacheInfo" + aiId;
    }


    /**
     * 生成AI用户内容限流
     *
     * @param userId
     * @param bizType
     * @return
     */
    public String limitGenAiUserContentKey(Long userId, String bizType) {
        return appRuntime.buildPrefixKey("limit", "genAiUserContent", userId, bizType);
    }

    /**
     * ai图生图加锁
     *
     * @return
     */
    public String aiGenImageLockKey(String batchNo) {
        return appRuntime.buildPrefixKey("aiGenImageBatchNoLock", batchNo);
    }

    /**
     * ai图生图加锁
     *
     * @return
     */
    public String aiChatLockKey(Long userId, Long aiId) {
        return appRuntime.buildPrefixKey("aiChatLockKey", userId, aiId);
    }

    /**
     * 获取用户通知的zset（超过24小时没有和用户联系时触发扫描通知）
     *
     * @return
     */
    public String notifyUserZSetKey() {
        return appRuntime.buildPrefixKey("chat", "notify");
    }

    /**
     * 图生图错误枚举
     */
    public String imageGenImageErrorEnumKey(String imageUrl) {
        return appRuntime.buildPrefixKey("imageGenImageErrorEnum");
    }

    /**
     * 和AI聊天时的上下文缓存清理任务（eg: 1010:chat:responseId:clear:xx:xx）
     *
     * @param userId
     * @param aiId
     * @return
     */
    public String chatResponseIdClearTaskKey(Long userId, Long aiId) {
        return appRuntime.buildPrefixKey("chat", "responseId", "clear", userId, aiId);

    }

    /**
     * 语音通话聊天缓存key
     *
     * @param userId
     * @param aiId
     * @return
     */
    public String voiceChatMessageCacheKey(Long userId, Long aiId) {
        return appRuntime.buildPrefixKey("voiceChatMessageCache", userId, aiId);

    }

    /**
     * 语音通话用户离开房间缓存key
     *
     * @return
     */
    public String voiceChatUserLeaveRoomKey() {
        return appRuntime.buildPrefixKey("voiceChatUserLeaveRoom");
    }

    /**
     * 语音通话用户ID与任务ID缓存key
     *
     * @param userId
     * @return
     */
    public String voiceChatTaskIdKey(String userId) {
        return appRuntime.buildPrefixKey("voiceChatTaskId", userId);
    }

    /**
     * 语音通话说话轮次缓存key
     *
     * @param taskId
     */
    public String voiceChatRoundIdKey(String taskId) {
        return appRuntime.buildPrefixKey("voiceChatRoundId", taskId);
    }

    /**
     * 语音通话说话每轮数据缓存key
     *
     * @param taskId
     */
    public String voiceChatRoundDataKey(String taskId) {
        return appRuntime.buildPrefixKey("voiceChatRoundData", taskId);
    }

    /**
     * 语音通话开始时间缓存key
     *
     * @param roomId
     * @param taskId
     * @return
     */
    public String voiceChatStartTimeCacheKey(String roomId, String taskId) {
        return appRuntime.buildPrefixKey("voiceChatStartTime", roomId, taskId);
    }

    /**
     * 语音通话ID缓存key
     *
     * @param roomId
     * @param taskId
     * @return
     */
    public String voiceCallIdCacheKey(String roomId, String taskId) {
        return appRuntime.buildPrefixKey("voiceCallIdCache", roomId, taskId);
    }


    /**
     * 扣费限流
     *
     * @param userId
     * @return
     */
    public String ttsDeAmountLimitKey(Long userId) {
        return appRuntime.buildPrefixKey("limit", "ttsDeAmount", userId);
    }

    /**
     * 生成辅助聊天内容限流
     *
     * @param userId
     * @param batchNo
     * @return
     */
    public String genSupContentBatchNoLimitKey(Long userId, String batchNo) {
        return appRuntime.buildPrefixKey("limit", userId, batchNo);
    }

    /**
     * 生成自动聊天内容的限流key
     *
     * @param userId
     * @param aiId
     * @return
     */
    public String genAutoChatAndSendImMessageLimitKey(Long userId, Long aiId) {
        return appRuntime.buildPrefixKey("limit", userId, aiId);
    }

    /**
     * tts调用限制键 1分钟最多调20次
     *
     * @param userId
     * @return
     */
    public String ttsMinuteLimitKey(Long userId) {
        return appRuntime.buildPrefixKey("limit", "ttsMinute", userId);
    }

    /**
     * 内容生成限流key 1分钟最多调20次
     *
     * @param userId
     * @param ptType
     * @return
     */
    public String contentLimitKey(Long userId, PromptTypeEnum ptType) {
        return appRuntime.buildPrefixKey("limit", "content", userId, ptType);
    }

    /**
     * 创建Ai形象时限流key 1分钟最多调20次
     *
     * @param userId
     * @return
     */
    public String aiImageLimitKey(Long userId) {
        return appRuntime.buildPrefixKey("limit", "AiImage", userId);
    }
}
