package com.keyware.shandan.bianmu.es.consumer;

import com.keyware.shandan.common.util.StringUtils;
import com.keyware.shandan.system.repositories.EsSysFileRepository;
import com.keyware.shandan.common.util.PoiFileReadUtil;
import com.keyware.shandan.frame.properties.CustomProperties;
import com.keyware.shandan.system.entity.SysFile;
import com.keyware.shandan.system.queue.SysFileQueue;
import com.keyware.shandan.system.utils.DictUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 系统文件上传后保存到ES库的消费者线程
 *
 * @author GuoXin
 * @since 2021/6/30
 */
@Slf4j
@Component
public class EsSysFileQueueConsumer extends Thread {

    @Autowired
    private SysFileQueue sysFileQueue;

    @Autowired
    private EsSysFileRepository esBaseRepository;

    @Autowired
    private CustomProperties customProperties;

    @Override
    public void run() {
        log.info("消费者线程启动成功");
        List<SysFile> tempFiles = new ArrayList<>();
        while (true) {
            // 开始消费队列中的数据
            int size = sysFileQueue.getQueue().drainTo(tempFiles, 10);
            if (size > 0) {
                extractFileContents(tempFiles);
                esBaseRepository.saveAll(tempFiles);
                tempFiles.clear();// 清空列表
            } else {
                // 如果没有数据，则休眠指定时间后，再次执行
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    log.info("消费者线程执行异常", e);
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 将系统文件转换成带有大文本字段的ES文件实体类
     *
     * @param fileList -
     * @return -
     */
    private void extractFileContents(List<SysFile> fileList) {
        String pathPrefix = customProperties.getFileStorage().getPath();
        fileList.forEach(file -> {
            String path = pathPrefix + "/" + file.getPath();
            try {
                // 读取文件内容
                file.setText(PoiFileReadUtil.parseTextByFile(new File(path)));
                // 读取字段字典项
                if (StringUtils.hasText(file.getSource())) {
                    String source = DictUtil.getDictName("data_source", file.getSource());
                    file.setSource(StringUtils.hasText(source) ? source : file.getSource());
                }
                if (StringUtils.hasText(file.getTaskNature())) {
                    String taskNature = DictUtil.getDictName("task_nature", file.getTaskNature());
                    file.setTaskNature(StringUtils.hasText(taskNature) ? taskNature : file.getTaskNature());
                }
                if (StringUtils.hasText(file.getTargetNumber())) {
                    String targetNumber = DictUtil.getDictName("target_type", file.getTargetNumber());
                    file.setTargetNumber(StringUtils.hasText(targetNumber) ? targetNumber : file.getTargetNumber());
                }
                if (StringUtils.hasText(file.getEquipmentModel())) {
                    String value = DictUtil.getDictName("equipment_model", file.getEquipmentModel());
                    file.setEquipmentModel(StringUtils.hasText(value) ? value : file.getEquipmentModel());
                }
                if (StringUtils.hasText(file.getTaskCode())) {
                    String value = DictUtil.getDictName("task_code", file.getTaskCode());
                    file.setTaskCode(StringUtils.hasText(value) ? value : file.getTaskCode());
                }
                if (StringUtils.hasText(file.getTroopCode())) {
                    String value = DictUtil.getDictName("troop_code", file.getTaskCode());
                    file.setTroopCode(StringUtils.hasText(value) ? value : file.getTroopCode());
                }
                if (StringUtils.hasText(file.getTargetNumber())) {
                    String value = DictUtil.getDictName("target_number", file.getTargetNumber());
                    file.setTargetNumber(StringUtils.hasText(value) ? value : file.getTargetNumber());
                }
                if (StringUtils.hasText(file.getMissileNumber())) {
                    String value = DictUtil.getDictName("missile_number", file.getMissileNumber());
                    file.setMissileNumber(StringUtils.hasText(value) ? value : file.getMissileNumber());
                }
                file.setLabels(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
}
