package com.njcn.csdevice.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.csdevice.enums.AlgorithmResponseEnum;
import com.njcn.csdevice.mapper.CsDevModelMapper;
import com.njcn.csdevice.pojo.param.CsDevModelAddParm;
import com.njcn.csdevice.pojo.param.CsDevModelAuditParm;
import com.njcn.csdevice.pojo.param.CsDevModelQueryListParm;
import com.njcn.csdevice.pojo.param.CsDevModelQueryParm;
import com.njcn.csdevice.pojo.po.CsDevModelPO;
import com.njcn.csdevice.pojo.vo.CsDevModelPageVO;
import com.njcn.csdevice.service.CsDevModelService;
import com.njcn.csdevice.service.ICsDataArrayService;
import com.njcn.csdevice.service.ICsDataSetService;
import com.njcn.redis.utils.RedisUtil;
import com.njcn.system.api.DictTreeFeignClient;
import com.njcn.system.enums.DicDataEnum;
import com.njcn.system.enums.DicTreeEnum;
import com.njcn.system.pojo.po.SysDicTreePO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.sql.Date;
import java.util.List;
import java.util.Objects;

/**
 * 
 * Description:
 * 接口文档访问地址：http://serverIP:port/swagger-ui.html
 * Date: 2023/4/10  11:28【需求编号】
 *
 * @author clam
 * @version V1.0.0
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class CsDevModelServiceImpl extends ServiceImpl<CsDevModelMapper, CsDevModelPO> implements CsDevModelService{

    private final ICsDataSetService csDataSetService;
    private final ICsDataArrayService csDataArrayService;
    private final RedisUtil redisUtil;
    private final DictTreeFeignClient dictTreeFeignClient;

    @Override
    public void refreshDevModelCache() {
//        List<CsDevModelDto> csDevModelDtoList = new ArrayList<>();
//        List<CsDevModelDto.CsDataSet> csDataSetList = new ArrayList<>();
//        List<CsDevModelDto.CsDataArray> csDataArrayList = new ArrayList<>();
//        //获取系统所有模板
//        LambdaQueryWrapper<CsDevModelPO> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(CsDevModelPO::getStatus,1);
//        List<CsDevModelPO> list = this.list(queryWrapper);
//        //根据模板ids获取数据集
//        if (CollUtil.isNotEmpty(list)) {
//            List<String> modelIds = list.stream().map(CsDevModelPO::getId).collect(Collectors.toList());
//            List<CsDataSet> csDataSets = csDataSetService.getDataSetByModelId(modelIds);
//            //根据数据集获取具体指标
//            List<String> dataSetList = csDataSets.stream().map(CsDataSet::getId).collect(Collectors.toList());
//            List<CsDataArray> csDataArrays = csDataArrayService.getDataArrayByDataSetIds(dataSetList);
//
//            list.forEach(item->{
//                CsDevModelDto dto = new CsDevModelDto();
//                BeanUtils.copyProperties(item,dto);
//                csDevModelDtoList.add(dto);
//            });
//            csDataSets.forEach(item->{
//                CsDevModelDto.CsDataSet dto = new CsDevModelDto.CsDataSet();
//                BeanUtils.copyProperties(item,dto);
//                csDataSetList.add(dto);
//            });
//            csDataArrays.forEach(item->{
//                CsDevModelDto.CsDataArray dto = new CsDevModelDto.CsDataArray();
//                BeanUtils.copyProperties(item,dto);
//                csDataArrayList.add(dto);
//            });
//
//            for (CsDevModelDto.CsDataSet item1 : csDataSetList) {
//                List<CsDevModelDto.CsDataArray> list1 = new ArrayList<>();
//                for (CsDevModelDto.CsDataArray item2 : csDataArrayList) {
//                    if (Objects.equals(item1.getId(),item2.getPid())) {
//                        list1.add(item2);
//                    }
//                }
//                item1.setDataArrays(list1);
//            }
//
//            for (CsDevModelDto item1 : csDevModelDtoList) {
//                List<CsDevModelDto.CsDataSet> list1 = new ArrayList<>();
//                for (CsDevModelDto.CsDataSet item2 : csDataSetList) {
//                    if (Objects.equals(item1.getId(),item2.getPid())) {
//                        list1.add(item2);
//                    }
//                }
//                item1.setDataSets(list1);
//                redisUtil.saveByKey(AppRedisKey.DEV_MODEL.concat(item1.getId()),item1);
//            }
//        }
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public CsDevModelPO addDevModel(CsDevModelAddParm csDevModelAddParm) {
        CsDevModelPO csDevModelPO = new CsDevModelPO ();
        BeanUtils.copyProperties (csDevModelAddParm, csDevModelPO);
        csDevModelPO.setStatus ("1");
        this.save (csDevModelPO);
        return csDevModelPO;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean AuditDevModel(CsDevModelAuditParm csDevModelAuditParm) {
        CsDevModelPO csDevModelPO = new CsDevModelPO ();
        BeanUtils.copyProperties (csDevModelAuditParm, csDevModelPO);
        return this.updateById (csDevModelPO);
    }

    @Override
    public IPage<CsDevModelPageVO> queryPage(CsDevModelQueryParm csDevModelQueryParm) {
        Page<CsDevModelPageVO> returnpage = new Page<> (csDevModelQueryParm.getPageNum ( ), csDevModelQueryParm.getPageSize ( ));
        if (Objects.nonNull (csDevModelQueryParm.getDevType()) && StringUtils.isNotBlank(csDevModelQueryParm.getDevType())) {
            SysDicTreePO po = dictTreeFeignClient.queryById(csDevModelQueryParm.getDevType()).getData();
            if (Objects.isNull (po)) {
                throw new BusinessException("装置型号字典缺失");
            } else {
                csDevModelQueryParm.setDevName(po.getName());
            }
        }
        returnpage = this.getBaseMapper ().getPage(returnpage,csDevModelQueryParm);
        return returnpage;
    }

    @Override
    public CsDevModelPageVO queryDevModelOne(CsDevModelQueryListParm csDevModelQueryListParm) {

        return this.getBaseMapper ().queryOne(csDevModelQueryListParm);
    }

    @Override
    public CsDevModelPO findModel(String devType, String version, String time) {
        LambdaQueryWrapper<CsDevModelPO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(CsDevModelPO::getDevTypeName,devType)
                .eq(CsDevModelPO::getVersionNo,version)
                .eq(CsDevModelPO::getVersionDate, Date.valueOf(time))
                .eq(CsDevModelPO::getStatus,1);
        return this.baseMapper.selectOne(lambdaQueryWrapper);
    }

    @Override
    public CsDevModelPO getModelById(String id) {
        return this.lambdaQuery().eq(CsDevModelPO::getId,id).one();
    }

    @Override
    public CsDevModelPO getCldModel() {
        List<CsDevModelPO> list = this.lambdaQuery()
                .eq(CsDevModelPO::getDevTypeName, DicDataEnum.DEV_CLD.getCode())
                .eq(CsDevModelPO::getStatus,1)
                .list();
        if (CollectionUtil.isEmpty(list)) {
            throw new BusinessException(AlgorithmResponseEnum.CLD_MODEL_MISSING);
        } else {
            if (list.size() > 1) {
                throw new BusinessException(AlgorithmResponseEnum.CLD_MODEL_MORE);
            }
        }
        return list.get(0);
    }

}
