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.MobileDataCaracteristiqueBatiment;
import io.gmss.fiscad.entities.metadata.MobileDataEnquete;
import io.gmss.fiscad.entities.rfu.metier.CaracteristiqueBatiment;
import io.gmss.fiscad.entities.rfu.metier.EnqueteBatiment;
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.CaracteristiqueBatimentPaylod;
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.MobileDataCaracteristiqueBatimentRepository;
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 CaracteristiqueBatimentAsyncWorker {
    private final TpeRepository tpeRepository;
    private final MobileDataCaracteristiqueBatimentRepository mobileDataCaracteristiqueBatimentRepository;
    private final EnqueteRepository enqueteRepository;
    private final CaracteristiqueRepository caracteristiqueRepository;
    private final EnqueteBatimentRepository enqueteBatimentRepository;
    private final CaracteristiqueBatimentRepository caracteristiqueBatimentRepository;
    private final LogService logService;
   // @Async("caracteristiqueBatimentExecutor")
    public void traitementAsyncCaracteristiqueBatiment(MobileDataCaracteristiqueBatiment mobileDataCaracteristiqueBatiment) {
        CaracteristiqueBatimentPaylod caracteristiqueBatimentPaylod = mobileDataCaracteristiqueBatiment.getCaracteristiqueBatimentPaylod();
        try {
            if (caracteristiqueBatimentPaylod.getTerminalId() == null) {
                logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEBATIMENT, "Problème de terminal", "terminal non fourni : ", mobileDataCaracteristiqueBatiment.getId());
                return;
            } else {
                Optional<Tpe> optionalTpe = tpeRepository.findById(caracteristiqueBatimentPaylod.getTerminalId());
                if (optionalTpe.isEmpty()) {
                    logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEBATIMENT, "Problème de terminal", "terminal inexistant : ", mobileDataCaracteristiqueBatiment.getId());
                    return;
                }
            }

            if (caracteristiqueBatimentPaylod.getEnqueteBatimentId() == null) {
                logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEBATIMENT, "Problème de enquete batiment", "enquete non fourni : ", mobileDataCaracteristiqueBatiment.getId());
                return;
            } else {
                Optional<EnqueteBatiment> optionalEnqueteBatiment = enqueteBatimentRepository.findFirstByExternalKeyAndTerminal_Id(caracteristiqueBatimentPaylod.getEnqueteBatimentId(), caracteristiqueBatimentPaylod.getTerminalId());
                if (optionalEnqueteBatiment.isEmpty()) {
                    logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEBATIMENT, "Problème de enquete batiment", "L'enquete précisée n'existe pas : ", mobileDataCaracteristiqueBatiment.getId());
                    return;
                }
            }
            CaracteristiqueBatiment caracteristiqueBatiment = new CaracteristiqueBatiment();
            caracteristiqueBatiment.setMobileDataId(mobileDataCaracteristiqueBatiment.getId());
            caracteristiqueBatiment = getCaracteristiqueBatimentFromCaracteristiqueBatimentPayLoad(caracteristiqueBatiment, caracteristiqueBatimentPaylod);
            caracteristiqueBatimentRepository.save(caracteristiqueBatiment);
            mobileDataCaracteristiqueBatiment.setTraiter(true);
            mobileDataCaracteristiqueBatimentRepository.save(mobileDataCaracteristiqueBatiment);
        } catch (Exception e) {
            logService.logTraiementAsync(TypeObjet.CARACTERISTIQUEBATIMENT, "Problème de inattendu", e.getMessage(), mobileDataCaracteristiqueBatiment.getId());
        }
    }

    private CaracteristiqueBatiment getCaracteristiqueBatimentFromCaracteristiqueBatimentPayLoad(CaracteristiqueBatiment caracteristiqueBatiment, CaracteristiqueBatimentPaylod caracteristiqueBatimentPaylod) {


        if (caracteristiqueBatimentPaylod.getEnqueteBatimentId() != null) {
            Optional<EnqueteBatiment> optionalEnqueteBatiment = enqueteBatimentRepository.findFirstByExternalKeyAndTerminal_Id(caracteristiqueBatimentPaylod.getEnqueteBatimentId(), caracteristiqueBatimentPaylod.getTerminalId());
            caracteristiqueBatiment.setEnqueteBatiment(optionalEnqueteBatiment.orElse(null));
        }

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

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


        if (caracteristiqueBatimentPaylod.getTerminalId() != null && caracteristiqueBatimentPaylod.getEnqueteId() != null) {
            Optional<Enquete> optionalEnquete = enqueteRepository.findFirstByExternalKeyAndTerminal_Id(caracteristiqueBatimentPaylod.getEnqueteId(), caracteristiqueBatimentPaylod.getTerminalId());
            if (optionalEnquete.isPresent()) {
                caracteristiqueBatiment.setEnqueteId(optionalEnquete.get().getId());
            }
        }
        caracteristiqueBatiment.setEnqueteBatimentExternalKey(caracteristiqueBatimentPaylod.getEnqueteBatimentId());
        caracteristiqueBatiment.setEnqueteExternalKey(caracteristiqueBatimentPaylod.getEnqueteId());
        caracteristiqueBatiment.setValeur(caracteristiqueBatimentPaylod.getValeur());
        caracteristiqueBatiment.setExternalKey(caracteristiqueBatimentPaylod.getExternalKey());
        return caracteristiqueBatiment;

    }

}
