package com.xisc.pm.app.service.impl;

import com.xisc.pm.app.service.PmPonoWtStaticService;
import com.xisc.pm.domain.entity.PmPonoWtStatic;
import com.xisc.pm.domain.entity.PmPonoWtStaticTra;
import com.xisc.pm.domain.repository.PmPonoWtStaticRepository;
import com.xisc.pm.domain.repository.PmPonoWtStaticTraRepository;
import com.xisc.pm.infra.util.Utils;
import io.choerodon.core.domain.Page;
import io.choerodon.core.exception.CommonException;
import io.choerodon.core.oauth.DetailsHelper;
import io.choerodon.mybatis.pagehelper.PageHelper;
import io.choerodon.mybatis.pagehelper.domain.PageRequest;
import org.apache.commons.collections.CollectionUtils;
import org.hzero.mybatis.domian.Condition;
import org.hzero.mybatis.util.Sqls;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 炉重静态表(PmPonoWtStatic)应用服务
 *
 * @author 纪文桃 wentao.ji01@hand-china.com
 * @since 2024-07-25 09:12:13
 */
@Service
public class PmPonoWtStaticServiceImpl implements PmPonoWtStaticService {

    private PmPonoWtStaticRepository pmPonoWtStaticRepository;

    private PmPonoWtStaticTraRepository pmPonoWtStaticTraRepository;

    public PmPonoWtStaticServiceImpl(PmPonoWtStaticRepository pmPonoWtStaticRepository, PmPonoWtStaticTraRepository pmPonoWtStaticTraRepository) {
        this.pmPonoWtStaticRepository = pmPonoWtStaticRepository;
        this.pmPonoWtStaticTraRepository = pmPonoWtStaticTraRepository;
    }

    @Override
    public Page<PmPonoWtStatic> selectList(PageRequest pageRequest, PmPonoWtStatic pmPonoWtStatic) {
        return PageHelper.doPageAndSort(pageRequest, () -> pmPonoWtStaticRepository.selectList(pmPonoWtStatic));
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveData(Long tenantId, List<PmPonoWtStatic> pmPonoWtStaticList) {
        // 检查数据列表是否为空，如果为空则直接返回
        if (CollectionUtils.isEmpty(pmPonoWtStaticList)) {
            return;
        }

        // 新增记录之间校验区间是否交叉
        for (int i = 0; i < pmPonoWtStaticList.size() - 1; i++) {
            for (int j = i + 1; j < pmPonoWtStaticList.size(); j++) {
                // 校验板坯厚度区间是否交叉
                boolean slabThickIntervalCheck = Utils.isIntersect(pmPonoWtStaticList.get(i).getSlabThickFrom(), pmPonoWtStaticList.get(i).getSlabThickTo(),
                        pmPonoWtStaticList.get(j).getSlabThickFrom(), pmPonoWtStaticList.get(j).getSlabThickTo());
                if (slabThickIntervalCheck) {
                    throw new CommonException("pm.pd_tmp_yield_bt_001", pmPonoWtStaticList.get(j).getSlabThickFrom(), pmPonoWtStaticList.get(j).getSlabThickTo());
                }

                // 校验板坯宽度区间是否交叉
                boolean slabWidthIntervalCheck = Utils.isIntersect(pmPonoWtStaticList.get(i).getSlabWidthFrom(), pmPonoWtStaticList.get(i).getSlabWidthTo(),
                        pmPonoWtStaticList.get(j).getSlabWidthFrom(), pmPonoWtStaticList.get(j).getSlabWidthTo());
                if (slabWidthIntervalCheck) {
                    throw new CommonException("pm.pd_tmp_yield_bt_002", pmPonoWtStaticList.get(j).getSlabWidthFrom(), pmPonoWtStaticList.get(j).getSlabWidthTo());
                }
            }
        }
        // 与数据库记录校验区间是否交叉
        List<PmPonoWtStatic> existPmPonoWtStaticList = pmPonoWtStaticRepository.selectByCondition(Condition.builder(PmPonoWtStatic.class)
                .andWhere(Sqls.custom().andEqualTo(PmPonoWtStatic.FIELD_TENANT_ID, tenantId))
                .build());
        if (CollectionUtils.isNotEmpty(existPmPonoWtStaticList)) {
            for (int i = 0; i < pmPonoWtStaticList.size(); i++) {
                for (int j = 0; j < existPmPonoWtStaticList.size(); j++) {
                    // 如果是更新的话，不跟自己比较
                    if (pmPonoWtStaticList.get(i).getPmPonoWtStaticId() != null &&
                            pmPonoWtStaticList.get(i).getPmPonoWtStaticId().equals(existPmPonoWtStaticList.get(j).getPmPonoWtStaticId())) {
                        continue;
                    }
                    // 校验板坯厚度区间是否交叉
                    boolean slabThickIntervalCheck = Utils.isIntersect(pmPonoWtStaticList.get(i).getSlabThickFrom(),
                            pmPonoWtStaticList.get(i).getSlabThickTo(), existPmPonoWtStaticList.get(j).getSlabThickFrom(),
                            existPmPonoWtStaticList.get(j).getSlabThickTo());
                    if (slabThickIntervalCheck) {
                        throw new CommonException("pm.pd_tmp_yield_bt_001", existPmPonoWtStaticList.get(j).getSlabThickFrom(), existPmPonoWtStaticList.get(j).getSlabThickTo());
                    }

                    // 校验板坯宽度区间是否交叉
                    boolean slabWidthIntervalCheck = Utils.isIntersect(pmPonoWtStaticList.get(i).getSlabWidthFrom(),
                            pmPonoWtStaticList.get(i).getSlabWidthTo(), existPmPonoWtStaticList.get(j).getSlabWidthFrom(),
                            existPmPonoWtStaticList.get(j).getSlabWidthTo());
                    if (slabWidthIntervalCheck) {
                        throw new CommonException("pm.pd_tmp_yield_bt_002", existPmPonoWtStaticList.get(j).getSlabWidthFrom(), existPmPonoWtStaticList.get(j).getSlabWidthTo());
                    }
                }
            }
        }

        // 获取当前时间及操作人信息
        Date now = new Date();
        String username = DetailsHelper.getUserDetails().getUsername();
        List<PmPonoWtStaticTra> insertPmPonoWtStaticTraList = new ArrayList<>(pmPonoWtStaticList.size());

        // 分离需要插入和更新的列表
        List<PmPonoWtStatic> insertList = pmPonoWtStaticList.stream().filter(line -> line.getPmPonoWtStaticId() == null).collect(Collectors.toList());
        List<PmPonoWtStatic> updateList = pmPonoWtStaticList.stream().filter(line -> line.getPmPonoWtStaticId() != null).collect(Collectors.toList());

        // 记录历史表
        for (PmPonoWtStatic pmPonoWtStatic : updateList) {
            PmPonoWtStaticTra pmPonoWtStaticTra = new PmPonoWtStaticTra();
            BeanUtils.copyProperties(pmPonoWtStatic, pmPonoWtStaticTra);

            // 设置操作类型为更新（U），并记录操作时间和用户
            pmPonoWtStaticTra.setOperationType("U");
            pmPonoWtStaticTra.setOperationTime(now);
            pmPonoWtStaticTra.setOperationUser(username);
            insertPmPonoWtStaticTraList.add(pmPonoWtStaticTra);

        }
        // 更新或者新增
        pmPonoWtStaticRepository.batchUpdateByPrimaryKeySelective(updateList);
        pmPonoWtStaticRepository.batchInsertSelective(insertList);

        for (PmPonoWtStatic pmPonoWtStatic : insertList) {
            PmPonoWtStaticTra pmPonoWtStaticTra = new PmPonoWtStaticTra();
            BeanUtils.copyProperties(pmPonoWtStatic, pmPonoWtStaticTra);

            // 设置操作类型为新增（I），并记录操作时间和用户
            pmPonoWtStaticTra.setOperationType("I");
            pmPonoWtStaticTra.setOperationTime(now);
            pmPonoWtStaticTra.setOperationUser(username);
            insertPmPonoWtStaticTraList.add(pmPonoWtStaticTra);

        }
        // 插入保存或者更新记录到对应履历表
        pmPonoWtStaticTraRepository.batchInsertSelective(insertPmPonoWtStaticTraList);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteForUi(List<PmPonoWtStatic> pmPonoWtStaticList) {
        if (CollectionUtils.isNotEmpty(pmPonoWtStaticList)) {
            // 删除
            pmPonoWtStaticRepository.batchDeleteByPrimaryKey(pmPonoWtStaticList);

            // 获取时间和当前操作人信息
            Date now = new Date();
            String username = DetailsHelper.getUserDetails().getUsername();
            List<PmPonoWtStaticTra> insertPmPonoWtStaticTraList = new ArrayList<>(pmPonoWtStaticList.size());
            for (PmPonoWtStatic pmPonoWtStatic : pmPonoWtStaticList) {
                PmPonoWtStaticTra pmPonoWtStaticTra = new PmPonoWtStaticTra();

                // 设置操作类型为删除（D），并记录操作时间和用户
                BeanUtils.copyProperties(pmPonoWtStatic, pmPonoWtStaticTra);
                pmPonoWtStaticTra.setOperationType("D");
                pmPonoWtStaticTra.setOperationTime(now);
                pmPonoWtStaticTra.setOperationUser(username);
                insertPmPonoWtStaticTraList.add(pmPonoWtStaticTra);

            }
            // 插入删除记录到对应履历表
            pmPonoWtStaticTraRepository.batchInsertSelective(insertPmPonoWtStaticTraList);
        }
    }
}

