package com.sy.coinage.task;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.sy.coinage.workshop.model.BaseInfo;
import com.sy.coinage.workshop.service.IBaseInfoService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import com.alibaba.fastjson2.JSONObject;
import com.sy.coinage.config.CustomConfig;

import com.sy.coinage.core.constants.CacheKey;
import com.sy.coinage.core.redis.RedisPublisherService;
import com.sy.coinage.core.redis.RedisService;
import com.sy.coinage.websocket.WebSocketServer;

import lombok.extern.slf4j.Slf4j;

import java.util.List;

// 定时任务类
@Slf4j
@Configuration
@EnableScheduling
public class ScheduleTask {

    @Value("${spring.profiles.active}")
    private String type;
    @Autowired
    private IBaseInfoService baseInfoService;

    // 每天00:05:00 执行
    private final static String everyDay = "00 05 00 * * ?";

    // 每隔30秒执行 执行
    private final static String second_30 = "0/30 * * * * ?";

    // 每小时00:00秒执行 执行
    private final static String everyHour = "00 00 * * * ?";

    // 每隔10秒执行 执行
    private final static String second_10 = "0/10 * * * * ?";

    private final static String five_minute = "0 0/5 * * * ?";


    // -------websocket每30秒执行
    @Scheduled(cron = second_30)
    private void testSendWebsocket() {
        if (type.equals("dev")) {
            return;
        }
        // log.debug("执行了定时任务={}", "每30秒执行");
        // String token1 = "123456";
        // JSONObject json = new JSONObject();
        // json.put("success", true);
        // json.put("code", 1);
        // json.put("msg", "TOEKN = " + token1 + " : " + "定时推送消息" + System.currentTimeMillis());
        // String resp = WebSocketServer.sendMessageClient(token1, json);
        // log.debug("执行了定时任务={},状态={}", "每30秒执行", resp);
        //
        // String token2 = "111111";
        // json.put("msg", "TOEKN = " + token2 + " : " + "定时推送消息" + System.currentTimeMillis());
        // WebSocketServer.sendMessageClient(token2, json);
    }

    // -------redis
    @Autowired
    private RedisService redisService;

    // 每30秒执行
    @Scheduled(cron = second_30)
    private void testRedis() {
        if (type.equals("dev")) {
            return;
        }
        // String str = redisService.get(CacheKey.TOKEN);
        // if (StringUtils.isBlank(str)) {
        // redisService.set(CacheKey.TOKEN, "test redis");
        // str = redisService.get(CacheKey.TOKEN);
        // }
        // log.debug("执行了定时任务={},redis={}", "每8秒执行", str);
    }

    // -------redis queue
    @Autowired
    private RedisPublisherService sendMessageService;

    @Autowired
    private CustomConfig customConfig;

    // 每30秒执行
    @Scheduled(cron = second_30)
    private void testSendMessage() {
        if (type.equals("dev")) {
            return;
        }
        // String token1 = "123456";
        // JSONObject json = new JSONObject();
        // json.put("success", true);
        // json.put("code", 1);
        // json.put("msg", "TOEKN = " + token1 + " : " + "定时推送消息" + System.currentTimeMillis());
        // String resp = sendMessageService.sendMsg(customConfig.getTopic(), json);
        // log.debug("执行了定时任务={},结果={}", "每10秒执行", resp);
    }

//    @Scheduled(cron = five_minute)
    private void printRfidBaseInfo(){

        if(type.equals("dev"))return;

        //获取数据  rfid_base_info中 status ==1 ,且res_dept_id==2
        LambdaQueryWrapper<BaseInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(BaseInfo::getStatus, 1);
        queryWrapper.eq(BaseInfo::getResDeptId,2);
        // todo  封包线数据来源 整拍：1 非整拍：2  都可以打印，需要变更
        //<old>
//        queryWrapper.eq(BaseInfo::getOriginType, 1);
        //</old>
        //<new>
        queryWrapper.lt(BaseInfo::getOriginType, 3);
        //</new>
//        queryWrapper.ne(BaseInfo::getPrintStatus,9);//9，是自动打印状态标识。 1，2 是手动打印状态标识
//        queryWrapper.gt(BaseInfo::getPrintStatus,5);
//        TODO 需要将 同步数据的默认值写入 1[最终方案，未打印的都是1，页面补打：2 自动打印：9 ]
        queryWrapper.eq(BaseInfo::getPrintStatus,1); //默认都是1：未打印的才可以进行。
        List<BaseInfo>  ls =  baseInfoService.list(queryWrapper);

        if(ls!= null && ls.size()>0){
            ls.forEach(l->{
                baseInfoService.autoPrint(l);
            });
        }

        log.info("执行了定时任务={} ,打印rfid信息={}","每五分钟执行打印rfid标签列表","标签列表数量"+ls!=null?ls.size():0);

    }

}
