package com.gameplatform.server.task;

import com.gameplatform.server.mapper.agent.LinkTaskMapper;
import com.gameplatform.server.model.entity.agent.LinkTask;
import com.gameplatform.server.service.link.LinkStatusService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * USING状态链接检查定时任务
 * 每30秒检测状态为USING的链接，调用checkAndHandleLoginStatus函数
 */
@Component
@Slf4j
public class UsingLinkCheckTask {

    private final LinkTaskMapper linkTaskMapper;
    private final LinkStatusService linkStatusService;

    public UsingLinkCheckTask(LinkTaskMapper linkTaskMapper, LinkStatusService linkStatusService) {
        this.linkTaskMapper = linkTaskMapper;
        this.linkStatusService = linkStatusService;
    }

    /**
     * 每30秒检测一次USING状态的链接
     */
//    @Scheduled(fixedRate = 30000) // 每30秒执行一次
    public void checkUsingLinksAndHandleLoginStatus() {
        log.debug("开始定时检查USING状态的链接");
        
        try {
            // 1. 查询所有USING状态的链接任务
            List<LinkTask> usingTasks = linkTaskMapper.findByStatus("USING");
            
            if (usingTasks.isEmpty()) {
                log.debug("当前没有USING状态的链接");
                return;
            }
            
            log.debug("发现 {} 个USING状态的链接", usingTasks.size());
            
            // 2. 对每个USING状态的链接调用checkAndHandleLoginStatus
            for (LinkTask linkTask : usingTasks) {
                try {
                    log.debug("检查链接 {} (设备: {}) 的登录状态", linkTask.getCodeNo(), linkTask.getMachineId());
                    
                    // 调用checkAndHandleLoginStatus函数 - 这里需要使用私有方法的逻辑
                    if (linkTask.getMachineId() != null) {
                        checkAndHandleLoginStatus(linkTask);
                    } else {
                        log.warn("链接 {} 没有关联设备，跳过检查", linkTask.getCodeNo());
                    }
                    
                } catch (Exception e) {
                    log.error("检查链接 {} 登录状态时发生异常: {}", linkTask.getCodeNo(), e.getMessage());
                    // 继续检查下一个链接，不因为一个链接出错而中断整个流程
                }
            }
            
        } catch (Exception e) {
            log.error("定时检查USING状态链接时发生异常", e);
        }
        
        log.debug("定时检查USING状态链接完成");
    }

    /**
     * 检查并处理登录状态
     * 复制LinkStatusService中checkAndHandleLoginStatus的逻辑
     */
    private void checkAndHandleLoginStatus(LinkTask linkTask) {
        try {
            String deviceId = linkTask.getMachineId();
            if (deviceId == null) {
                log.warn("无法获取设备编号: codeNo={}", linkTask.getCodeNo());
                return;
            }

            log.debug("调用轮询上号接口检查链接 {} 的登录状态", linkTask.getCodeNo());
            
            // 调用LinkStatusService的pollLogin方法来处理登录状态检查
            linkStatusService.pollLogin(linkTask.getCodeNo())
                .subscribe(
                    response -> {
                        if (response.isSuccess()) {
                            log.info("定时检查发现链接 {} 已成功登录，状态已更新", linkTask.getCodeNo());
                        } else {
                            log.debug("链接 {} 尚未登录，状态: {}", linkTask.getCodeNo(), response.getStatus());
                        }
                    },
                    error -> {
                        log.warn("检查链接 {} 登录状态失败: {}", linkTask.getCodeNo(), error.getMessage());
                    }
                );
                
        } catch (Exception e) {
            log.error("处理链接 {} 登录状态检查时发生异常: {}", linkTask.getCodeNo(), e.getMessage());
        }
    }
}