package com.gxwebsoft.shop.task;

import com.gxwebsoft.shop.service.CouponStatusService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 优惠券过期处理定时任务
 *
 * @author WebSoft
 * @since 2025-01-15
 */
@Slf4j
@Component
public class CouponExpireTask {

    @Autowired
    private CouponStatusService couponStatusService;

    @Value("${spring.profiles.active:dev}")
    private String activeProfile;

    /**
     * 每天凌晨2点执行过期优惠券处理
     * 生产环境：每天凌晨2点执行
     * 开发环境：每10分钟执行一次（用于测试）
     */
    @Scheduled(cron = "${coupon.expire.cron:0 0 2 * * ?}")
    public void processExpiredCoupons() {
        log.info("开始执行过期优惠券处理任务...");
        
        try {
            long startTime = System.currentTimeMillis();
            
            // 批量更新过期优惠券状态
            int updatedCount = couponStatusService.updateExpiredCoupons();
            
            long endTime = System.currentTimeMillis();
            long duration = endTime - startTime;
            
            log.info("过期优惠券处理任务完成，更新数量: {}，耗时: {}ms", updatedCount, duration);
            
            // 如果是开发环境，输出更详细的日志
            if ("dev".equals(activeProfile)) {
                log.debug("开发环境 - 过期优惠券处理详情: 更新{}张优惠券", updatedCount);
            }
            
        } catch (Exception e) {
            log.error("过期优惠券处理任务执行失败", e);
        }
    }

    /**
     * 每小时执行一次优惠券状态检查（可选）
     * 用于及时发现和处理刚过期的优惠券
     */
    @Scheduled(cron = "0 0 * * * ?")
    public void hourlyExpiredCouponsCheck() {
        // 只在生产环境执行
        if (!"prod".equals(activeProfile)) {
            return;
        }
        
        log.debug("执行每小时优惠券状态检查...");
        
        try {
            int updatedCount = couponStatusService.updateExpiredCoupons();
            if (updatedCount > 0) {
                log.info("每小时检查发现并更新了 {} 张过期优惠券", updatedCount);
            }
        } catch (Exception e) {
            log.error("每小时优惠券状态检查失败", e);
        }
    }

    /**
     * 手动触发过期优惠券处理（用于测试）
     */
    public void manualProcessExpiredCoupons() {
        log.info("手动触发过期优惠券处理任务...");
        processExpiredCoupons();
    }
}
