/*
 * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
 *
 * https://www.gz-yami.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

package com.yami.shop.coupon.platform.task;

import cn.hutool.core.date.DateUtil;
import com.yami.shop.common.util.CacheManagerUtil;
import com.yami.shop.coupon.comment.dao.CouponMapper;
import com.yami.shop.coupon.comment.service.CouponService;
import com.yami.shop.coupon.comment.service.CouponUserService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Component;

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

//0 0 0/1 * * ?
@Slf4j
@Component("couponTask")
@AllArgsConstructor
public class CouponTask {

    private final CouponUserService couponUserService;
    private final CouponService couponService;
    private final CouponMapper couponMapper;
    private final CacheManagerUtil cacheManagerUtil;


    /**
     * 删除用户失效30天以上的优惠券
     */
    public void deleteCouponUser() {
        log.info("删除用户失效180天以上的优惠券");
        // 删除用户失效半年以上的优惠券 参考京东
        couponUserService.deleteUnValidTimeCoupons(DateUtil.offsetDay(new Date(), -180));
    }

    /**
     * 改变用户优惠券的状态(设为失效状态)
     */
    public void changeCouponUser() {
        Date now = new Date();
        log.info("设置用户的过期优惠券为失效状态");
        // 设置用户的过期优惠券为失效状态
        couponUserService.updateStatusByTime(now);
    }

    /**
     * 改变店铺优惠券的状态(设为过期状态)
     */
    public void changeCoupon() {
        Date now = new Date();
        log.info("设置店铺的过期优惠券为过期状态");
        log.info("改变店铺库存为0优惠券的状态(设为取消投放状态)");
        // 查询需要更新的店铺id列表
        List<Long> shopIds = couponMapper.listOverdueStatusShopIds(now);
        // 取消投放
        couponService.changeCoupon(now);
        //清除缓存
        if (CollectionUtils.isNotEmpty(shopIds)) {
            for (Long shopId : shopIds) {
                cacheManagerUtil.evictCache("couponAndCouponProds", String.valueOf(shopId));
            }
        }
    }

    /**
     * 投放优惠券
     */
    public void putOnCoupon() {
        Date now = new Date();
        log.info("投放优惠券");
        // 投放优惠券
        couponService.putonCoupon(now);
    }
}
