package com.zsElectric.boot.business.quartz;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.zsElectric.boot.business.model.entity.Coupon;
import com.zsElectric.boot.business.service.CouponService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 优惠券过期定时任务
 * 定时检查并处理过期的优惠券
 *
 * @author zsElectric
 * @since 2025-12-19
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class CouponExpireJob {

    private final CouponService couponService;

    /**
     * 每天凌晨2点执行一次
     * 检查并处理过期的优惠券
     */
    @Scheduled(cron = "0 0 2 * * ?")
    public void processExpiredCoupons() {
        log.info("开始执行优惠券过期处理任务");

        try {
            // 查询所有未使用且已过期的优惠券
            List<Coupon> expiredCoupons = couponService.list(
                    Wrappers.lambdaQuery(Coupon.class)
                            .eq(Coupon::getStatus, 1) // 未使用状态
                            .lt(Coupon::getExpireTime, LocalDateTime.now()) // 已过期
            );

            int successCount = 0;
            for (Coupon coupon : expiredCoupons) {
                try {
                    // 更新优惠券状态为已过期
                    coupon.setStatus(3); // 已过期
                    if (couponService.updateById(coupon)) {
                        successCount++;
                    }
                } catch (Exception e) {
                    log.error("处理优惠券[ID:{}]过期状态失败", coupon.getId(), e);
                }
            }

            log.info("优惠券过期处理任务执行完成，共处理{}张过期优惠券", successCount);
        } catch (Exception e) {
            log.error("执行优惠券过期处理任务失败", e);
        }
    }
}