package com.energy.manage.service.service.autoanalysisconfig.impl;

import com.energy.manage.common.enums.OptionEnums;
import com.energy.manage.common.po.autoanalysisconfigdetail.AutoAnalysisConfigDetailPo;
import com.energy.manage.common.po.autoanalysisconfigdetailoptionrecords.AutoAnalysisConfigDetailOptionRecordsPo;
import com.energy.manage.common.reponse.ResultResp;
import com.energy.manage.service.domain.dto.analysis.AutoAnalysisConfigDetailDto;
import com.energy.manage.service.domain.vo.analysis.AutoAnalysisConfigDetailVo;
import com.energy.manage.service.mappers.autoanalysisconfigdetail.AutoAnalysisConfigDetailMapper;
import com.energy.manage.service.mappers.autoanalysisconfigdetailoptionrecords.AutoAnalysisConfigDetailOptionRecordsMapper;
import com.energy.manage.service.service.autoanalysisconfig.AutoAnalysisConfigService;
import com.energy.manage.service.util.UUIDUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.energy.manage.common.reponse.ConstVar.EXSIT_ON_CONFIG;

/**
 * @author chy
 * @date 2025/3/27 09:50
 * @desc
 */
@Service
public class AutoAnalysisConfigServiceImpl implements AutoAnalysisConfigService {

    @Autowired
    private AutoAnalysisConfigDetailMapper autoAnalysisConfigDetailMapper;

    @Autowired
    private AutoAnalysisConfigDetailOptionRecordsMapper optionRecordsMapper;

    /**
     * @param autoAnalysisConfigDetailDto
     * @return
     */
    @Override
    public List<AutoAnalysisConfigDetailVo> configList(AutoAnalysisConfigDetailDto autoAnalysisConfigDetailDto) {
        return autoAnalysisConfigDetailMapper.selectByCondition(autoAnalysisConfigDetailDto);
    }

    @Override
    public ResultResp configSave(AutoAnalysisConfigDetailDto detailDto) {
        //同一个风场存在一个相同的配置（不论是否在启动状态）
        int existConfigCount = autoAnalysisConfigDetailMapper.selectExistConfig(detailDto);
        if(existConfigCount > 0){
            return ResultResp.FAIL(EXSIT_ON_CONFIG);
        }
        String configUniqueId = UUIDUtil.getShortUUIDLowCase();
        //保存操作记录
        optionRecordsMapper.insertSelective(new AutoAnalysisConfigDetailOptionRecordsPo()
                                                        .setFieldCode(detailDto.getFieldCode())
                                                        .setConfigUniqueId(configUniqueId));
        //保存配置
        autoAnalysisConfigDetailMapper.insertConfig(detailDto.setConfigUniqueId(configUniqueId));
        return ResultResp.SUCCESS();
    }

    @Override
    public ResultResp configEdit(AutoAnalysisConfigDetailDto detailDto) {
        //同一个风场存在一个相同的配置(不论是否在启动状态)
        int existConfigCount = autoAnalysisConfigDetailMapper.selectExistConfig(detailDto);
        if(existConfigCount > 0){
            return ResultResp.FAIL(EXSIT_ON_CONFIG);
        }
        //保存操作记录(先保存原始值)
        saveOptionRecords(detailDto.getConfigUniqueId(), OptionEnums.EDIT.getCode());
        //更新配置
        autoAnalysisConfigDetailMapper.updateConfigByCondition(detailDto);
        return ResultResp.SUCCESS();
    }

    /**
     * 启动/关闭
     * @param detailDto
     * @return
     */
    @Override
    public ResultResp onOff(AutoAnalysisConfigDetailDto detailDto) {
        //保存操作记录
        int optionFlag = detailDto.getStartupState() == 1 ? OptionEnums.ON.getCode() : OptionEnums.OFF.getCode();
        //保存操作记录(先保存操作记录，后更新)
        saveOptionRecords(detailDto.getConfigUniqueId(), optionFlag);
        //更新配置
        autoAnalysisConfigDetailMapper.updateConfigByCondition(detailDto);
        return ResultResp.SUCCESS();
    }

    /**
     * 保存操作记录
     * @param configUniqueId
     * @param optionFlag
     */
    private void saveOptionRecords(String configUniqueId, Integer optionFlag){
        //查询更新前的配置，为后续保存操作记录做准备
        AutoAnalysisConfigDetailPo exist = autoAnalysisConfigDetailMapper.selectByUniqueId(configUniqueId);
        //保存操作记录
        AutoAnalysisConfigDetailOptionRecordsPo recordsPo = new AutoAnalysisConfigDetailOptionRecordsPo()
                                                                    .setFieldCode(exist.getFieldCode())
                                                                    .setConfigUniqueId(configUniqueId)
                                                                    .setOptionFlag(optionFlag)
                                                                    .setSourceStartupState(exist.getStartupState())
                                                                    .setSourceIntevalDays(exist.getIntervalDays())
                                                                    .setSourceStartTime(exist.getStartTime());
        optionRecordsMapper.insertSelective(recordsPo);
    }
}
