package dev.lions.unionflow.server.api.dto.base;

import java.time.LocalDateTime;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;

/**
 * Classe de base pour les DTOs de réponse.
 *
 * <p>
 * Contient les champs d'audit communs à toutes
 * les réponses : identifiant, dates de
 * création/modification, créateur, et version.
 *
 * <p>
 * Les DTOs de type Request ne doivent
 * <b>pas</b> hériter de cette classe (utiliser
 * des {@code record} sans héritage).
 *
 * @author UnionFlow Team
 * @version 3.0
 * @since 2026-02-21
 */
@Getter
@Setter
public abstract class BaseResponse {

    /** Identifiant unique de l'entité. */
    private UUID id;

    /** Date de création de l'entité. */
    private LocalDateTime dateCreation;

    /** Date de dernière modification. */
    private LocalDateTime dateModification;

    /** Email du créateur. */
    private String creePar;

    /** Email du dernier modificateur. */
    private String modifiePar;

    /** Version pour l'optimistic locking. */
    private Long version;

    /** État actif/inactif (soft-delete). */
    private Boolean actif;

    /**
     * Comparaison basée sur l'ID.
     * Deux BaseResponse sont égaux si leurs IDs sont égaux et non null.
     *
     * @param obj Objet à comparer
     * @return true si les objets ont le même ID
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }

        BaseResponse that = (BaseResponse) obj;
        return id != null && id.equals(that.id);
    }

    /**
     * Hash code basé sur l'ID.
     *
     * @return Hash code de l'ID, ou 0 si ID null
     */
    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
}
