package dev.lions.unionflow.server.entity;

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

/**
 * Barème de cotisation par rôle fonctionnel au sein d'une organisation.
 *
 * <p>Permet de définir des montants différenciés selon le rôle du membre
 * (PRESIDENT, TRESORIER, MEMBRE_ORDINAIRE, etc.).
 *
 * <p>Si aucun barème n'est défini pour un rôle donné, le système utilise
 * le montant par défaut de {@link ParametresCotisationOrganisation}.
 *
 * <p>Table : {@code bareme_cotisation_role}
 */
@Entity
@Table(
    name = "bareme_cotisation_role",
    uniqueConstraints = @UniqueConstraint(
        name = "uq_bareme_cot_org_role",
        columnNames = {"organisation_id", "role_org"}
    )
)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class BaremeCotisationRole extends BaseEntity {

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

  /**
   * Rôle fonctionnel dans l'organisation (ex: PRESIDENT, TRESORIER, SECRETAIRE, MEMBRE_ORDINAIRE).
   * Correspond à {@link dev.lions.unionflow.server.entity.MembreOrganisation#getRoleOrg()}.
   */
  @NotBlank
  @Column(name = "role_org", nullable = false, length = 50)
  private String roleOrg;

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

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

  /** Description optionnelle du barème (ex: "Taux réduit bureau exécutif"). */
  @Column(name = "description", length = 255)
  private String description;
}
