package dev.lions.unionflow.server.service.mutuelle;

import dev.lions.unionflow.server.api.dto.mutuelle.financier.ParametresFinanciersMutuellRequest;
import dev.lions.unionflow.server.api.dto.mutuelle.financier.ParametresFinanciersMutuellResponse;
import dev.lions.unionflow.server.entity.Organisation;
import dev.lions.unionflow.server.entity.mutuelle.ParametresFinanciersMutuelle;
import dev.lions.unionflow.server.repository.OrganisationRepository;
import dev.lions.unionflow.server.repository.mutuelle.ParametresFinanciersMutuellRepository;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.NotFoundException;

import java.time.LocalDate;
import java.util.UUID;

@ApplicationScoped
public class ParametresFinanciersService {

    @Inject ParametresFinanciersMutuellRepository repo;
    @Inject OrganisationRepository organisationRepository;

    public ParametresFinanciersMutuellResponse getByOrganisation(UUID orgId) {
        ParametresFinanciersMutuelle p = repo.findByOrganisation(orgId)
                .orElseThrow(() -> new NotFoundException("Aucun paramètre financier pour cette organisation."));
        return toDto(p);
    }

    @Transactional
    public ParametresFinanciersMutuellResponse creerOuMettrAJour(ParametresFinanciersMutuellRequest req) {
        Organisation org = organisationRepository.findByIdOptional(UUID.fromString(req.getOrganisationId()))
                .orElseThrow(() -> new NotFoundException("Organisation introuvable: " + req.getOrganisationId()));

        ParametresFinanciersMutuelle params = repo.findByOrganisation(org.getId())
                .orElseGet(() -> ParametresFinanciersMutuelle.builder().organisation(org).build());

        params.setValeurNominaleParDefaut(req.getValeurNominaleParDefaut());
        params.setTauxInteretAnnuelEpargne(req.getTauxInteretAnnuelEpargne());
        params.setTauxDividendePartsAnnuel(req.getTauxDividendePartsAnnuel());
        params.setPeriodiciteCalcul(req.getPeriodiciteCalcul().toUpperCase());
        if (req.getSeuilMinEpargneInterets() != null) {
            params.setSeuilMinEpargneInterets(req.getSeuilMinEpargneInterets());
        }
        if (params.getProchaineCalculInterets() == null) {
            params.setProchaineCalculInterets(LocalDate.now().plusMonths(1));
        }

        repo.persist(params);
        return toDto(params);
    }

    private ParametresFinanciersMutuellResponse toDto(ParametresFinanciersMutuelle p) {
        return ParametresFinanciersMutuellResponse.builder()
                .organisationId(p.getOrganisation().getId().toString())
                .organisationNom(p.getOrganisation().getNom())
                .valeurNominaleParDefaut(p.getValeurNominaleParDefaut())
                .tauxInteretAnnuelEpargne(p.getTauxInteretAnnuelEpargne())
                .tauxDividendePartsAnnuel(p.getTauxDividendePartsAnnuel())
                .periodiciteCalcul(p.getPeriodiciteCalcul())
                .seuilMinEpargneInterets(p.getSeuilMinEpargneInterets())
                .prochaineCalculInterets(p.getProchaineCalculInterets())
                .dernierCalculInterets(p.getDernierCalculInterets())
                .dernierNbComptesTraites(p.getDernierNbComptesTraites())
                .build();
    }
}
