-- =============================================================================
-- Migration Flyway V1.0.0 - Création de la table audit_logs
-- =============================================================================
-- Description: Création de la table pour la persistance des logs d'audit
--              des actions effectuées sur le système de gestion des utilisateurs
--
-- Auteur: Lions Development Team
-- Date: 2026-01-02
-- Version: 1.0.0
-- =============================================================================

-- Création de la table audit_logs
CREATE TABLE IF NOT EXISTS audit_logs (
    -- Clé primaire générée automatiquement
    id BIGSERIAL PRIMARY KEY,

    -- Informations sur l'utilisateur concerné
    user_id VARCHAR(255),

    -- Type d'action effectuée
    action VARCHAR(100) NOT NULL,

    -- Détails de l'action
    details TEXT,

    -- Informations sur l'auteur de l'action
    auteur_action VARCHAR(255) NOT NULL,

    -- Timestamp de l'action
    timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    -- Informations de traçabilité réseau
    ip_address VARCHAR(45),
    user_agent VARCHAR(500),

    -- Informations multi-tenant
    realm_name VARCHAR(255),

    -- Statut de l'action
    success BOOLEAN NOT NULL DEFAULT TRUE,
    error_message TEXT,

    -- Métadonnées
    CONSTRAINT chk_audit_action CHECK (action IN (
        -- Actions utilisateurs
        'CREATION_UTILISATEUR',
        'MODIFICATION_UTILISATEUR',
        'SUPPRESSION_UTILISATEUR',
        'ACTIVATION_UTILISATEUR',
        'DESACTIVATION_UTILISATEUR',
        'VERROUILLAGE_UTILISATEUR',
        'DEVERROUILLAGE_UTILISATEUR',

        -- Actions mot de passe
        'RESET_PASSWORD',
        'CHANGE_PASSWORD',
        'FORCE_PASSWORD_RESET',

        -- Actions sessions
        'LOGOUT_UTILISATEUR',
        'LOGOUT_ALL_SESSIONS',
        'SESSION_EXPIREE',

        -- Actions rôles
        'ATTRIBUTION_ROLE',
        'REVOCATION_ROLE',
        'CREATION_ROLE',
        'MODIFICATION_ROLE',
        'SUPPRESSION_ROLE',

        -- Actions groupes
        'AJOUT_GROUPE',
        'RETRAIT_GROUPE',

        -- Actions realms
        'ATTRIBUTION_REALM',
        'REVOCATION_REALM',

        -- Actions synchronisation
        'SYNC_MANUEL',
        'SYNC_AUTO',
        'SYNC_ERREUR',

        -- Actions import/export
        'EXPORT_CSV',
        'IMPORT_CSV',

        -- Actions système
        'CONNEXION_REUSSIE',
        'CONNEXION_ECHOUEE',
        'TENTATIVE_ACCES_NON_AUTORISE',
        'ERREUR_SYSTEME',
        'CONFIGURATION_MODIFIEE'
    ))
);

-- =============================================================================
-- INDEX pour optimiser les requêtes
-- =============================================================================

-- Index sur user_id pour recherches rapides par utilisateur
CREATE INDEX idx_audit_user_id ON audit_logs(user_id)
    WHERE user_id IS NOT NULL;

-- Index sur action pour filtrer par type d'action
CREATE INDEX idx_audit_action ON audit_logs(action);

-- Index sur timestamp pour recherches chronologiques et tri
CREATE INDEX idx_audit_timestamp ON audit_logs(timestamp DESC);

-- Index sur auteur_action pour tracer les actions d'un administrateur
CREATE INDEX idx_audit_auteur ON audit_logs(auteur_action);

-- Index sur realm_name pour isolation multi-tenant
CREATE INDEX idx_audit_realm ON audit_logs(realm_name)
    WHERE realm_name IS NOT NULL;

-- Index composite pour recherches fréquentes
CREATE INDEX idx_audit_user_timestamp ON audit_logs(user_id, timestamp DESC)
    WHERE user_id IS NOT NULL;

-- Index sur success pour identifier rapidement les échecs
CREATE INDEX idx_audit_failures ON audit_logs(success, timestamp DESC)
    WHERE success = FALSE;

-- =============================================================================
-- COMMENTAIRES sur les colonnes
-- =============================================================================

COMMENT ON TABLE audit_logs IS 'Table de persistance des logs d''audit pour traçabilité complète';

COMMENT ON COLUMN audit_logs.id IS 'Identifiant unique auto-incrémenté du log';
COMMENT ON COLUMN audit_logs.user_id IS 'ID de l''utilisateur concerné par l''action (null pour actions système)';
COMMENT ON COLUMN audit_logs.action IS 'Type d''action effectuée (enum TypeActionAudit)';
COMMENT ON COLUMN audit_logs.details IS 'Détails complémentaires sur l''action';
COMMENT ON COLUMN audit_logs.auteur_action IS 'Identifiant de l''utilisateur ayant effectué l''action';
COMMENT ON COLUMN audit_logs.timestamp IS 'Date et heure précise de l''action';
COMMENT ON COLUMN audit_logs.ip_address IS 'Adresse IP du client ayant effectué l''action';
COMMENT ON COLUMN audit_logs.user_agent IS 'User-Agent du navigateur/client';
COMMENT ON COLUMN audit_logs.realm_name IS 'Nom du realm Keycloak concerné (multi-tenant)';
COMMENT ON COLUMN audit_logs.success IS 'Indique si l''action a réussi (true) ou échoué (false)';
COMMENT ON COLUMN audit_logs.error_message IS 'Message d''erreur en cas d''échec (null si success=true)';

-- =============================================================================
-- POLITIQUE DE RÉTENTION (optionnel - à activer selon besoins)
-- =============================================================================

-- Fonction pour nettoyer automatiquement les vieux logs
-- Décommenter et adapter la période de rétention selon les besoins

/*
CREATE OR REPLACE FUNCTION cleanup_old_audit_logs() RETURNS void AS $$
BEGIN
    -- Supprime les logs de plus de 365 jours (configurable)
    DELETE FROM audit_logs
    WHERE timestamp < CURRENT_TIMESTAMP - INTERVAL '365 days';

    RAISE NOTICE 'Logs d''audit plus anciens que 365 jours supprimés';
END;
$$ LANGUAGE plpgsql;

-- Créer un job CRON (nécessite extension pg_cron)
-- SELECT cron.schedule('cleanup-audit-logs', '0 2 * * 0', 'SELECT cleanup_old_audit_logs()');
*/

-- =============================================================================
-- GRANTS (à adapter selon les rôles de votre base de données)
-- =============================================================================

-- GRANT SELECT, INSERT ON audit_logs TO lions_app_user;
-- GRANT USAGE, SELECT ON SEQUENCE audit_logs_id_seq TO lions_app_user;

-- =============================================================================
-- FIN DE LA MIGRATION
-- =============================================================================
