package org.mte.numecoeval.calculs.infrastructure.service.enrichissement;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.mte.numecoeval.calculs.domain.model.CalculEquipementPhysique;
import org.mte.numecoeval.calculs.infrastructure.client.ReferentielClient;
import org.mte.numecoeval.calculs.referentiels.generated.api.model.HypotheseDTO;
import org.mte.numecoeval.topic.data.EquipementPhysiqueDTO;
import org.springframework.stereotype.Service;

import java.util.ArrayList;

@Slf4j
@Service
@AllArgsConstructor
public class EnrichissementEquipementPhysiqueService {

    private ReferentielClient referentielClient;

    public CalculEquipementPhysique serviceEnrichissementEquipementPhysique(EquipementPhysiqueDTO equipementPhysiqueDTO) {
        if (equipementPhysiqueDTO == null) return null;

        log.debug("{} - {} - {} : Enrichissement d'un équipement physique : Nom Equipement: {}, Type: {}, Modele: {}",
                equipementPhysiqueDTO.getNomOrganisation(), equipementPhysiqueDTO.getNomLot(), equipementPhysiqueDTO.getDateLot(),
                equipementPhysiqueDTO.getNomEquipementPhysique(), equipementPhysiqueDTO.getType(), equipementPhysiqueDTO.getModele());

        CalculEquipementPhysique calculEquipementPhysique = new CalculEquipementPhysique();

        calculEquipementPhysique.setEquipementPhysique(equipementPhysiqueDTO);

        calculEquipementPhysique.setEtapes(referentielClient.getEtapes());
        calculEquipementPhysique.setCriteres(referentielClient.getCriteres());

        var hypotheses = new ArrayList<HypotheseDTO>();
        var hDuree = referentielClient.getHypothese("dureeVieParDefaut");
        var hPue = referentielClient.getHypothese("PUEParDefaut");
        var tuBYOD = referentielClient.getHypothese("taux_utilisation_BYOD");
        var tuCOPE = referentielClient.getHypothese("taux_utilisation_COPE");

        if (hDuree != null) hypotheses.add(hDuree);
        if (hPue != null) hypotheses.add(hPue);
        if (tuBYOD != null) hypotheses.add(tuBYOD);
        if (tuCOPE != null) hypotheses.add(tuCOPE);

        calculEquipementPhysique.setHypotheses(hypotheses);

        calculEquipementPhysique.setCorrespondanceRefEquipement(referentielClient.getCorrespondanceRefEquipement(equipementPhysiqueDTO.getModele()));
        calculEquipementPhysique.setTypeEquipement(referentielClient.getTypeEquipement(equipementPhysiqueDTO.getType()));

        calculEquipementPhysique.setImpactsEquipement(new ArrayList<>());
        calculEquipementPhysique.setImpactsReseau(new ArrayList<>());
        calculEquipementPhysique.setMixElectriques(new ArrayList<>());
        for (var critere : calculEquipementPhysique.getCriteres()) {
            for (var etape : calculEquipementPhysique.getEtapes()) {
                if (calculEquipementPhysique.getCorrespondanceRefEquipement() != null) {
                    calculEquipementPhysique.getImpactsEquipement().add(
                            referentielClient.getImpactEquipement(
                                    calculEquipementPhysique.getCorrespondanceRefEquipement().getRefEquipementCible(),
                                    critere.getNomCritere(),
                                    etape.getCode()
                            )
                    );
                } else if (calculEquipementPhysique.getTypeEquipement() != null
                        && StringUtils.isNotBlank(calculEquipementPhysique.getTypeEquipement().getRefEquipementParDefaut())) {
                    calculEquipementPhysique.getImpactsEquipement().add(
                            referentielClient.getImpactEquipement(
                                    calculEquipementPhysique.getTypeEquipement().getRefEquipementParDefaut(),
                                    critere.getNomCritere(),
                                    etape.getCode()
                            )
                    );
                }
                calculEquipementPhysique.getImpactsReseau().add(
                        referentielClient.getImpactReseau(
                                "impactReseauMobileMoyen",
                                critere.getNomCritere(),
                                etape.getCode()
                        )
                );
            }

            var mixElec = referentielClient.getMixElectrique(equipementPhysiqueDTO.getPaysDUtilisation(), critere.getNomCritere());
            if (mixElec != null) calculEquipementPhysique.getMixElectriques().add(mixElec);

            if (equipementPhysiqueDTO.getDataCenter() != null
                    && StringUtils.isNotBlank(equipementPhysiqueDTO.getDataCenter().getLocalisation())
                    && !StringUtils.equals(equipementPhysiqueDTO.getPaysDUtilisation(), equipementPhysiqueDTO.getDataCenter().getLocalisation())) {

                var mixElecDataCenter = referentielClient.getMixElectrique(equipementPhysiqueDTO.getDataCenter().getLocalisation(), critere.getNomCritere());
                if (mixElecDataCenter != null) calculEquipementPhysique.getMixElectriques().add(mixElecDataCenter);
            }
        }

        return calculEquipementPhysique;
    }
}
