package com.bsmlab.dfx.dfxconsole.app.agent.service;

import com.bsmlab.dfx.agent.config.AgentConfigDto;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@RequiredArgsConstructor
@Service
public class DfxAgentInfoService {
    private final DfxAgentInfoMapper dfxAgentInfoMapper;

    public List<DfxAgentInfoDto> getDfxAgentInfoDtoList() {
        List<DfxAgentInfoDto> dfxAgentInfoDtoList = null;
        dfxAgentInfoDtoList = dfxAgentInfoMapper.selectDfxAgentInfoList();
        return dfxAgentInfoDtoList;
    }

    public DfxAgentInfoDto getDfxAgentInfoDto(String agentId) {
        DfxAgentInfoDto dfxAgentInfoDto = null;
        dfxAgentInfoDto = dfxAgentInfoMapper.selectDfxAgentInfoByAgentId(DfxAgentInfoDto.builder().agentId(agentId).build());
        return dfxAgentInfoDto;
    }

    public void saveDfxAgentInfoDto(DfxAgentInfoDto dfxAgentInfoDto) {
        DfxAgentInfoDto existedDfxAgentInfoDto = dfxAgentInfoMapper.selectDfxAgentInfoByAgentId(dfxAgentInfoDto);
        if(existedDfxAgentInfoDto != null && StringUtils.isNotEmpty(existedDfxAgentInfoDto.getAgentId())) {
            dfxAgentInfoMapper.updateDfxAgentInfo(dfxAgentInfoDto);
        }
        else {
            dfxAgentInfoMapper.insertDfxAgentInfo(dfxAgentInfoDto);
        }
    }

    public void saveDetailForRefreshDfxAgentInfoDto(DfxAgentInfoDto dfxAgentInfoDto) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        AgentConfigDto agentConfigDto = objectMapper.readValue(dfxAgentInfoDto.getSettingsData(), new TypeReference<AgentConfigDto>(){});
        dfxAgentInfoMapper.deleteDfxDropboxByAgentId(dfxAgentInfoDto);
        List<AgentConfigDto.DropBox> dropBoxList = agentConfigDto.getDropBoxConfig().getDropBoxList();
        if(dropBoxList != null && dropBoxList.size() > 0) {
            for(AgentConfigDto.DropBox dropBox : dropBoxList) {
                DfxDropboxDto dfxDropboxDto = DfxDropboxDto.builder().agentId(dfxAgentInfoDto.getAgentId())
                        .dropboxId(dropBox.getDropBoxId()).dataSourceId(dropBox.getDataSourceId()).sqlId(dropBox.getSqlId())
                        .taskTypeCode(dropBox.getTaskType().name()).description(dropBox.getDescription())
                        .build();
                dfxAgentInfoMapper.insertDfxDropbox(dfxDropboxDto);
            }
        }
        dfxAgentInfoMapper.deleteDfxPostmanByAgentId(dfxAgentInfoDto);
        List<AgentConfigDto.Postman> postmanList = agentConfigDto.getPostmanConfig().getPostmanList();
        if(postmanList != null && postmanList.size() > 0) {
            for(AgentConfigDto.Postman postman : postmanList) {
                DfxPostmanDto dfxPostmanDto = DfxPostmanDto.builder().agentId(dfxAgentInfoDto.getAgentId()).postmanId(postman.getPostmanId())
                        .postmanTaskTypeCode(postman.getTaskType().name()).postmanActionTypeCode(postman.getAction().getType().name())
                        .postmanActionCron(postman.getAction().getCron()).dataSourceId(postman.getMessage().getDataSourceId())
                        .sqlId(postman.getMessage().getSqlId()).postProcessingSqlId(postman.getMessage().getPostProcessingSqlId())
                        .recipientAgentId(postman.getRecipientHostId()).recipientDropboxId(postman.getRecipientDropBoxId())
                        .description(postman.getDescription())
                        .build();
                dfxAgentInfoMapper.insertDfxPostman(dfxPostmanDto);
            }
        }
    }

    public AgentConfigDto getDfxAgentConfigDto(String agentId) throws JsonProcessingException {
        DfxAgentInfoDto dfxAgentInfoDto = null;
        dfxAgentInfoDto = dfxAgentInfoMapper.selectDfxAgentInfoByAgentId(DfxAgentInfoDto.builder().agentId(agentId).build());
        ObjectMapper objectMapper = new ObjectMapper();
        AgentConfigDto agentConfigDto = objectMapper.readValue(dfxAgentInfoDto.getSettingsData(), new TypeReference<AgentConfigDto>() {});
        return agentConfigDto;
    }
}
