package com.rj.scheduler;

import com.rj.service.biz.ICpaBrandScoreStatisticsService;
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.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * 经销商品牌得分统计定时任务调度器
 * 按不同周期执行统计任务，将结果保存到 cpa_brandcore_statistics 表
 * 
 * Author: 李中华  wx: spllzh  email(qq): 28668817@qq.com
 * Date: 2025/1/15
 */
@Slf4j
@Component
public class CpaBrandCoreScheduler {

    @Autowired
    private ICpaBrandScoreStatisticsService cpaBrandScoreStatisticsService;

    /**
     * 每天凌晨3点执行日统计任务
     * 统计昨天的数据
     */
//    @Scheduled(cron = "0 0 3 * * ?")
    public void generateDailyStatistics() {
        try {
            log.info("开始执行经销商品牌得分日统计任务...");
            
            LocalDate yesterday = LocalDate.now().minusDays(1);
            int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("daily", yesterday, yesterday, "systemScheduler");
            
            log.info("经销商品牌得分日统计任务执行完成，统计日期：{}，生成记录数：{}", 
                    yesterday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), count);
        } catch (Exception e) {
            log.error("经销商品牌得分日统计任务执行失败", e);
        }
    }

    /**
     * 每周一凌晨4点执行周统计任务
     * 统计上周的数据（服务层自动计算上周时间范围）
     */
    @Scheduled(cron = "0 0 4 * * MON")
    public void generateWeeklyStatistics() {
        try {
            log.info("开始执行经销商品牌得分周统计任务...");
            
            // 周统计的时间范围由服务层自动计算，这里传递null即可
            int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("weekly", null, null, "systemCpaBrandCoreScheduler");
            
            log.info("经销商品牌得分周统计任务执行完成，生成记录数：{}", count);
        } catch (Exception e) {
            log.error("经销商品牌得分周统计任务执行失败", e);
        }
    }

    /**
     * 每月1号凌晨5点执行月统计任务
     * 统计上个月的数据（服务层自动计算上月时间范围）
     */
    @Scheduled(cron = "0 0 5 1 * ?")
    public void generateMonthlyStatistics() {
        try {
            log.info("开始执行经销商品牌得分月统计任务...");
            
            // 月统计的时间范围由服务层自动计算，这里传递null即可
            int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("monthly", null, null, "systemCpaBrandCoreScheduler");
            
            log.info("经销商品牌得分月统计任务执行完成，生成记录数：{}", count);
        } catch (Exception e) {
            log.error("经销商品牌得分月统计任务执行失败", e);
        }
    }

    /**
     * 每天凌晨6点执行总计统计任务
     * 统计所有历史数据
     */
    @Scheduled(cron = "0 0 6 * * ?")
    public void generateTotalStatistics() {
        try {
            log.info("开始执行经销商品牌得分总计统计任务...");
            
            int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics("total", null, null, "systemCpaBrandCoreScheduler");
            
            log.info("经销商品牌得分总计统计任务执行完成，生成记录数：{}", count);
        } catch (Exception e) {
            log.error("经销商品牌得分总计统计任务执行失败", e);
        }
    }

    /**
     * 手动触发统计任务（用于测试或补录数据）
     * 
     * @param date 要统计的日期
     * @param statisticsType 统计类型
     * @return 生成的记录数
     */
    public int manualGenerateStatistics(LocalDate date, String statisticsType) {
        try {
            log.info("手动执行经销商品牌得分统计任务，统计日期：{}，统计类型：{}", date, statisticsType);
            int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics(statisticsType, date, date, "manualCpaBrandCoreScheduler");
            log.info("手动经销商品牌得分统计任务执行完成，统计日期：{}，统计类型：{}，生成记录数：{}", 
                    date, statisticsType, count);
            return count;
        } catch (Exception e) {
            log.error("手动经销商品牌得分统计任务执行失败，统计日期：{}，统计类型：{}", date, statisticsType, e);
            throw e;
        }
    }

    /**
     * 手动触发日期范围统计任务
     * 
     * @param startDate 开始日期（对于weekly/monthly类型，此参数将被忽略，服务层自动计算）
     * @param endDate 结束日期（对于weekly/monthly类型，此参数将被忽略，服务层自动计算）
     * @param statisticsType 统计类型
     * @return 生成的记录数
     */
    public int manualGenerateStatisticsByRange(LocalDate startDate, LocalDate endDate, String statisticsType) {
        try {
            if ("weekly".equals(statisticsType) || "monthly".equals(statisticsType)) {
                log.info("手动执行经销商品牌得分统计任务，统计类型：{}（时间范围由服务层自动计算）", statisticsType);
            } else {
                log.info("手动执行经销商品牌得分统计任务，统计范围：{} - {}，统计类型：{}", startDate, endDate, statisticsType);
            }
            
            int count = cpaBrandScoreStatisticsService.generateAndSaveStatistics(statisticsType, startDate, endDate, "manual");
            
            if ("weekly".equals(statisticsType) || "monthly".equals(statisticsType)) {
                log.info("手动经销商品牌得分统计任务执行完成，统计类型：{}，生成记录数：{}", statisticsType, count);
            } else {
                log.info("手动经销商品牌得分统计任务执行完成，统计范围：{} - {}，统计类型：{}，生成记录数：{}", 
                        startDate, endDate, statisticsType, count);
            }
            return count;
        } catch (Exception e) {
            log.error("手动经销商品牌得分统计任务执行失败，统计范围：{} - {}，统计类型：{}", startDate, endDate, statisticsType, e);
            throw e;
        }
    }
}