package com.cf.imes.module.system.service.systemconfig.factory.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.framework.common.enums.CommonStatusEnum;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.system.controller.admin.systemconfig.vo.*;
import com.cf.imes.module.system.dal.dataobject.dict.DictDataDO;
import com.cf.imes.module.system.dal.dataobject.systemconfig.SystemConfigDO;
import com.cf.imes.module.system.dal.mysql.dict.DictDataMapper;
import com.cf.imes.module.system.dal.mysql.systemconfig.SystemConfigMapper;
import com.cf.imes.module.system.enums.config.SystemConfigTypeEnum;
import com.cf.imes.module.system.service.systemconfig.factory.service.AbstractSystemConfigServiceHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import jakarta.annotation.Resource;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

/**
 *
 * @author Gqr
 * @since 2024/11/14 14:30
 */
@Service("defaultSystemConfigServiceHandler")
@Slf4j
public class DefaultSystemConfigServiceHandler extends AbstractSystemConfigServiceHandler {

    @Resource
    private SystemConfigMapper systemConfigMapper;

    @Resource
    private DictDataMapper dictDataMapper;

    @Resource
    private CustomPlateNoServiceHandler customPlateNoServiceHandler;

    @Override
    public List<SystemConfigDO> selectList(ConfigPageReqVO reqVO) {

        List<DictDataDO> dictDataDOS = dictDataMapper.selectListByStatusAndDictType(CommonStatusEnum.ENABLE.getStatus(), "system_config_type_enum");

        if(CollUtil.isEmpty(dictDataDOS)){
            log.error("系统配置项对应的字典被关闭或数据查询有误");
            return null;
        }

        List<SystemConfigDO> systemConfigDOS = systemConfigMapper.selectList(new LambdaQueryWrapperX<SystemConfigDO>()
                .likeIfPresent(SystemConfigDO::getName, reqVO.getName())
                .inIfPresent(SystemConfigDO::getType, dictDataDOS.stream().map(DictDataDO::getValue).toList())
                .eqIfPresent(SystemConfigDO::getOrganId, OrganContextHolder.getOrganId())
                .select(SystemConfigDO::getId, SystemConfigDO::getName, SystemConfigDO::getStatus, SystemConfigDO::getType,SystemConfigDO::getVersion)
                .orderByAsc(SystemConfigDO::getId));

        // 遍历枚举
        List<SystemConfigDO> resultList = new ArrayList<>();


        for (DictDataDO dictDataDO : dictDataDOS) {
            // 获取当前枚举类型的配置项列表
            List<SystemConfigDO> typeConfigs = systemConfigDOS.stream()
                    .filter(c -> ObjectUtil.equal(dictDataDO.getValue(), c.getType()))
                    .toList();

            if (typeConfigs.isEmpty()) {
                // 如果没有当前类型的配置，则创建默认配置
                SystemConfigDO initConfig = SystemConfigDO
                        .builder()
                        .id(null)
                        .name(dictDataDO.getLabel())
                        .type(Integer.parseInt(dictDataDO.getValue()))
                        .build();

                // 自定义板编号
                if(Integer.parseInt(dictDataDO.getValue()) == (SystemConfigTypeEnum.CUSTOM_PLATE_NO.getType())){
                    initConfig.setStatus(CommonStatusEnum.DISABLE.getStatus());
                    resultList.add(initConfig);
                    continue;
                }

                resultList.add(initConfig);
            } else {
                // 如果存在配置，保留版本号最大的配置
                Optional<SystemConfigDO> maxVersionConfig = typeConfigs.stream()
                        .map(m->m.setName(dictDataDO.getLabel()))
                        .max(Comparator.comparingInt(SystemConfigDO::getVersion));

                maxVersionConfig.ifPresent(resultList::add);
            }

        }

        return resultList;
    }

    @Override
    public void checkValid(String setting) {
        // todo checkValid
    }

    @Override
    public void beforeSaveConfig(ConfigSaveReqVO reqVO) {
        // todo beforeSaveConfig
    }

    @Override
    public void afterSaveConfig(SystemConfigDO systemConfigDO, ConfigSaveReqVO reqVO) {
        // todo afterSaveConfig
    }


    @Override
    public void deleteConfig(ConfigDeleteReqVO reqVO) {
        // TODO document why this method is empty
    }

    @Override
    public void updateConfigStatus(ConfigUpdateStatusReqVO reqVO) {
        // TODO document why this method is empty
    }

    @Override
    public void updateConfigSort(List<ConfigUpdateSortReqVO> reqVO) {
        // TODO document why this method is empty
    }

    @Override
    public SystemConfigDO getSystemConfig(Long id) {

        return null;
    }

    @Override
    public void modifySystemConfig(ConfigSaveReqVO reqVO) {
        // TODO document why this method is empty
    }
}
