package org.dromara.mall.promotion.job;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.mall.promotion.domain.MallSeckill;
import org.dromara.mall.promotion.mapper.MallSeckillMapper;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * 营销活动定时任务
 *
 * @author pengles
 */
@Slf4j
@RequiredArgsConstructor
@Component
public class MallPromotionJob {

    private final MallSeckillMapper seckillMapper;

    /**
     * 秒杀活动状态更新任务
     * 每5分钟执行一次
     * - 扫描即将开始的活动（start_time <= 当前时间 且 status=1禁用），自动启用（status=0）
     * - 扫描已结束的活动（end_time < 当前时间 且 status=0启用），自动禁用（status=1）
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void updateSeckillStatus() {
        Date now = new Date();
        int updatedCount = 0;

        // 扫描即将开始的活动（start_time <= 当前时间 且 status=1禁用），自动启用
        LambdaQueryWrapper<MallSeckill> startWrapper = new LambdaQueryWrapper<>();
        startWrapper.le(MallSeckill::getStartTime, now);
        startWrapper.gt(MallSeckill::getEndTime, now); // 还未结束
        startWrapper.eq(MallSeckill::getStatus, 1); // 当前状态为禁用
        List<MallSeckill> toStart = seckillMapper.selectList(startWrapper);

        if (!toStart.isEmpty()) {
            for (MallSeckill seckill : toStart) {
                LambdaUpdateWrapper<MallSeckill> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.eq(MallSeckill::getId, seckill.getId());
                updateWrapper.set(MallSeckill::getStatus, 0); // 启用
                seckillMapper.update(null, updateWrapper);
                updatedCount++;
                log.info("秒杀活动自动启用: id={}, promotionId={}", seckill.getId(), seckill.getPromotionId());
            }
        }

        // 扫描已结束的活动（end_time < 当前时间 且 status=0启用），自动禁用
        LambdaQueryWrapper<MallSeckill> endWrapper = new LambdaQueryWrapper<>();
        endWrapper.lt(MallSeckill::getEndTime, now);
        endWrapper.eq(MallSeckill::getStatus, 0); // 当前状态为启用
        List<MallSeckill> toEnd = seckillMapper.selectList(endWrapper);

        if (!toEnd.isEmpty()) {
            for (MallSeckill seckill : toEnd) {
                LambdaUpdateWrapper<MallSeckill> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.eq(MallSeckill::getId, seckill.getId());
                updateWrapper.set(MallSeckill::getStatus, 1); // 禁用
                seckillMapper.update(null, updateWrapper);
                updatedCount++;
                log.info("秒杀活动自动禁用: id={}, promotionId={}", seckill.getId(), seckill.getPromotionId());
            }
        }

        if (updatedCount > 0) {
            log.info("秒杀活动状态更新完成，共更新{}个活动", updatedCount);
        }
    }

}
