package com.seer.teach.teacher.api;

import cn.hutool.json.JSONUtil;
import com.seer.teach.common.cache.UserStudyStatusCacheService;
import com.seer.teach.common.cache.dto.UserStudyStatusDTO;
import com.seer.teach.common.dto.mq.IntegerDTO;
import com.seer.teach.common.enums.im.ImMqTopicEnum;
import com.seer.teach.common.enums.im.LargeModuleTopTagEnum;
import com.seer.teach.iot.api.UserDeviceServiceApi;
import com.seer.teach.teacher.common.dto.ReadingStatusDTO;
import com.seer.teach.teacher.common.utils.UserStatusCacheUtils;
import com.seer.teach.teacher.mq.ImMqProducer;
import com.seer.teach.teacher.service.LlmSseService;
import com.seer.teach.teacher.service.StudyService;
import com.seer.teach.teacher.service.prompt.impl.WelcomeMessagesServiceImpl;
import com.seer.teach.teacher.service.impl.ReadCountdownManagerService;
import com.seer.teach.teacher.service.impl.ReadEndService;
import com.seer.teach.teacher.service.impl.StudyCountdownManagerService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * 提供与SSE（Server-Sent Events）状态管理相关的接口实现。
 * 包括学习、阅读等场景下的连接控制、倒计时管理和消息推送等功能。
 * </p >
 *
 * @author Captain
 * @since 2025-07-26 16:13
 */
@Slf4j
@RestController
@RequiredArgsConstructor
public class SseServiceApiImpl implements SseServiceApi {

    private final LlmSseService llmSseService;

    private final UserDeviceServiceApi userDeviceServiceApi;

    private final UserStudyStatusCacheService userStudyStatusCacheService;

    private final ImMqProducer imMqProducer;

    private final ReadCountdownManagerService readCountdownManagerService;

    private final ReadEndService readEndService;

    private final WelcomeMessagesServiceImpl dailyWelcomesService;

    /**
     * 根据用户ID和类型关闭SSE连接，并清理相关缓存或标记学习完成。
     *
     * @param userId 用户唯一标识符
     * @param type   连接类型标识，用于区分不同的业务场景
     */
    @Override
    public void closeSse(Integer userId, Integer type) {
        // 移除指定用户的流式连接
        llmSseService.removeStream(userId, type);

        // 如果是类型2，则标记该用户的学习已完成
        if (type.equals(2)) {
            userStudyStatusCacheService.finishStudy(userId);
        }
    }

    /**
     * 关闭用户的阅读SSE连接并取消可能存在的倒计时任务。
     *
     * @param userId 用户唯一标识符
     */
    @Override
    public void closeReadSse(Integer userId) {
        // 取消正在进行的阅读倒计时
        if (readCountdownManagerService.hasCountdown(userId)) {
            readCountdownManagerService.cancelCountdown(userId);
        }
        // 标记用户阅读完成
        UserStatusCacheUtils.deleteReading(userId);
    }

    /**
     * 开始阅读倒计时流程，若已有推送记录则继续智能阅读，否则注册新的倒计时任务。
     *
     * @param userId 用户唯一标识符
     */
    @Override
    public void startReadCountDown(Integer userId) {
        try {// 获取用户绑定的设备信息
            String device = userDeviceServiceApi.getDeviceByUserId(userId);

            // 查询当前阅读状态
            ReadingStatusDTO status = UserStatusCacheUtils.getReading(userId);

            // 判断是否有过推送阅读结束记录 有的话 延时2秒推送继续阅读指令
            if (readEndService.hasPushedAndClear(userId)) {
                Thread.sleep(2000);
                // 发送继续智能阅读或宝箱的消息
                imMqProducer.sendMsgAsync(
                        ImMqTopicEnum.LARGE_MODULE,
                        LargeModuleTopTagEnum.CONTINUE_SMART_READING_OR_TREASURE_CHESTS.getTag(),
                        device,
                        JSONUtil.toJsonStr(new IntegerDTO(status.getType()))
                );
                log.info("UserId : {} 阅读提问结束 后无回答 继续阅读", userId);
            } else {
                log.info("UserId : {} 阅读提问结束 开始倒计时", userId);
                // 注册新倒计时任务或启动已有任务
                if (readCountdownManagerService.hasCountdown(userId)) {
                    readCountdownManagerService.startCountdown(userId);
                } else {
                    readCountdownManagerService.registerCountdown(userId, 5, () -> {
                        readEndService.pushReadEnd(userId, device);
                    });
                }
            }
        } catch (Exception e) {
            log.info("阅读 定时器 异常 :{}", e.getMessage());
        }
    }

    @Override
    public void dailyWelcome(String device) {
        log.info("Device：{} 开机问候",device);
        dailyWelcomesService.dailyWelcome(device);
    }


}
