package dev.lions.unionflow.server.entity;

import jakarta.persistence.*;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * Entité représentant une alerte LCB-FT (Lutte Contre le Blanchiment et Financement du Terrorisme).
 * Les alertes sont générées automatiquement lors de transactions dépassant les seuils configurés.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-03-15
 */
@Entity
@Table(name = "alertes_lcb_ft", indexes = {
    @Index(name = "idx_alerte_lcb_ft_organisation", columnList = "organisation_id"),
    @Index(name = "idx_alerte_lcb_ft_type", columnList = "type_alerte"),
    @Index(name = "idx_alerte_lcb_ft_date", columnList = "date_alerte"),
    @Index(name = "idx_alerte_lcb_ft_traitee", columnList = "traitee")
})
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AlerteLcbFt extends BaseEntity {

    /**
     * Organisation concernée par l'alerte
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "organisation_id", nullable = false)
    private Organisation organisation;

    /**
     * Membre concerné par l'alerte
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "membre_id")
    private Membre membre;

    /**
     * Type d'alerte : SEUIL_DEPASSE, JUSTIFICATION_MANQUANTE, etc.
     */
    @Column(name = "type_alerte", nullable = false, length = 50)
    private String typeAlerte;

    /**
     * Date et heure de génération de l'alerte
     */
    @Column(name = "date_alerte", nullable = false)
    private LocalDateTime dateAlerte;

    /**
     * Description de l'alerte
     */
    @Column(name = "description", length = 500)
    private String description;

    /**
     * Détails supplémentaires (JSON ou texte)
     */
    @Column(name = "details", columnDefinition = "TEXT")
    private String details;

    /**
     * Montant de la transaction ayant généré l'alerte
     */
    @Column(name = "montant", precision = 15, scale = 2)
    private BigDecimal montant;

    /**
     * Seuil qui a été dépassé
     */
    @Column(name = "seuil", precision = 15, scale = 2)
    private BigDecimal seuil;

    /**
     * Type d'opération : DEPOT, RETRAIT, TRANSFERT, etc.
     */
    @Column(name = "type_operation", length = 50)
    private String typeOperation;

    /**
     * Référence de la transaction concernée (UUID)
     */
    @Column(name = "transaction_ref", length = 100)
    private String transactionRef;

    /**
     * Niveau de gravité : INFO, WARNING, CRITICAL
     */
    @Column(name = "severite", nullable = false, length = 20)
    private String severite;

    /**
     * Indique si l'alerte a été traitée
     */
    @Builder.Default
    @Column(name = "traitee", nullable = false)
    private Boolean traitee = false;

    /**
     * Date de traitement de l'alerte
     */
    @Column(name = "date_traitement")
    private LocalDateTime dateTraitement;

    /**
     * Utilisateur ayant traité l'alerte
     */
    @Column(name = "traite_par")
    private UUID traitePar;

    /**
     * Commentaire sur le traitement
     */
    @Column(name = "commentaire_traitement", columnDefinition = "TEXT")
    private String commentaireTraitement;
}
