package dev.lions.unionflow.server.api.dto.solidarite.response;

import dev.lions.unionflow.server.api.dto.base.BaseResponse;
import dev.lions.unionflow.server.api.dto.solidarite.ContactProposantDTO;
import dev.lions.unionflow.server.api.dto.solidarite.CreneauDisponibiliteDTO;
import dev.lions.unionflow.server.api.dto.solidarite.CritereSelectionDTO;
import dev.lions.unionflow.server.api.enums.solidarite.StatutProposition;
import dev.lions.unionflow.server.api.enums.solidarite.TypeAide;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * Réponse détaillée pour une proposition d'aide.
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PropositionAideResponse extends BaseResponse {

    private String numeroReference;
    private TypeAide typeAide;
    private String titre;
    private String description;
    private String conditions;
    private BigDecimal montantMaximum;
    private Integer nombreMaxBeneficiaires;
    private String devise;

    private String proposantId;
    private String proposantNom;
    private String organisationId;
    private String demandeAideId;

    private StatutProposition statut;
    private Boolean estDisponible;
    private Boolean estRecurrente;
    private String frequenceRecurrence;

    private LocalDateTime dateExpiration;
    private Integer delaiReponseHeures;

    private List<CritereSelectionDTO> criteresSelection;
    private List<String> zonesGeographiques;
    private List<String> groupesCibles;
    private List<String> competencesRessources;

    private ContactProposantDTO contactProposant;
    private List<CreneauDisponibiliteDTO> creneauxDisponibilite;
    private String modeContactPrefere;

    private Integer nombreDemandesTraitees;
    private Integer nombreBeneficiairesAides;
    private Double montantTotalVerse;
    private Double noteMoyenne;
    private Integer nombreEvaluations;

    private List<String> tags;
    private Map<String, Object> donneesPersonnalisees;
    private Boolean estMiseEnAvant;
    private Double scorePertinence;
    private Integer nombreVues;
    private Integer nombreCandidatures;

    // === MÉTHODES UTILITAIRES ===

    public boolean isActiveEtDisponible() {
        return statut == StatutProposition.ACTIVE && estDisponible && !isExpiree();
    }

    public boolean isExpiree() {
        return dateExpiration != null && LocalDateTime.now().isAfter(dateExpiration);
    }

    public boolean peutAccepterBeneficiaires() {
        return isActiveEtDisponible() && nombreBeneficiairesAides < nombreMaxBeneficiaires;
    }

    public double getPourcentageCapaciteUtilisee() {
        if (nombreMaxBeneficiaires == null || nombreMaxBeneficiaires == 0)
            return 100.0;
        return (nombreBeneficiairesAides * 100.0) / nombreMaxBeneficiaires;
    }

    public int getPlacesRestantes() {
        if (nombreMaxBeneficiaires == null)
            return 0;
        return Math.max(0, nombreMaxBeneficiaires - (nombreBeneficiairesAides != null ? nombreBeneficiairesAides : 0));
    }
}
