package dev.lions.unionflow.client.dto;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;

public class FormulaireDTO implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private UUID id;
    
    @NotNull
    private String nom;
    
    private String description;
    
    @NotNull
    @Positive
    private Integer quotaMaxMembres;
    
    @NotNull
    private BigDecimal prixMensuel;
    
    @NotNull
    private BigDecimal prixAnnuel;
    
    private String deviseCode = "XOF"; // Franc CFA
    
    private boolean actif = true;
    
    private boolean recommande = false;
    
    private String couleurTheme;
    
    private String iconeFormulaire;
    
    // Fonctionnalités incluses
    private boolean gestionMembres = true;
    private boolean gestionCotisations = true;
    private boolean gestionEvenements = false;
    private boolean gestionAides = false;
    private boolean rapportsAvances = false;
    private boolean supportPrioritaire = false;
    private boolean sauvegardeAutomatique = false;
    private boolean personnalisationAvancee = false;
    private boolean integrationPaiement = false;
    private boolean notificationsEmail = false;
    private boolean notificationsSMS = false;
    private boolean gestionDocuments = false;
    
    // Métadonnées
    private LocalDateTime dateCreation;
    private LocalDateTime dateMiseAJour;
    private String creePar;
    private String modifiePar;
    
    public FormulaireDTO() {}
    
    // Getters et Setters
    public UUID getId() { return id; }
    public void setId(UUID id) { this.id = id; }
    
    public String getNom() { return nom; }
    public void setNom(String nom) { this.nom = nom; }
    
    public String getDescription() { return description; }
    public void setDescription(String description) { this.description = description; }
    
    public Integer getQuotaMaxMembres() { return quotaMaxMembres; }
    public void setQuotaMaxMembres(Integer quotaMaxMembres) { this.quotaMaxMembres = quotaMaxMembres; }
    
    public BigDecimal getPrixMensuel() { return prixMensuel; }
    public void setPrixMensuel(BigDecimal prixMensuel) { this.prixMensuel = prixMensuel; }
    
    public BigDecimal getPrixAnnuel() { return prixAnnuel; }
    public void setPrixAnnuel(BigDecimal prixAnnuel) { this.prixAnnuel = prixAnnuel; }
    
    public String getDeviseCode() { return deviseCode; }
    public void setDeviseCode(String deviseCode) { this.deviseCode = deviseCode; }
    
    public boolean isActif() { return actif; }
    public void setActif(boolean actif) { this.actif = actif; }
    
    public boolean isRecommande() { return recommande; }
    public void setRecommande(boolean recommande) { this.recommande = recommande; }
    
    public String getCouleurTheme() { return couleurTheme; }
    public void setCouleurTheme(String couleurTheme) { this.couleurTheme = couleurTheme; }
    
    public String getIconeFormulaire() { return iconeFormulaire; }
    public void setIconeFormulaire(String iconeFormulaire) { this.iconeFormulaire = iconeFormulaire; }
    
    // Fonctionnalités
    public boolean isGestionMembres() { return gestionMembres; }
    public void setGestionMembres(boolean gestionMembres) { this.gestionMembres = gestionMembres; }
    
    public boolean isGestionCotisations() { return gestionCotisations; }
    public void setGestionCotisations(boolean gestionCotisations) { this.gestionCotisations = gestionCotisations; }
    
    public boolean isGestionEvenements() { return gestionEvenements; }
    public void setGestionEvenements(boolean gestionEvenements) { this.gestionEvenements = gestionEvenements; }
    
    public boolean isGestionAides() { return gestionAides; }
    public void setGestionAides(boolean gestionAides) { this.gestionAides = gestionAides; }
    
    public boolean isRapportsAvances() { return rapportsAvances; }
    public void setRapportsAvances(boolean rapportsAvances) { this.rapportsAvances = rapportsAvances; }
    
    public boolean isSupportPrioritaire() { return supportPrioritaire; }
    public void setSupportPrioritaire(boolean supportPrioritaire) { this.supportPrioritaire = supportPrioritaire; }
    
    public boolean isSauvegardeAutomatique() { return sauvegardeAutomatique; }
    public void setSauvegardeAutomatique(boolean sauvegardeAutomatique) { this.sauvegardeAutomatique = sauvegardeAutomatique; }
    
    public boolean isPersonnalisationAvancee() { return personnalisationAvancee; }
    public void setPersonnalisationAvancee(boolean personnalisationAvancee) { this.personnalisationAvancee = personnalisationAvancee; }
    
    public boolean isIntegrationPaiement() { return integrationPaiement; }
    public void setIntegrationPaiement(boolean integrationPaiement) { this.integrationPaiement = integrationPaiement; }
    
    public boolean isNotificationsEmail() { return notificationsEmail; }
    public void setNotificationsEmail(boolean notificationsEmail) { this.notificationsEmail = notificationsEmail; }
    
    public boolean isNotificationsSMS() { return notificationsSMS; }
    public void setNotificationsSMS(boolean notificationsSMS) { this.notificationsSMS = notificationsSMS; }
    
    public boolean isGestionDocuments() { return gestionDocuments; }
    public void setGestionDocuments(boolean gestionDocuments) { this.gestionDocuments = gestionDocuments; }
    
    // Métadonnées
    public LocalDateTime getDateCreation() { return dateCreation; }
    public void setDateCreation(LocalDateTime dateCreation) { this.dateCreation = dateCreation; }
    
    public LocalDateTime getDateMiseAJour() { return dateMiseAJour; }
    public void setDateMiseAJour(LocalDateTime dateMiseAJour) { this.dateMiseAJour = dateMiseAJour; }
    
    public String getCreePar() { return creePar; }
    public void setCreePar(String creePar) { this.creePar = creePar; }
    
    public String getModifiePar() { return modifiePar; }
    public void setModifiePar(String modifiePar) { this.modifiePar = modifiePar; }
    
    // Méthodes utilitaires
    public String getPrixMensuelFormat() {
        return String.format("%,.0f %s", prixMensuel, deviseCode);
    }
    
    public String getPrixAnnuelFormat() {
        return String.format("%,.0f %s", prixAnnuel, deviseCode);
    }
    
    public BigDecimal getEconomieAnnuelle() {
        if (prixMensuel != null && prixAnnuel != null) {
            BigDecimal coutMensuelAnnuel = prixMensuel.multiply(BigDecimal.valueOf(12));
            return coutMensuelAnnuel.subtract(prixAnnuel);
        }
        return BigDecimal.ZERO;
    }
    
    public String getEconomieAnnuelleFormat() {
        BigDecimal economie = getEconomieAnnuelle();
        return String.format("%,.0f %s", economie, deviseCode);
    }
    
    public int getPourcentageEconomie() {
        if (prixMensuel != null && prixAnnuel != null) {
            BigDecimal coutMensuelAnnuel = prixMensuel.multiply(BigDecimal.valueOf(12));
            BigDecimal economie = getEconomieAnnuelle();
            if (coutMensuelAnnuel.compareTo(BigDecimal.ZERO) > 0) {
                return economie.multiply(BigDecimal.valueOf(100))
                              .divide(coutMensuelAnnuel, 0, java.math.RoundingMode.HALF_UP)
                              .intValue();
            }
        }
        return 0;
    }
}