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

import dev.lions.unionflow.server.entity.BaseEntity;
import dev.lions.unionflow.server.entity.Organisation;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDate;

@Entity
@Table(name = "parametres_financiers_mutuelle", indexes = {
        @Index(name = "idx_pfm_org", columnList = "organisation_id", unique = true)
})
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class ParametresFinanciersMutuelle extends BaseEntity {

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "organisation_id", nullable = false, unique = true)
    private Organisation organisation;

    /** Valeur nominale par défaut d'une part sociale */
    @NotNull
    @Column(name = "valeur_nominale_par_defaut", nullable = false, precision = 19, scale = 4)
    @Builder.Default
    private BigDecimal valeurNominaleParDefaut = new BigDecimal("5000");

    /** Taux d'intérêt annuel sur l'épargne, ex: 0.03 = 3% */
    @NotNull
    @Column(name = "taux_interet_annuel_epargne", nullable = false, precision = 6, scale = 4)
    @Builder.Default
    private BigDecimal tauxInteretAnnuelEpargne = new BigDecimal("0.03");

    /** Taux de dividende annuel sur les parts sociales, ex: 0.05 = 5% */
    @NotNull
    @Column(name = "taux_dividende_parts_annuel", nullable = false, precision = 6, scale = 4)
    @Builder.Default
    private BigDecimal tauxDividendePartsAnnuel = new BigDecimal("0.05");

    /** MENSUEL | TRIMESTRIEL | ANNUEL */
    @NotNull
    @Column(name = "periodicite_calcul", nullable = false, length = 20)
    @Builder.Default
    private String periodiciteCalcul = "MENSUEL";

    /** Solde minimum en dessous duquel les intérêts ne s'appliquent pas */
    @Column(name = "seuil_min_epargne_interets", precision = 19, scale = 4)
    @Builder.Default
    private BigDecimal seuilMinEpargneInterets = BigDecimal.ZERO;

    /** Date du prochain calcul planifié */
    @Column(name = "prochaine_calcul_interets")
    private LocalDate prochaineCalculInterets;

    /** Date du dernier calcul effectué */
    @Column(name = "dernier_calcul_interets")
    private LocalDate dernierCalculInterets;

    /** Nombre de comptes traités lors du dernier calcul */
    @Column(name = "dernier_nb_comptes_traites")
    @Builder.Default
    private Integer dernierNbComptesTraites = 0;
}
