package dev.lions.unionflow.server.entity;

import dev.lions.unionflow.server.api.enums.solidarite.TypeWorkflow;
import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import lombok.*;

/**
 * Configuration du workflow de validation pour une organisation.
 *
 * <p>Maximum 3 étapes ordonnées. Chaque étape requiert un rôle spécifique.
 * Exemple Mutuelle Y : Secrétaire (étape 1) → Trésorier (étape 2) → Président (étape 3).
 *
 * <p>Table : {@code workflow_validation_config}
 */
@Entity
@Table(
    name = "workflow_validation_config",
    indexes = {
      @Index(name = "idx_wf_organisation", columnList = "organisation_id"),
      @Index(name = "idx_wf_type",         columnList = "type_workflow")
    },
    uniqueConstraints = {
      @UniqueConstraint(
          name = "uk_wf_org_type_etape",
          columnNames = {"organisation_id", "type_workflow", "etape_numero"})
    })
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
public class WorkflowValidationConfig extends BaseEntity {

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

  @Enumerated(EnumType.STRING)
  @NotNull
  @Builder.Default
  @Column(name = "type_workflow", nullable = false, length = 30)
  private TypeWorkflow typeWorkflow = TypeWorkflow.DEMANDE_AIDE;

  /** Numéro d'ordre de l'étape (1, 2 ou 3) */
  @NotNull
  @Min(1) @Max(3)
  @Column(name = "etape_numero", nullable = false)
  private Integer etapeNumero;

  /** Rôle nécessaire pour valider cette étape */
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "role_requis_id")
  private Role roleRequis;

  @NotBlank
  @Column(name = "libelle_etape", nullable = false, length = 200)
  private String libelleEtape;

  /** Délai maximum en heures avant expiration automatique (SLA) */
  @Builder.Default
  @Min(1)
  @Column(name = "delai_max_heures", nullable = false)
  private Integer delaiMaxHeures = 72;
}
