package com.example.upsecuritydata.task;

import cn.hutool.core.date.DateUtil;
import com.example.upsecuritydata.service.Method;
import com.example.upsecuritydata.service.NbmsEntApplyServcie;
import com.example.upsecuritydata.util.Constant;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.AllArgsConstructor;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

import java.io.IOException;
import java.util.Date;

/**
 * 三、	标识解析企业主体信息上报
 *
 * @author laifeng
 * @since 2022/11/29
 */
@Component
@AllArgsConstructor
//@EnableScheduling
public class IdentificationUpTask {
    private final NbmsEntApplyServcie nbmsEntApplyServcie;
    private final Method method;

    //    @Scheduled(cron = "0/20 * * * * ? ")
    @XxlJob("demoJobTest")
//    @Scheduled(cron = "0 0/1 * * * ?")
    public void refreshAliDeviceStatus() {
        StopWatch stopWatch = new StopWatch("task");
        stopWatch.start();
        // 标识解析企业主体信息上报检测新增并上传
        threePackMethod(0);
        // 标识解析企业主体信息上报检测更新并上传
        threePackMethod(1);

        fourPackMethod(0);
        fourPackMethod(1);

        fivePackMethod(0);
        fivePackMethod(1);

        String yesterday = DateUtil.format(DateUtil.yesterday(), "yyyyMMdd");
        // 注册数据上报
        try {
            method.creatSixUpFileAndUp(yesterday);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 解析数据上报
        try {
            method.creatSevenUpFileAndUp(yesterday);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 删除上传生成的文件
        method.deletUpFile(Constant.localPackage);

        stopWatch.stop();
        double seconds = stopWatch.getTotalTimeSeconds();
        XxlJobHelper.log("XXL-JOB, 上传日志成功! 共花费:" + seconds);
        System.out.println("XXL-JOB, 上传日志成功! 共花费:" + seconds);

    }

    /**
     * 三、	标识解析企业主体信息上报
     *
     * @param type 0 新增 1 更新
     */
    private void threePackMethod(Integer type) {
        // 时间格式化
        Date date = DateUtil.yesterday();
        String yyyyMMdd = DateUtil.format(date, "yyyyMMdd");
        String yyyyMMddToday = DateUtil.format(DateUtil.date(), "yyyyMMdd");
        Boolean temp = false;

        try {
            temp = method.creatIdentificationUpFile(type, yyyyMMdd, yyyyMMddToday);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 如果没有生成文件,可直接结束
        if (!temp) {
            String logName = "";
            if (type == 0) {
                logName = "新增";
            } else {
                logName = "更新";
            }
            XxlJobHelper.log("表1:昨日无" + logName + "数据日志!");
            return;
        }


        String fileName = Constant.localNotEncryFileNamePath;
        // 要上传的目录
        String upSrc = "/001/" + yyyyMMdd;
        // 表名(文件名的一部分)
        String tableName = "ZLXT-basic_identification-";
        String operationName = "";
        if (type == 0) {
            // 操作类型为新增
            operationName = "-add.bin";
        }
        if (type == 1) {
            // 操作类型为更新
            operationName = "-update.bin";
        }
        try {
            method.upMethod(fileName, upSrc, tableName, operationName);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * 四、	标识解析企业主体信息上报
     *
     * @param type 0 新增 1 更新
     */
    private void fourPackMethod(Integer type) {
        // 时间格式化
        Date date = DateUtil.yesterday();
        String yyyyMMdd = DateUtil.format(date, "yyyyMMdd");
        String yyyyMMddToday = DateUtil.format(DateUtil.date(), "yyyyMMdd");
        Boolean temp = false;

        try {
            temp = method.creatForUpFile(type, yyyyMMdd, yyyyMMddToday);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 如果没有生成文件,可直接结束
        if (!temp) {
            String logName = "";
            if (type == 0) {
                logName = "新增";
            } else {
                logName = "更新";
            }
            XxlJobHelper.log("表2:昨日无" + logName + "数据日志!");
            return;
        }

        String fileName = Constant.localNotEncryFileNamePath;
        // 要上传的目录
        String upSrc = "/002/" + yyyyMMdd;
        // 表名(文件名的一部分)
        String tableName = "ZLXT-basic_identification_ip-";
        String operationName = "";
        if (type == 0) {
            // 操作类型为新增
            operationName = "-add.bin";
        }
        if (type == 1) {
            // 操作类型为更新
            operationName = "-update.bin";
        }
        try {
            method.upMethod(fileName, upSrc, tableName, operationName);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 五、	标识注册企业主体信息上报
     *
     * @param type
     */
    private void fivePackMethod(Integer type) {
        // 时间格式化
        Date date = DateUtil.yesterday();
        String yyyyMMdd = DateUtil.format(date, "yyyyMMdd");
        String yyyyMMddToday = DateUtil.format(DateUtil.date(), "yyyyMMdd");
        Boolean temp = false;

        try {
            temp = method.creatFiveUpFile(type, yyyyMMdd, yyyyMMddToday);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 如果没有生成文件,可直接结束
        if (!temp) {
            String logName = "";
            if (type == 0) {
                logName = "新增";
            } else {
                logName = "更新";
            }
            XxlJobHelper.log("表3:昨日无" + logName + "数据日志!");
            return;
        }


        String fileName = Constant.localNotEncryFileNamePath;
        // 要上传的目录
        String upSrc = "/003/" + yyyyMMdd;
        // 表名(文件名的一部分)
        String tableName = "ZLXT-basic_registered-";
        String operationName = "";
        if (type == 0) {
            // 操作类型为新增
            operationName = "-add.bin";
        }
        if (type == 1) {
            // 操作类型为更新
            operationName = "-update.bin";
        }
        try {
            method.upMethod(fileName, upSrc, tableName, operationName);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}