-- =============================================================================
-- Migration Flyway V2.0.0 - Création des tables de synchronisation Keycloak
-- =============================================================================
-- Description: Tables pour la persistance des snapshots et de l'historique
--              des synchronisations entre l'application et Keycloak.
--
-- Entités correspondantes:
--   SyncHistoryEntity  → sync_history
--   SyncedUserEntity   → synced_user
--   SyncedRoleEntity   → synced_role
--
-- Auteur: Lions Development Team
-- Date: 2026-02-17
-- Version: 2.0.0
-- =============================================================================


-- =============================================================================
-- TABLE sync_history : historique des opérations de synchronisation
-- =============================================================================
CREATE TABLE IF NOT EXISTS sync_history (
    id          BIGSERIAL PRIMARY KEY,
    realm_name  VARCHAR(255) NOT NULL,
    sync_date   TIMESTAMP    NOT NULL,
    sync_type   VARCHAR(50)  NOT NULL,    -- 'USER' ou 'ROLE'
    status      VARCHAR(50)  NOT NULL,    -- 'SUCCESS' ou 'FAILURE'
    items_processed INTEGER,
    duration_ms BIGINT,
    error_message TEXT
);

CREATE INDEX IF NOT EXISTS idx_sync_realm ON sync_history(realm_name);
CREATE INDEX IF NOT EXISTS idx_sync_date  ON sync_history(sync_date DESC);

COMMENT ON TABLE  sync_history IS 'Historique des synchronisations Keycloak (users et rôles)';
COMMENT ON COLUMN sync_history.sync_type  IS 'Type de synchronisation : USER ou ROLE';
COMMENT ON COLUMN sync_history.status     IS 'Résultat : SUCCESS ou FAILURE';


-- =============================================================================
-- TABLE synced_user : snapshot local des utilisateurs Keycloak synchronisés
-- =============================================================================
CREATE TABLE IF NOT EXISTS synced_user (
    id             BIGSERIAL    PRIMARY KEY,
    realm_name     VARCHAR(255) NOT NULL,
    keycloak_id    VARCHAR(255) NOT NULL,
    username       VARCHAR(255) NOT NULL,
    email          VARCHAR(255),
    enabled        BOOLEAN,
    email_verified BOOLEAN,
    created_at     TIMESTAMP,
    CONSTRAINT uq_synced_user_realm_kc UNIQUE (realm_name, keycloak_id)
);

CREATE INDEX IF NOT EXISTS idx_synced_user_realm
    ON synced_user(realm_name);
CREATE UNIQUE INDEX IF NOT EXISTS idx_synced_user_realm_kc_id
    ON synced_user(realm_name, keycloak_id);

COMMENT ON TABLE  synced_user IS 'Snapshot local des utilisateurs Keycloak pour rapports et vérifications';
COMMENT ON COLUMN synced_user.keycloak_id IS 'UUID Keycloak de l''utilisateur';


-- =============================================================================
-- TABLE synced_role : snapshot local des rôles Keycloak synchronisés
-- =============================================================================
CREATE TABLE IF NOT EXISTS synced_role (
    id          BIGSERIAL    PRIMARY KEY,
    realm_name  VARCHAR(255) NOT NULL,
    role_name   VARCHAR(255) NOT NULL,
    description VARCHAR(500),
    CONSTRAINT uq_synced_role_realm_name UNIQUE (realm_name, role_name)
);

CREATE INDEX IF NOT EXISTS idx_synced_role_realm
    ON synced_role(realm_name);
CREATE UNIQUE INDEX IF NOT EXISTS idx_synced_role_realm_name
    ON synced_role(realm_name, role_name);

COMMENT ON TABLE  synced_role IS 'Snapshot local des rôles Keycloak pour rapports et vérifications';
COMMENT ON COLUMN synced_role.role_name IS 'Nom du rôle realm dans Keycloak';

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