package dev.lions.unionflow.server.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import lombok.*;

/**
 * Paramètres de cotisation configurés par le manager de chaque organisation.
 *
 * <p>
 * Le manager peut définir :
 * <ul>
 * <li>Le montant mensuel et annuel fixé pour tous les membres</li>
 * <li>La date de départ du calcul des impayés (configurable)</li>
 * <li>Le délai en jours avant passage automatique en statut INACTIF</li>
 * </ul>
 *
 * <p>
 * Table : {@code parametres_cotisation_organisation}
 */
@Entity
@Table(name = "parametres_cotisation_organisation", indexes = {
    @Index(name = "idx_param_cot_org", columnList = "organisation_id", unique = true)
})
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class ParametresCotisationOrganisation extends BaseEntity {

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

  @Builder.Default
  @DecimalMin("0.00")
  @Digits(integer = 10, fraction = 2)
  @Column(name = "montant_cotisation_mensuelle", precision = 12, scale = 2)
  private BigDecimal montantCotisationMensuelle = BigDecimal.ZERO;

  @Builder.Default
  @DecimalMin("0.00")
  @Digits(integer = 10, fraction = 2)
  @Column(name = "montant_cotisation_annuelle", precision = 12, scale = 2)
  private BigDecimal montantCotisationAnnuelle = BigDecimal.ZERO;

  @Column(name = "devise", nullable = false, length = 3)
  private String devise;

  /**
   * Date de référence pour le calcul des membres «à jour».
   * Toutes les échéances depuis cette date doivent être payées.
   * Configurable par le manager.
   */
  @Column(name = "date_debut_calcul_ajour")
  private LocalDate dateDebutCalculAjour;

  /**
   * Nombre de jours de retard avant passage automatique du statut membre →
   * INACTIF.
   * Défaut : 30 jours.
   */
  @Builder.Default
  @Min(1)
  @Column(name = "delai_retard_avant_inactif_jours", nullable = false)
  private Integer delaiRetardAvantInactifJours = 30;

  @Builder.Default
  @Column(name = "cotisation_obligatoire", nullable = false)
  private Boolean cotisationObligatoire = true;

  /**
   * Active la génération automatique mensuelle des cotisations pour cette organisation.
   * Quand {@code true}, un job planifié crée automatiquement une cotisation par membre actif
   * le 1er de chaque mois, en utilisant les barèmes par rôle ou le montant par défaut.
   */
  @Builder.Default
  @Column(name = "generation_automatique_activee", nullable = false)
  private Boolean generationAutomatiqueActivee = false;

  // ── Méthodes métier ────────────────────────────────────────────────────────

  /**
   * Vérifie si la date de référence pour les impayés est définie.
   * Sans cette date, aucun calcul d'ancienneté des impayés n'est possible.
   */
  public boolean isCalculAjourActive() {
    return dateDebutCalculAjour != null;
  }
}
