package shop.alien.job.store;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import shop.alien.entity.store.LifeCoupon;
import shop.alien.entity.store.LifeUserOrder;
import shop.alien.mapper.LifeCouponMapper;
import shop.alien.mapper.LifeUserOrderMapper;
import shop.alien.util.common.AlipayTradeRefund;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 优惠券定时任务
 *
 * @author ssk
 * @version 1.0
 * @date 2025/8/6 14:19
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class LifeCouponJob {

    private final LifeCouponMapper lifeCouponMapper;

    private final LifeUserOrderMapper lifeUserOrderMapper;

    private final AlipayTradeRefund alipayTradeRefund;

    /**
     * 该方法用于定时更新生活优惠券（LifeCoupon）的状态
     */
    @XxlJob("quanStatusUpdateTask")
    public void quanStatusUpdateTask() {
        //执行修改代金券状态
        System.out.println("执行修改代金券状态 ===>");
        // 获取当前时间
        Date now = new Date();
        // 创建一个 Calendar 实例，用于对日期进行操作
        Calendar calendar = Calendar.getInstance();
        // 将 Calendar 的时间设置为当前时间
        calendar.setTime(now);
        // 将 Calendar 的小时设置为 0
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        // 将 Calendar 的分钟设置为 0
        calendar.set(Calendar.MINUTE, 0);
        // 将 Calendar 的秒设置为 0
        calendar.set(Calendar.SECOND, 0);
        // 将 Calendar 的毫秒设置为 0
        calendar.set(Calendar.MILLISECOND, 0);
        // 获取处理后的时间，即当前日期的零点
        now = calendar.getTime();

        // 创建一个 LambdaUpdateWrapper 用于查询生活优惠券，这里实际上主要用于查询操作
        LambdaUpdateWrapper<LifeCoupon> selectWrapper = new LambdaUpdateWrapper<>();
        // 创建一个集合，用于存储要查询的优惠券状态值
        List<Integer> ids = new ArrayList<>();
        // 待审核
        ids.add(0);
        // 进行中
        ids.add(1);
        // 已暂停
        ids.add(2);
        // 设置查询条件，查询状态为 0、1 或 2 的生活优惠券
        selectWrapper.in(LifeCoupon::getStatus, ids);
        // 调用 lifeCouponMapper 的 selectList 方法，根据上述条件查询生活优惠券列表
        List<LifeCoupon> jinxingzhongList = lifeCouponMapper.selectList(selectWrapper);
        // 判断查询结果列表是否不为空
        if (!jinxingzhongList.isEmpty()) {
            // 遍历查询到的生活优惠券列表
            for (LifeCoupon quan : jinxingzhongList) {
                // 获取当前优惠券的结束日期
                Date endTime = quan.getEndDate();
                // 比较当前日期（零点）和优惠券的结束日期，如果当前日期大于结束日期  将状态变成已结束
                if (now.compareTo(endTime) > 0) {
                    // 创建一个 LambdaUpdateWrapper 用于更新生活优惠券的状态
                    LambdaUpdateWrapper<LifeCoupon> updateWrapper = new LambdaUpdateWrapper<>();
                    // 设置更新条件，根据优惠券的 ID 进行更新
                    updateWrapper.eq(LifeCoupon::getId, quan.getId())
                            // 设置要更新的字段，将优惠券的状态更新为 3
                            .set(LifeCoupon::getStatus, 3);
                    // 调用 lifeCouponMapper 的 update 方法，根据上述条件更新优惠券的状态
                    lifeCouponMapper.update(null, updateWrapper);
                }
            }
        }

        // 创建另一个 LambdaUpdateWrapper 用于查询状态为 0 的生活优惠券
        LambdaUpdateWrapper<LifeCoupon> selectWrapper2 = new LambdaUpdateWrapper<>();
        // 设置查询条件，查询状态为 0 的生活优惠券
        selectWrapper2.eq(LifeCoupon::getStatus, 0);
        // 调用 lifeCouponMapper 的 selectList 方法，根据上述条件查询生活优惠券列表
        List<LifeCoupon> weikaishiList = lifeCouponMapper.selectList(selectWrapper2);
        // 判断查询结果列表是否不为空
        if (!weikaishiList.isEmpty()) {
            // 遍历查询到的生活优惠券列表
            for (LifeCoupon quan : weikaishiList) {
                // 获取当前优惠券的开始日期
                Date startTime = quan.getStartDate();
                // 获取当前优惠券的结束日期
                Date endTime = quan.getEndDate();
                // 判断当前日期（零点）是否在优惠券的开始日期和结束日期之间  将待使用变成进行中
                if (now.compareTo(startTime) >= 0 && now.compareTo(endTime) <= 0) {
                    // 创建一个 LambdaUpdateWrapper 用于更新生活优惠券的状态
                    LambdaUpdateWrapper<LifeCoupon> updateWrapper = new LambdaUpdateWrapper<>();
                    // 设置更新条件，根据优惠券的 ID 进行更新
                    updateWrapper.eq(LifeCoupon::getId, quan.getId())
                            // 设置要更新的字段，将优惠券的状态更新为 1
                            .set(LifeCoupon::getStatus, 1);
                    // 调用 lifeCouponMapper 的 update 方法，根据上述条件更新优惠券的状态
                    lifeCouponMapper.update(null, updateWrapper);
                }
            }
        }
    }

    /**
     * 过期自动退
     */
    @XxlJob("orderStatusUpdateTask")
    public void orderStatusUpdateTask() {
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        now = calendar.getTime();
        LambdaUpdateWrapper<LifeUserOrder> selectWrapper = new LambdaUpdateWrapper<>();
        List<Integer> ids = new ArrayList<>();
        ids.add(0);
        ids.add(3);
        selectWrapper.in(LifeUserOrder::getStatus, ids);
        List<LifeUserOrder> orderList = lifeUserOrderMapper.selectList(selectWrapper);
        if (!orderList.isEmpty()) {
            for (LifeUserOrder order : orderList) {
                Date payTime = order.getPayTime();
                LifeCoupon quan = lifeCouponMapper.selectById(order.getQuanId());
                calendar.setTime(payTime);
                calendar.add(Calendar.DAY_OF_MONTH, quan.getExpirationDate());
                Date guoqiDate = calendar.getTime();
                Date endDate = quan.getEndDate();
                if (now.compareTo(guoqiDate) > 0 || now.compareTo(endDate) > 0) {
                    String result = alipayTradeRefund.processRefund(order.getOrderNo(), order.getFinalPrice(), "过期自动退");
                    if (result.equals("调用成功")) {
                        LambdaUpdateWrapper<LifeUserOrder> updateWrapper = new LambdaUpdateWrapper<>();
                        updateWrapper.eq(LifeUserOrder::getId, order.getId()).set(LifeUserOrder::getStatus, 4).set(LifeUserOrder::getRefundTime, new Date());
                        lifeUserOrderMapper.update(null, updateWrapper);
                    }
                }
            }
        }
    }


}
