package dev.lions.unionflow.server.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import java.time.LocalDateTime;
import lombok.*;

/**
 * Module activé pour une organisation donnée.
 *
 * <p>
 * Les modules sont activés automatiquement selon le type d'organisation
 * lors de la première souscription, et peuvent être désactivés par le manager.
 *
 * <p>
 * Table : {@code modules_organisation_actifs}
 */
@Entity
@Table(name = "modules_organisation_actifs", indexes = {
    @Index(name = "idx_moa_organisation", columnList = "organisation_id"),
    @Index(name = "idx_moa_module", columnList = "module_code")
}, uniqueConstraints = {
    @UniqueConstraint(name = "uk_moa_org_module", columnNames = { "organisation_id", "module_code" })
})
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class ModuleOrganisationActif extends BaseEntity {

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

  @NotBlank
  @Column(name = "module_code", nullable = false, length = 50)
  private String moduleCode;

  /**
   * Référence vers le catalogue des modules.
   * Assure l'intégrité référentielle avec
   * {@code modules_disponibles}.
   */
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "module_disponible_id")
  private ModuleDisponible moduleDisponible;

  @Builder.Default
  @Column(name = "date_activation", nullable = false)
  private LocalDateTime dateActivation = LocalDateTime.now();

  /**
   * Configuration JSON spécifique au module pour cette organisation.
   * Exemple pour CREDIT_EPARGNE : {"taux_interet_max": 18, "duree_max_mois": 24}
   */
  @Column(name = "parametres", columnDefinition = "TEXT")
  private String parametres;

  public boolean isActif() {
    return Boolean.TRUE.equals(getActif());
  }
}
