package dev.lions.unionflow.server.util;

import java.util.UUID;

/**
 * Utilitaire pour la conversion entre IDs Long (entités Panache) et UUID (DTOs)
 * 
 * <p><strong>DÉPRÉCIÉ:</strong> Cette classe est maintenant obsolète car toutes les entités
 * utilisent désormais UUID directement. Elle est conservée uniquement pour compatibilité
 * avec d'éventuels anciens scripts de migration de données.
 * 
 * <p>Cette classe fournit des méthodes pour convertir de manière cohérente
 * entre les identifiants Long utilisés par PanacheEntity et les UUID utilisés
 * par les DTOs de l'API.
 * 
 * @author UnionFlow Team
 * @version 1.0
 * @since 2025-01-16
 * @deprecated Depuis la migration UUID complète (2025-01-16). Utilisez directement UUID dans toutes les entités.
 */
@Deprecated(since = "2025-01-16", forRemoval = true)
public final class IdConverter {

    private IdConverter() {
        // Classe utilitaire - constructeur privé
    }

    /**
     * Convertit un ID Long en UUID de manière déterministe
     * 
     * <p><strong>DÉPRÉCIÉ:</strong> Utilisez directement UUID dans vos entités.
     * 
     * <p>Utilise un namespace UUID fixe pour garantir la cohérence et éviter les collisions.
     * Le même Long produira toujours le même UUID.
     * 
     * @param entityType Le type d'entité (ex: "membre", "organisation", "cotisation")
     * @param id L'ID Long de l'entité
     * @return L'UUID correspondant, ou null si id est null
     * @deprecated Utilisez directement UUID dans vos entités
     */
    @Deprecated
    public static UUID longToUUID(String entityType, Long id) {
        if (id == null) {
            return null;
        }
        
        // Utilisation d'un namespace UUID fixe par type d'entité pour garantir la cohérence
        UUID namespace = getNamespaceForEntityType(entityType);
        String name = entityType + "-" + id;
        return UUID.nameUUIDFromBytes((namespace.toString() + name).getBytes());
    }

    /**
     * Convertit un UUID en ID Long approximatif
     * 
     * <p><strong>DÉPRÉCIÉ:</strong> Utilisez directement UUID dans vos entités.
     * 
     * <p>ATTENTION: Cette conversion n'est pas parfaitement réversible car UUID → Long
     * perd de l'information. Cette méthode est principalement utilisée pour la recherche
     * approximative. Pour une conversion réversible, il faudrait stocker le mapping dans la DB.
     * 
     * @param uuid L'UUID à convertir
     * @return Une approximation de l'ID Long, ou null si uuid est null
     * @deprecated Utilisez directement UUID dans vos entités
     */
    @Deprecated
    public static Long uuidToLong(UUID uuid) {
        if (uuid == null) {
            return null;
        }
        
        // Extraction d'une approximation de Long depuis les bits de l'UUID
        // Cette méthode n'est pas parfaitement réversible
        long mostSignificantBits = uuid.getMostSignificantBits();
        long leastSignificantBits = uuid.getLeastSignificantBits();
        
        // Combinaison des bits pour obtenir un Long
        // Utilisation de XOR pour mélanger les bits
        long combined = mostSignificantBits ^ leastSignificantBits;
        
        // Conversion en valeur positive
        return Math.abs(combined);
    }

    /**
     * Obtient le namespace UUID pour un type d'entité donné
     * 
     * @param entityType Le type d'entité
     * @return Le namespace UUID correspondant
     */
    private static UUID getNamespaceForEntityType(String entityType) {
        return switch (entityType.toLowerCase()) {
            case "membre" -> UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8");
            case "organisation" -> UUID.fromString("6ba7b811-9dad-11d1-80b4-00c04fd430c8");
            case "cotisation" -> UUID.fromString("6ba7b812-9dad-11d1-80b4-00c04fd430c8");
            case "evenement" -> UUID.fromString("6ba7b813-9dad-11d1-80b4-00c04fd430c8");
            case "demandeaide" -> UUID.fromString("6ba7b814-9dad-11d1-80b4-00c04fd430c8");
            case "inscriptionevenement" -> UUID.fromString("6ba7b815-9dad-11d1-80b4-00c04fd430c8");
            default -> UUID.fromString("6ba7b816-9dad-11d1-80b4-00c04fd430c8"); // Namespace par défaut
        };
    }

    /**
     * Convertit un ID Long d'organisation en UUID pour le DTO
     * 
     * @param organisationId L'ID Long de l'organisation
     * @return L'UUID correspondant, ou null si organisationId est null
     * @deprecated Utilisez directement UUID dans vos entités
     */
    @Deprecated
    public static UUID organisationIdToUUID(Long organisationId) {
        return longToUUID("organisation", organisationId);
    }

    /**
     * Convertit un ID Long de membre en UUID pour le DTO
     * 
     * @param membreId L'ID Long du membre
     * @return L'UUID correspondant, ou null si membreId est null
     * @deprecated Utilisez directement UUID dans vos entités
     */
    @Deprecated
    public static UUID membreIdToUUID(Long membreId) {
        return longToUUID("membre", membreId);
    }

    /**
     * Convertit un ID Long de cotisation en UUID pour le DTO
     * 
     * @param cotisationId L'ID Long de la cotisation
     * @return L'UUID correspondant, ou null si cotisationId est null
     * @deprecated Utilisez directement UUID dans vos entités
     */
    @Deprecated
    public static UUID cotisationIdToUUID(Long cotisationId) {
        return longToUUID("cotisation", cotisationId);
    }

    /**
     * Convertit un ID Long d'événement en UUID pour le DTO
     * 
     * @param evenementId L'ID Long de l'événement
     * @return L'UUID correspondant, ou null si evenementId est null
     * @deprecated Utilisez directement UUID dans vos entités
     */
    @Deprecated
    public static UUID evenementIdToUUID(Long evenementId) {
        return longToUUID("evenement", evenementId);
    }
}
