package dev.lions.unionflow.server.entity;

import jakarta.persistence.*;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * Classe de base pour les entités UnionFlow utilisant UUID comme identifiant
 * 
 * <p>Remplace PanacheEntity pour utiliser UUID au lieu de Long comme ID.
 * Fournit les fonctionnalités de base de Panache avec UUID.
 * 
 * @author UnionFlow Team
 * @version 2.0
 * @since 2025-01-16
 */
@MappedSuperclass
public abstract class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    @Column(name = "id", updatable = false, nullable = false)
    private UUID id;

    @Column(name = "date_creation", nullable = false, updatable = false)
    protected LocalDateTime dateCreation;

    @Column(name = "date_modification")
    protected LocalDateTime dateModification;

    @Column(name = "cree_par", length = 255)
    protected String creePar;

    @Column(name = "modifie_par", length = 255)
    protected String modifiePar;

    @Version
    @Column(name = "version")
    protected Long version;

    @Column(name = "actif", nullable = false)
    protected Boolean actif = true;

    // Constructeur par défaut
    public BaseEntity() {
        this.dateCreation = LocalDateTime.now();
        this.actif = true;
        this.version = 0L;
    }

    // Getters et Setters
    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    public LocalDateTime getDateCreation() {
        return dateCreation;
    }

    public void setDateCreation(LocalDateTime dateCreation) {
        this.dateCreation = dateCreation;
    }

    public LocalDateTime getDateModification() {
        return dateModification;
    }

    public void setDateModification(LocalDateTime dateModification) {
        this.dateModification = dateModification;
    }

    public String getCreePar() {
        return creePar;
    }

    public void setCreePar(String creePar) {
        this.creePar = creePar;
    }

    public String getModifiePar() {
        return modifiePar;
    }

    public void setModifiePar(String modifiePar) {
        this.modifiePar = modifiePar;
    }

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public Boolean getActif() {
        return actif;
    }

    public void setActif(Boolean actif) {
        this.actif = actif;
    }

    // Callbacks JPA
    @PrePersist
    protected void onCreate() {
        if (this.dateCreation == null) {
            this.dateCreation = LocalDateTime.now();
        }
        if (this.actif == null) {
            this.actif = true;
        }
        if (this.version == null) {
            this.version = 0L;
        }
    }

    @PreUpdate
    protected void onUpdate() {
        this.dateModification = LocalDateTime.now();
    }

    // Méthodes utilitaires Panache-like
    public void persist() {
        // Cette méthode sera implémentée par les repositories ou services
        // Pour l'instant, elle est là pour compatibilité avec le code existant
        throw new UnsupportedOperationException(
            "Utilisez le repository approprié pour persister cette entité");
    }

    public static <T extends BaseEntity> T findById(UUID id) {
        // Cette méthode sera implémentée par les repositories
        throw new UnsupportedOperationException(
            "Utilisez le repository approprié pour rechercher par ID");
    }
}

