package fr.titionfire.ffsaf.rest.client;

import fr.titionfire.ffsaf.rest.data.AssoData;
import fr.titionfire.ffsaf.rest.data.UniteLegaleRoot;
import io.quarkus.cache.CacheResult;
import io.smallrye.mutiny.Uni;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

@Path("/")
@RegisterRestClient
public interface StateIdService {

    @GET
    @Path("/associations/{rna}")
    @CacheResult(cacheName = "AssoData_rna")
    Uni<AssoData> get_rna(@PathParam("rna") String rna);

    default Uni<AssoData> getAssoDataFromUnit(UniteLegaleRoot u) {
        AssoData assoData = new AssoData();
        assoData.setSiren(u.getUnite_legale().getSiren());
        assoData.setRna(u.getUnite_legale().getIdentifiant_association());

        AssoData.Identite identite = new AssoData.Identite();
        identite.setNom(u.getUnite_legale().getDenomination());
        identite.setSiret_siege(u.getUnite_legale().getEtablissement_siege().getSiret());
        assoData.setIdentite(identite);

        AssoData.Address address = new AssoData.Address();
        StringBuilder voie = new StringBuilder();
        if (u.getUnite_legale().getEtablissement_siege().getNumero_voie() != null)
            voie.append(u.getUnite_legale().getEtablissement_siege().getNumero_voie()).append(' ');
        if (u.getUnite_legale().getEtablissement_siege().getType_voie() != null)
            voie.append(u.getUnite_legale().getEtablissement_siege().getType_voie()).append(' ');
        if (u.getUnite_legale().getEtablissement_siege().getLibelle_voie() != null)
            voie.append(u.getUnite_legale().getEtablissement_siege().getLibelle_voie()).append(' ');
        address.setVoie(voie.toString().trim());
        address.setComplement(u.getUnite_legale().getEtablissement_siege().getComplement_adresse());
        address.setCode_postal(u.getUnite_legale().getEtablissement_siege().getCode_postal());
        address.setCommune(
                new AssoData.Commune(u.getUnite_legale().getEtablissement_siege().getLibelle_commune()));
        assoData.setCoordonnees(new AssoData.Coordonnee(address));

        return Uni.createFrom().item(assoData);
    }
}
