package io.gmss.fiscad.service.worker;

import io.gmss.fiscad.entities.infocad.metier.Enquete;
import io.gmss.fiscad.entities.infocad.metier.Parcelle;
import io.gmss.fiscad.entities.infocad.metier.Tpe;
import io.gmss.fiscad.entities.infocad.parametre.Bloc;
import io.gmss.fiscad.entities.metadata.MobileDataCaracteristiqueParcelle;
import io.gmss.fiscad.entities.metadata.MobileDataEnquete;
import io.gmss.fiscad.entities.rfu.metier.CaracteristiqueParcelle;
import io.gmss.fiscad.entities.rfu.parametre.Caracteristique;
import io.gmss.fiscad.entities.rfu.parametre.ZoneRfu;
import io.gmss.fiscad.entities.user.User;
import io.gmss.fiscad.enums.TypeObjet;
import io.gmss.fiscad.paylaods.request.CaracteristiqueParcellePaylod;
import io.gmss.fiscad.paylaods.request.EnquetePayLoad;
import io.gmss.fiscad.repositories.infocad.metier.*;
import io.gmss.fiscad.repositories.infocad.parametre.BlocRepository;
import io.gmss.fiscad.repositories.metadata.MobileDataCaracteristiqueParcelleRepository;
import io.gmss.fiscad.repositories.metadata.MobileDataEnqueteRepository;
import io.gmss.fiscad.repositories.rfu.metier.*;
import io.gmss.fiscad.repositories.rfu.parametre.CaracteristiqueRepository;
import io.gmss.fiscad.repositories.rfu.parametre.ZoneRfuRepository;
import io.gmss.fiscad.repositories.user.UserRepository;
import io.gmss.fiscad.service.LogService;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
@RequiredArgsConstructor
public class CaracteristiqueParcelleAsyncWorker {
    private final TpeRepository tpeRepository;
    private final CaracteristiqueRepository caracteristiqueRepository;
    private final EnqueteRepository enqueteRepository;
    private final MobileDataCaracteristiqueParcelleRepository mobileDataCaracteristiqueParcelleRepository;
    private final CaracteristiqueParcelleRepository caracteristiqueParcelleRepository;
    private final LogService logService;
    //@Async("caracteristiqueParcelleExecutor")
    public void traitementAsyncCaracteristiqueParcelle(MobileDataCaracteristiqueParcelle mobileDataCaracteristiqueParcelle) {
        CaracteristiqueParcellePaylod caracteristiqueParcellePaylod = mobileDataCaracteristiqueParcelle.getCaracteristiqueParcellePaylod();

        try {
            if (caracteristiqueParcellePaylod.getTerminalId() == null) {
                logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEPARCELLE, "Problème de terminal", "terminal non fourni : ", mobileDataCaracteristiqueParcelle.getId());
                return;
            } else {
                Optional<Tpe> optionalTpe = tpeRepository.findById(caracteristiqueParcellePaylod.getTerminalId());
                if (optionalTpe.isEmpty()) {
                    logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEPARCELLE, "Problème de terminal", "terminal inexistant : ", mobileDataCaracteristiqueParcelle.getId());
                    return;
                }
            }

            if (caracteristiqueParcellePaylod.getEnqueteId() == null) {
                logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEPARCELLE, "Problème de enquete", "enquete non fourni : ", mobileDataCaracteristiqueParcelle.getId());
                return;
            } else {
                Optional<Enquete> optionalEnquete = enqueteRepository.findFirstByExternalKeyAndTerminal_Id(caracteristiqueParcellePaylod.getEnqueteId(), caracteristiqueParcellePaylod.getTerminalId());
                if (optionalEnquete.isEmpty()) {
                    logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEPARCELLE, "Problème de enquete", "L'enquete précisée n'existe pas : ", mobileDataCaracteristiqueParcelle.getId());
                    return;
                }
            }
            CaracteristiqueParcelle caracteristiqueParcelle = new CaracteristiqueParcelle();
            caracteristiqueParcelle.setMobileDataId(mobileDataCaracteristiqueParcelle.getId());
            caracteristiqueParcelle = getCaracteristiqueParcelleFromCaracteristiqueParcellePayLoad(caracteristiqueParcelle, caracteristiqueParcellePaylod);
            caracteristiqueParcelleRepository.save(caracteristiqueParcelle);
            mobileDataCaracteristiqueParcelle.setTraiter(true);
            mobileDataCaracteristiqueParcelleRepository.save(mobileDataCaracteristiqueParcelle);
        } catch (Exception e) {
            logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEPARCELLE, "Problème de inattendu", e.getMessage(), mobileDataCaracteristiqueParcelle.getId());
        }
    }

    private CaracteristiqueParcelle getCaracteristiqueParcelleFromCaracteristiqueParcellePayLoad(CaracteristiqueParcelle caracteristiqueParcelle, CaracteristiqueParcellePaylod caracteristiqueParcellePaylod) {

        if (caracteristiqueParcellePaylod.getEnqueteId() != null) {
            Optional<Enquete> optionalEnquete = enqueteRepository.findFirstByExternalKeyAndTerminal_Id(caracteristiqueParcellePaylod.getEnqueteId(), caracteristiqueParcellePaylod.getTerminalId());

            caracteristiqueParcelle.setEnquete(optionalEnquete.orElse(null));
        }

        if (caracteristiqueParcellePaylod.getCaracteristiqueId() != null) {
            Optional<Caracteristique> optionalCaracteristique = caracteristiqueRepository.findById(caracteristiqueParcellePaylod.getCaracteristiqueId());
            caracteristiqueParcelle.setCaracteristique(optionalCaracteristique.orElse(null));
        }

        if (caracteristiqueParcellePaylod.getTerminalId() != null) {
            Optional<Tpe> optionalTpe = tpeRepository.findById(caracteristiqueParcellePaylod.getTerminalId());
            caracteristiqueParcelle.setTerminal(optionalTpe.orElse(null));
        }

        caracteristiqueParcelle.setEnqueteExternalKey(caracteristiqueParcellePaylod.getEnqueteId());
        caracteristiqueParcelle.setValeur(caracteristiqueParcellePaylod.getValeur());
        caracteristiqueParcelle.setExternalKey(caracteristiqueParcellePaylod.getExternalKey());
        return caracteristiqueParcelle;

    }
}

