package com.iotechn.unimall.app.quartz;

import com.iotechn.unimall.data.component.LockComponent;
import com.iotechn.unimall.data.mapper.AdminMapper;
import com.iotechn.unimall.data.mapper.UserMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
/**
 * Created by rize on 2019/7/21.
 */
@Component
@EnableScheduling
public class CheckQuartz {

    private static  Logger logger = LoggerFactory.getLogger(CheckQuartz.class);
    private static  String TASK_STATUS_LOCK = "TASK_STATUS_QUARTZ_LOCK";
    private static  String GROUP_SHOP_START_LOCK = "GROUP_SHOP_START_LOCK";
    private static  String GROUP_SHOP_END_LOCK = "GROUP_SHOP_END_LOCK";
    private static  String GROUP_SHOP_LOCK_LOCK = "GROUP_SHOP_LOCK_LOCK";

    @Autowired
    private LockComponent lockComponent;
    @Autowired
    private TransactionTemplate transactionTemplate;
    @Autowired
    private AdminMapper adminMapper;
    @Autowired
    private UserMapper userMapper;
    @Value("${com.iotechn.unimall.env}")
    private String ENV;
    /**
     * 任务检测定时轮询
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void checkOrderStatus() {
//        if (lockComponent.tryLock(TASK_STATUS_LOCK, 15)) {
//            try {
//                Date now = new Date();
//                Calendar rightNow = Calendar.getInstance();
//                rightNow.setTime(now);
//                rightNow.add(Calendar.MINUTE, -5);
//                Date sendTime =rightNow.getTime();
//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                Wrapper wrapper = new EntityWrapper();
//                wrapper.eq("task_status", TaskStatusType.STATUS1.getCode());
//                wrapper.eq("looked",0);
//                wrapper.le("send_time","DATE_FORMAT('"+sdf.format(sendTime)+"', '%Y-%m-%d %H:%i:%s')");
//                List<TaskDO> list = taskMapper.selectList(wrapper);
//                for(TaskDO tmp : list){
//                    if(ENV.equals("3") && !tmp.getTaskType().equals("入库任务")){
//                        UserDO userDO = userMapper.selectById(tmp.getUserId());
//                        NoticeUtil.notice(tmp.getTaskType() + "待完成",userDO.getPhone());
//                    }
//                }
//                wrapper = new EntityWrapper();
//                wrapper.eq("status", CarStatusType.STATUS10.getCode());
//                wrapper.eq("looked",0);
//                wrapper.le("gmt_update","DATE_FORMAT('"+sdf.format(sendTime)+"', '%Y-%m-%d %H:%i:%s')");
//                if(carMapper.selectCount(wrapper) > 0){
//                    if(ENV.equals("3")){
//                        wrapper = new EntityWrapper();
//                        wrapper.like("role_ids", "16");
//                        List<AdminDO> adminDOS = adminMapper.selectList(wrapper);
//                        for(AdminDO tmp : adminDOS){
//                            NoticeUtil.notice("承运信息待审核",tmp.getPhone());
//                        }
//                    }
//                }
//                wrapper = new EntityWrapper();
//                wrapper.eq("status", CarStatusType.STATUS25.getCode());
//                wrapper.le("gmt_update","DATE_FORMAT('"+sdf.format(sendTime)+"', '%Y-%m-%d %H:%i:%s')");
//                List<CarDO> carDOS = carMapper.selectList(wrapper);
//                for(CarDO tmp : carDOS){
//                    if(ENV.equals("3")){
//                        if(tmp.getNoticeCount() <= 10){
//                            NoticeUtil.notice("运输合同待签订",tmp.getDriverPhone());
//                            tmp.setNoticeCount(tmp.getNoticeCount()+1);
//                            carMapper.updateById(tmp);
//                        }
//                    }
//                }
//                logger.info("【任务检测定时轮询】" + sdf.format(now));
//
//            } catch (Exception e) {
//                logger.error("[任务检测定时轮询] 异常", e);
//            } finally {
//                lockComponent.release(TASK_STATUS_LOCK);
//            }
//        }
    }
//
//    /**
//     * 设定60s跑一次,团购商品到期自动退款,改变状态
//     */
//    @Scheduled(cron = "10 * * * * ?")
//    @Transactional(rollbackFor = Exception.class)
//    public void groupShopStart() throws Exception {
//        if (lockComponent.tryLock(GROUP_SHOP_START_LOCK, 30)) {
//            try {
//                Date now = new Date();
//                /**
//                 * 1. 激活 团购时间开始的活动商品
//                 */
//                // 1.1 查询在活动期间,且冻结状态的团购商品
//                List<GroupShopDO> groupShopDOList = groupShopMapper.selectList(new EntityWrapper<GroupShopDO>()
//                        .le("gmt_start", now).and()
//                        .gt("gmt_end", now).and()
//                        .eq("status", StatusType.LOCK.getCode()));
//                if (groupShopDOList != null) {
//                    for (GroupShopDO groupShopDO : groupShopDOList) {
//                        groupShopDO.setGmtUpdate(now);
//                        groupShopDO.setStatus(StatusType.ACTIVE.getCode());
//                        SpuDO spuDO = spuMapper.selectById(groupShopDO.getSpuId());
//                        if (spuDO == null) {
//                            throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_NO_EXITS);
//                        }
//
//                        // 1.2 检查商品是不是已经下架
//                        if (spuDO.getStatus().equals(StatusType.ACTIVE.getCode())) {
//                            if (groupShopMapper.updateById(groupShopDO) <= 0) {
//                                throw new AdminServiceException(ExceptionDefinition.GROUP_SHOP_SPU_UPDATE_SQL_QUERY_ERROR);
//                            }
//                        }
//                    }
//                }
//            } catch (Exception e) {
//                logger.error("[团购开始 定时任务] 异常", e);
//                throw e;
//            } finally {
//                lockComponent.release(GROUP_SHOP_START_LOCK);
//            }
//        }
//
//
//    }
//
//    @Scheduled(cron = "10 * * * * ?")
//    @Transactional(rollbackFor = Exception.class)
//    public void groupShopEnd() throws Exception {
//        if (lockComponent.tryLock(GROUP_SHOP_END_LOCK, 30)) {
//            try {
//                Date now = new Date();
//                /**
//                 * 2. 冻结 团购时间结束的活动商品,并根据对应情况处理订单
//                 */
//                Wrapper<GroupShopDO> wrapper = new EntityWrapper<GroupShopDO>()
//                        .eq("status", StatusType.ACTIVE.getCode())
//                        .andNew()
//                        .gt("gmt_start", now)
//                        .or()
//                        .le("gmt_end", now);
//                List<GroupShopDO> lockGroupShopDOList = groupShopMapper.selectList(wrapper);
//                // 2.2 将团购订单的状态转为对应的退款或待出库状态,对未达人数且自动退款的商品订单进行退款,对达到人数或不自动退款的商品订单转换状态
//                if (!CollectionUtils.isEmpty(lockGroupShopDOList)) {
//                    // 2.1 对过期团购商品冻结.
//                    GroupShopDO lockGroupShopDO = new GroupShopDO();
//                    lockGroupShopDO.setStatus(StatusType.LOCK.getCode());
//                    lockGroupShopDO.setGmtUpdate(now);
//                    groupShopMapper.update(lockGroupShopDO, wrapper);
//                    for (GroupShopDO groupShopDO : lockGroupShopDOList) {
//                        // 2.2.1查询团购订单中数据
//                        List<OrderDO> lockOrderList = orderMapper.selectList(
//                                new EntityWrapper<OrderDO>()
//                                        .eq("group_shop_id", groupShopDO.getId())
//                                        .eq("status", OrderStatusType.GROUP_SHOP_WAIT.getCode()));
//
//                        if (CollectionUtils.isEmpty(lockOrderList)) {
//                            continue;
//                        }
//
//                        if (groupShopDO.getAutomaticRefund() == GroupShopAutomaticRefundType.YES.getCode() && groupShopDO.getAlreadyBuyNumber().compareTo(groupShopDO.getMinimumNumber()) < 0) {
//                            // 2.2.2.1.退款
//                            logger.info("[团购结束] 退款逻辑 groupShopId:" + groupShopDO.getId());
//                            for (OrderDO orderDO : lockOrderList) {
//                                transactionTemplate.execute(new TransactionCallbackWithoutResult() {
//                                    @Override
//                                    protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
//                                        try {
//                                            //对订单退款保证原子性，仅退款成功的单子，变更状态
//                                            orderBizService.groupShopStatusRefund(orderDO.getOrderNo());
//                                            logger.info("[团购订单退款] 完成 orderNo:" + orderDO.getOrderNo());
//                                        } catch (Exception e) {
//                                            logger.error("[团购订单退款] 异常 orderNo:" + orderDO.getOrderNo() + "; errmsg:" + e.getMessage());
//                                            transactionStatus.setRollbackOnly();
//                                        }
//                                    }
//                                });
//                            }
//                        } else {
//                            logger.info("[团购结束] 发货逻辑 groupShopId:" + groupShopDO.getId());
//                            // 2.2.2.2 转换订单为待出货状态 (非自动退款场景)
//                            List<Long> collect = lockOrderList.stream().map(s -> s.getId()).collect(Collectors.toList());
//                            OrderDO orderDO = new OrderDO();
//                            orderDO.setStatus(OrderStatusType.WAIT_STOCK.getCode());
//                            orderMapper.update(orderDO, (
//                                    new EntityWrapper<OrderDO>()
//                                            .in("id", collect)
//                                            .eq("status", OrderStatusType.GROUP_SHOP_WAIT.getCode())));
//                        }
//
//                    }
//                }
//            } catch (Exception e) {
//                logger.error("[团购结束 定时任务] 异常", e);
//                throw e;
//            } finally {
//                lockComponent.release(GROUP_SHOP_END_LOCK);
//            }
//        }
//
//    }
//
//    @Scheduled(cron = "10 * * * * ?")
//    @Transactional(rollbackFor = Exception.class)
//    public void groupShopLock() throws Exception {
//        if (lockComponent.tryLock(GROUP_SHOP_LOCK_LOCK, 30)) {
//            try {
//                Date now = new Date();
//                /**
//                 * 3 冻结 团购活动期间却被下架的商品
//                 */
//                EntityWrapper<GroupShopDO> groupShopDOEntityWrapper = new EntityWrapper<>();
//
//                // 3.1 从团购中查询活动期间的商品
//                groupShopDOEntityWrapper.eq("status", StatusType.ACTIVE.getCode())
//                        .and()
//                        .le("gmt_start", now)
//                        .and()
//                        .gt("gmt_end", now);
//                List<GroupShopDO> groupShopDOS = groupShopMapper.selectList(groupShopDOEntityWrapper);
//                if (!CollectionUtils.isEmpty(groupShopDOS)) {
//                    List<Long> spuIdList = groupShopDOS.stream().map(t -> t.getSpuId()).collect(Collectors.toList());
//
//                    // 3.2 在团购中查询给出spuID,是否有被下架的商品
//                    List<SpuDO> spuDOS = spuMapper.selectList(new EntityWrapper<SpuDO>().in("id", spuIdList).eq("status", StatusType.LOCK.getCode()));
//                    if (!CollectionUtils.isEmpty(spuDOS)) {
//                        List<Long> collect = spuDOS.stream().map(t -> t.getId()).collect(Collectors.toList());
//                        GroupShopDO groupShopDO = new GroupShopDO();
//                        groupShopDO.setStatus(StatusType.LOCK.getCode());
//                        groupShopDO.setGmtUpdate(now);
//                        groupShopMapper.update(groupShopDO, (new EntityWrapper<GroupShopDO>().in("spu_id", collect)));
//                    }
//                }
//            } catch (Exception e) {
//                logger.error("[团购锁定 定时任务] 异常", e);
//                throw e;
//            } finally {
//                lockComponent.release(GROUP_SHOP_LOCK_LOCK);
//            }
//        }
//
//    }

}
