package io.renren.modules.job.task;


import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.minio.PutObjectOptions;
import io.minio.errors.*;
import io.renren.common.utils.MinIoUtils;
import io.renren.modules.dataSet.entity.DataSetDychoosedata;
import io.renren.modules.dataSet.mapper.DataSetDychoosedataMapper;
import io.renren.modules.dataSet.service.DynamicSystemService;
import io.renren.modules.sys.dao.dataset.DataSetDyMapper;
import io.renren.modules.sys.entity.dataset.DataSetDy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;

@Component("demo1")
public class demo1 implements ITask{

    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private DataSetDychoosedataMapper dataSetDychoosedataMapper;
    @Autowired
    DataSetDyMapper dataSetDyMapper;

    @Autowired
    private DynamicSystemService dynamicSystemService;
    @Override
    public void run(String params) {
//        System.out.println("demo1 执行了  时间------" + new Date());
//        System.out.println(params);
        logger.debug("TestTask定时任务正在执行，参数为：{}", params);
        Integer parms = Integer.parseInt(params);



        /*
        第一步：通过params 获取 任务对应的 用户选择数据表
        第二步：由上一步用户选择数据表 得到ID ，进而查找数据库表 获取对应是数据集名称 同时在最后更新文件路径
        第三步：根据数据组 制作文件名  命名规则 ：用户id_数据集名称_小时_分钟_秒_毫秒
        第四步：切分数据集 调用方法 进行数据抽取
         */
//        chooseData=subeqpdemo:serialNumber,needMeasuringPoint;subeqpdemo1:serialNumber,equipment;
        // 第一步  获取该动态任务对应的id
        DataSetDychoosedata dataSetDychoosedata = dataSetDychoosedataMapper.selectById(parms);
        System.out.println(params);
        // 第二步 根据ID 获取 对应是数据集
        QueryWrapper<DataSetDy> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("choose_data_id",dataSetDychoosedata.getId());
        DataSetDy dataSetDy = dataSetDyMapper.selectOne(queryWrapper);
        // 第三步 制作文件名称
        if(dataSetDy != null){
            java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("HH_mm_ss_SSS");
            String format = sdf.format(new Date());
            String dyName = dataSetDy.getUid().toString() + "_"+ dataSetDy.getDatasetName()+ "_"+format;
            // 第四步 数据抽取
            String chooseData = dataSetDychoosedata.getChooseData();
            String[] datas = chooseData.split(";"); //subeqpdemo:serialNumber,needMeasuringPoint
            Map map = new HashMap();
            for (int i = 0; i < datas.length; i++) {
                if(datas[i] != null){
                    if(i==0){
                        String useName = dyName+'_'+i;
                        map.put("oldFileName",useName);
                        map.put("newFileName",useName);

                    }else if(i==(datas.length-1)){
                        map.put("oldFileName",map.get("newFileName"));
                        map.put("newFileName",dyName);

                    }else {
                        map.put("oldFileName",map.get("newFileName"));
                        map.put("newFileName",dyName+'_'+i);

                    }
                    String[] infos = datas[i].split(":");
                    String table = infos[0];   //subeqpdemo
                    map.put("hbaseTableName",table);
                    List<String> chosedata = new ArrayList<>();
                    String[] choosedatas = infos[1].split(",");
                    for (int j = 0; j < choosedatas.length; j++) {
                        chosedata.add(choosedatas[j]);
                    }
                    map.put("chosedata",chosedata);
                    map.put("userID",dataSetDy.getUid().toString());
                    System.out.println(map);
                    dynamicSystemService.runSave(map);
                }

            }
            // 最后 更新数据集中 文件路径

            String path  = System.getProperty("user.dir")+ File.separator+"csv" + File.separator + map.get("userID");
            File newFileName = new File(path,map.get("newFileName")+ ".csv");
            File lastFileName = new File(path,dataSetDy.getDatasetName()+".csv");
            FileUtil.rename(newFileName,lastFileName.getName(),false,true);
            PutObjectOptions putObjectOptions = new PutObjectOptions(lastFileName.length(), PutObjectOptions.MIN_MULTIPART_SIZE);
            try {
                MinIoUtils.uploadLocalFile("dydataset",lastFileName.getName(),lastFileName.getAbsolutePath(),putObjectOptions);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //  删除本地数据文件
            FileUtil.del(lastFileName);


            dataSetDy.setDfsUrl(map.get("newFileName").toString());
            dataSetDyMapper.updateById(dataSetDy);
        }

    }
}
