-- ============================================================================
-- Correction des types de métadonnées erronés
-- ============================================================================
-- Ce script corrige les champs qui ont type='reference' et reference=NULL
-- mais qui ne sont PAS de vraies clés étrangères en base de données
--
-- Exécution : mysql -u root -p nom_base < fix_metadata_types.sql
-- ============================================================================

USE estair_bo;

-- ============================================================================
-- Correction automatique basée sur les clés étrangères
-- ============================================================================
-- On corrige tous les champs qui ont type='reference' et reference=NULL
-- SAUF ceux qui ont une vraie clé étrangère en base de données

-- Créer une table temporaire avec la liste des colonnes ayant des FK
-- Nettoyer d'abord si elle existe déjà (d'une exécution précédente)
DROP TEMPORARY TABLE IF EXISTS temp_foreign_keys;

CREATE TEMPORARY TABLE temp_foreign_keys AS
SELECT
    TABLE_NAME as table_name,
    COLUMN_NAME as column_name
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
  AND REFERENCED_TABLE_NAME IS NOT NULL;

-- Corriger les métadonnées qui n'ont pas de FK correspondante
UPDATE metadatas m
SET
    m.type = CASE
        -- Types timestamp/datetime pour created_at, updated_at, etc.
        WHEN m.fieldname IN ('created_at', 'updated_at', 'modified_at', 'deleted_at') THEN 'timestamp'

        -- Types date pour les champs de date
        WHEN m.fieldname LIKE '%_date' OR m.fieldname LIKE 'date_%' THEN 'date'

        -- Types integer pour is_deleted, is_active, success, etc.
        WHEN m.fieldname IN ('is_deleted', 'is_active', 'success', 'active', 'deleted') THEN 'integer'
        WHEN m.fieldname LIKE 'is_%' THEN 'integer'

        -- Types integer pour les numéros
        WHEN m.fieldname LIKE '%_number' OR m.fieldname LIKE 'numero_%' THEN 'integer'

        -- Type picklist pour statut, status (si enum est défini)
        WHEN m.fieldname IN ('statut', 'status', 'etat', 'state') AND m.enum = '1' THEN 'picklist'

        -- Type string pour uuid
        WHEN m.fieldname = 'uuid' OR m.fieldname LIKE '%_uuid' THEN 'string'

        -- Type string pour les codes
        WHEN m.fieldname LIKE '%_code' OR m.fieldname LIKE 'code_%' THEN 'string'

        -- Type string pour pnr, locator, etc.
        WHEN m.fieldname IN ('pnr', 'locator', 'record_locator', 'trnc') THEN 'string'

        -- Type string pour type, source, carrier, etc.
        WHEN m.fieldname IN ('type', 'source', 'carrier', 'operation_type', 'gds_type', 'module_source') THEN 'string'

        -- Type string pour assigned_to, message (si ce n'est pas un ID)
        WHEN m.fieldname IN ('assigned_to', 'message_uuid') THEN 'string'

        -- Défaut: string si on ne sait pas
        ELSE 'string'
    END,
    m.updated_at = NOW()
WHERE m.type = 'reference'
  AND m.reference IS NULL
  AND NOT EXISTS (
      SELECT 1
      FROM temp_foreign_keys fk
      WHERE fk.table_name COLLATE utf8mb3_general_ci = m.object COLLATE utf8mb3_general_ci
        AND fk.column_name COLLATE utf8mb3_general_ci = m.fieldname COLLATE utf8mb3_general_ci
  );

-- Afficher un résumé des corrections
SELECT
    CONCAT('✓ Corrigé ', COUNT(*), ' métadonnées') as Summary
FROM metadatas m
WHERE m.type != 'reference'
  AND m.updated_at >= DATE_SUB(NOW(), INTERVAL 1 MINUTE);

-- ============================================================================
-- Corrections spécifiques si nécessaire
-- ============================================================================
-- Si certains champs nécessitent des corrections spécifiques, les ajouter ici

-- Par exemple, forcer un type spécifique pour certains champs :
-- UPDATE metadatas
-- SET type = 'picklist', updated_at = NOW()
-- WHERE object = 'bsps' AND fieldname = 'statut' AND type = 'string';

-- ============================================================================
-- Vérification finale
-- ============================================================================
-- Afficher les champs qui restent en type='reference' avec reference=NULL
-- (ce sont probablement des clés étrangères sans FK définie)
SELECT
    CONCAT('⚠ Reste ', COUNT(*), ' champs type=reference sans reference définie (probablement des FK manquantes)') as Warning,
    GROUP_CONCAT(CONCAT(object, '.', fieldname) SEPARATOR ', ') as Fields
FROM metadatas
WHERE type = 'reference'
  AND reference IS NULL;

-- Nettoyer
DROP TEMPORARY TABLE temp_foreign_keys;

-- ============================================================================
-- Fin du script
-- ============================================================================
SELECT '✅ Correction des types de métadonnées terminée' as Status;
