package com.fs.app.task;

import com.fs.app.taskService.SopLogsTaskService;
import com.fs.common.core.redis.RedisCache;
import com.fs.course.mapper.FsCourseWatchLogMapper;
import com.fs.course.mapper.FsUserCourseVideoMapper;
import com.fs.course.service.IFsCourseLinkService;
import com.fs.course.service.IFsCourseWatchLogService;
import com.fs.sop.mapper.QwSopLogsMapper;
import com.fs.system.service.ISysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicBoolean;

@Component
@Slf4j
public class CourseWatchLogScheduler {
    private final AtomicBoolean isRunning1 = new AtomicBoolean(false);

    private final AtomicBoolean isRunning2 = new AtomicBoolean(false);

    private final AtomicBoolean isRunning3 = new AtomicBoolean(false);

    private final AtomicBoolean isRunning4 = new AtomicBoolean(false);

    @Autowired
    private FsCourseWatchLogMapper courseWatchLogMapper;

    @Autowired
    private QwSopLogsMapper qwSopLogsMapper;

    @Autowired
    RedisCache redisCache;

    @Autowired
    private FsUserCourseVideoMapper courseVideoMapper;

    @Autowired
    private ISysConfigService configService;

    @Autowired
    private IFsCourseWatchLogService courseWatchLogService;

    @Autowired
    private SopLogsTaskService sopLogsTaskService;

//    // 定时任务批量更新到数据库
//    @Scheduled(fixedRate = 60000) // 每分钟执行一次
//    public void scheduleBatchUpdateToDatabase() {
//        courseWatchLogService.scheduleBatchUpdateToDatabase();
//    }



    /**
     * 检查看课状态
     */
    @Scheduled(fixedRate = 60000) // 每分钟执行一次
    public void checkWatchStatus() {
        // 尝试设置标志为 true，表示任务开始执行
        if (!isRunning1.compareAndSet(false, true)) {
            log.warn("检查看课中任务执行 - 上一个任务尚未完成，跳过此次执行");
            return;
        }
        try {
            log.info("检查看课中任务执行>>>>>>>>>>>>");
            courseWatchLogService.scheduleBatchUpdateToDatabase();
            courseWatchLogService.scheduleBatchUpdateToDatabaseIsOpen();
            courseWatchLogService.checkWatchStatus();
            log.info("检查看课中任务执行完成>>>>>>>>>>>>");
        }catch (Exception e) {
            log.error("检查看课中任务执行完成 - 定时任务执行失败", e);
        } finally {
            // 重置标志为 false，表示任务已完成
            isRunning1.set(false);
        }

    }



    /**
     * 创建完课消息
     */
    @Scheduled(fixedRate = 300000) // 每五分钟执行一次
    public void createCourseFinishMsg() {
        // 尝试设置标志为 true，表示任务开始执行
        if (!isRunning3.compareAndSet(false, true)) {
            log.warn("创建完课消息 - 上一个任务尚未完成，跳过此次执行");
            return;
        }

        try {
            log.info("创建完课消息 - 定时任务开始");
            sopLogsTaskService.createCourseFinishMsg();
            log.info("创建完课消息 - 定时任务成功完成");
        } catch (Exception e) {
            log.error("创建完课消息 - 定时任务执行失败", e);
        } finally {
            // 重置标志为 false，表示任务已完成
            isRunning3.set(false);
        }

    }

    @Autowired
    private IFsCourseLinkService courseLinkService;


    // 定时任务，每天0点执行

    /**
     * 每天删除过期短链
     */
    @Scheduled(cron = "0 0 0 * * ?")  // 0点0分0秒执行
    public void delCourseExpireLink() {
        try {
            log.info("删除过期短链 - 定时任务开始");
            courseLinkService.delCourseExpireLink();
            log.info("删除过期短链 - 定时任务成功完成");
        } catch (Exception e) {
            log.error("删除过期短链 - 定时任务执行失败", e);
        }

    }

    @Scheduled(fixedRate = 30000) // 每分钟执行一次
    public void checkFsUserWatchStatus() {
        // 尝试设置标志为 true，表示任务开始执行
        if (!isRunning4.compareAndSet(false, true)) {
            log.warn("WXH5-检查会员看课中任务执行 - 上一个任务尚未完成，跳过此次执行");
            return;
        }
        try {
            log.info("WXH5-检查会员看课中任务执行>>>>>>>>>>>>");
            courseWatchLogService.scheduleUpdateDurationToDatabase();
            courseWatchLogService.checkFsUserWatchStatus();
            log.info("WXH5-检查会员看课中任务执行完成>>>>>>>>>>>>");
        }catch (Exception e) {
            log.error("WXH5-检查会员看课中任务执行完成 - 定时任务执行失败", e);
        } finally {
            // 重置标志为 false，表示任务已完成
            isRunning4.set(false);
        }

    }





}
