<?php
/**
 * migrate.php
 * Script unifié pour créer et mettre à jour toutes les tables de la base de données
 * Permet de s'assurer que la structure de la BD est toujours à jour.
 */

// Permet l'exécution en CLI ou via navigateur
if (php_sapi_name() !== 'cli') {
    require_once __DIR__ . '/config/app.php';
    if (!isset($_SESSION['user_id']) || $_SESSION['user_role'] !== 'admin') {
        die("Accès refusé. Vous devez être connecté en tant qu'administrateur.");
    }
    echo "<h3>Exécution des migrations de la base de données...</h3>";
    echo "<pre>";
} else {
    require_once __DIR__ . '/config/app.php';
    echo "Exécution des migrations de la base de données...\n";
}

$db = getDB();
$db->beginTransaction();

try {
    // 1. Table users
    $db->exec("
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT NOT NULL UNIQUE,
            password TEXT NOT NULL,
            full_name TEXT,
            email TEXT,
            phone TEXT,
            role TEXT DEFAULT 'agent', -- admin, agent, comptable
            status TEXT DEFAULT 'active', -- active, inactive
            last_login TEXT,
            created_at TEXT DEFAULT (datetime('now')),
            updated_at TEXT DEFAULT (datetime('now'))
        )
    ");
    echo "Table 'users' vérifiée.\n";

    // Vérifier si l'admin existe, sinon le créer
    $stmt = $db->query("SELECT COUNT(*) FROM users WHERE username = 'admin'");
    if ($stmt->fetchColumn() == 0) {
        $db->prepare("INSERT INTO users (username, password, full_name, role) VALUES (?, ?, ?, ?)")
           ->execute(['admin', password_hash('admin123', PASSWORD_DEFAULT), 'Administrateur', 'admin']);
        echo "Utilisateur 'admin' créé (mot de passe par défaut: admin123).\n";
    }

    // 2. Table settings
    $db->exec("
        CREATE TABLE IF NOT EXISTS settings (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            setting_key TEXT NOT NULL UNIQUE,
            setting_value TEXT,
            updated_at TEXT DEFAULT (datetime('now'))
        )
    ");
    echo "Table 'settings' vérifiée.\n";

    // 3. Table logs
    $db->exec("
        CREATE TABLE IF NOT EXISTS logs (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user_id INTEGER,
            action TEXT NOT NULL,
            description TEXT,
            ip_address TEXT,
            created_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (user_id) REFERENCES users(id)
        )
    ");
    echo "Table 'logs' vérifiée.\n";

    // 4. Table voyageurs
    $db->exec("
        CREATE TABLE IF NOT EXISTS voyageurs (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nom TEXT NOT NULL,
            prenom TEXT NOT NULL,
            date_naissance TEXT,
            sexe TEXT,
            nationalite TEXT DEFAULT 'Marocaine',
            cin TEXT,
            num_passeport TEXT,
            date_emission_passeport TEXT,
            date_expiration_passeport TEXT,
            telephone TEXT,
            email TEXT,
            adresse TEXT,
            ville TEXT,
            profession TEXT,
            situation_familiale TEXT,
            nom_urgence TEXT,
            tel_urgence TEXT,
            remarques TEXT,
            created_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            updated_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (created_by) REFERENCES users(id)
        )
    ");
    echo "Table 'voyageurs' vérifiée.\n";

    // 5. Table programmes
    $db->exec("
        CREATE TABLE IF NOT EXISTS programmes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nom TEXT NOT NULL,
            type TEXT NOT NULL, -- omra, haj, turquie, dubai, asie, europe, maroc, autre
            destination TEXT,
            date_depart TEXT,
            date_retour TEXT,
            compagnie_aerienne TEXT,
            hotel_makkah TEXT,
            hotel_madinah TEXT,
            hotel_autre TEXT,
            prix_double REAL DEFAULT 0,
            prix_triple REAL DEFAULT 0,
            prix_quadruple REAL DEFAULT 0,
            prix_enfant REAL DEFAULT 0,
            prix_bebe REAL DEFAULT 0,
            places_totales INTEGER DEFAULT 50,
            places_reservees INTEGER DEFAULT 0,
            statut TEXT DEFAULT 'ouvert', -- ouvert, complet, termine, annule
            description TEXT,
            created_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            updated_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (created_by) REFERENCES users(id)
        )
    ");
    echo "Table 'programmes' vérifiée.\n";

    // 6. Table inscriptions
    $db->exec("
        CREATE TABLE IF NOT EXISTS inscriptions (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            num_dossier TEXT NOT NULL UNIQUE,
            programme_id INTEGER NOT NULL,
            voyageur_id INTEGER NOT NULL,
            groupe_id INTEGER,
            formule TEXT NOT NULL, -- double, triple, quadruple, enfant, bebe
            prix_total REAL NOT NULL,
            montant_paye REAL DEFAULT 0,
            statut_paiement TEXT DEFAULT 'impaye', -- impaye, partiel, paye
            status TEXT DEFAULT 'confirme', -- en_attente, confirme, annule
            remarques TEXT,
            created_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            updated_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (programme_id) REFERENCES programmes(id),
            FOREIGN KEY (voyageur_id) REFERENCES voyageurs(id),
            FOREIGN KEY (created_by) REFERENCES users(id)
        )
    ");
    echo "Table 'inscriptions' vérifiée.\n";

    // 7. Table services (Billets, Visas, Assurance, etc.)
    $db->exec("
        CREATE TABLE IF NOT EXISTS services (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            titre TEXT NOT NULL,
            type_service TEXT NOT NULL, -- billet, visa, assurance, hotel, transfert, autre
            voyageur_id INTEGER NOT NULL,
            fournisseur TEXT,
            date_debut TEXT,
            date_fin TEXT,
            prix_achat REAL DEFAULT 0,
            prix_total REAL DEFAULT 0,
            montant_paye REAL DEFAULT 0,
            statut_paiement TEXT DEFAULT 'impaye', -- impaye, partiel, paye
            statut_service TEXT DEFAULT 'en_attente', -- en_attente, confirme, traite, annule
            notes TEXT,
            created_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            updated_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (voyageur_id) REFERENCES voyageurs(id),
            FOREIGN KEY (created_by) REFERENCES users(id)
        )
    ");
    echo "Table 'services' vérifiée.\n";

    // 8. Table devis
    $db->exec("
        CREATE TABLE IF NOT EXISTS devis (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            numero TEXT NOT NULL UNIQUE,
            voyageur_id INTEGER NOT NULL,
            date_devis TEXT NOT NULL,
            date_validite TEXT,
            statut TEXT DEFAULT 'brouillon',
            montant_ht REAL DEFAULT 0,
            montant_remise REAL DEFAULT 0,
            montant_tva REAL DEFAULT 0,
            taux_tva REAL DEFAULT 0,
            montant_ttc REAL DEFAULT 0,
            notes TEXT,
            conditions TEXT,
            created_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            updated_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (voyageur_id) REFERENCES voyageurs(id),
            FOREIGN KEY (created_by) REFERENCES users(id)
        )
    ");
    // Ajouter la colonne montant_remise si elle manque
    $colsDevis = array_column($db->query("PRAGMA table_info(devis)")->fetchAll(), 'name');
    if (!in_array('montant_remise', $colsDevis)) {
        $db->exec("ALTER TABLE devis ADD COLUMN montant_remise REAL DEFAULT 0");
        echo "Colonne 'montant_remise' ajoutée à 'devis'.\n";
    }
    echo "Table 'devis' vérifiée.\n";

    // 9. Table factures
    $db->exec("
        CREATE TABLE IF NOT EXISTS factures (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            numero TEXT NOT NULL UNIQUE,
            devis_id INTEGER,
            inscription_id INTEGER,
            service_id INTEGER,
            voyageur_id INTEGER NOT NULL,
            date_facture TEXT NOT NULL,
            date_echeance TEXT,
            statut TEXT DEFAULT 'brouillon',
            montant_ht REAL DEFAULT 0,
            montant_remise REAL DEFAULT 0,
            montant_tva REAL DEFAULT 0,
            taux_tva REAL DEFAULT 0,
            montant_ttc REAL DEFAULT 0,
            notes TEXT,
            conditions TEXT,
            created_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            updated_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (devis_id) REFERENCES devis(id),
            FOREIGN KEY (inscription_id) REFERENCES inscriptions(id),
            FOREIGN KEY (service_id) REFERENCES services(id),
            FOREIGN KEY (voyageur_id) REFERENCES voyageurs(id),
            FOREIGN KEY (created_by) REFERENCES users(id)
        )
    ");
    // Ajouter la colonne montant_remise si elle manque
    $colsFactures = array_column($db->query("PRAGMA table_info(factures)")->fetchAll(), 'name');
    if (!in_array('montant_remise', $colsFactures)) {
        $db->exec("ALTER TABLE factures ADD COLUMN montant_remise REAL DEFAULT 0");
        echo "Colonne 'montant_remise' ajoutée à 'factures'.\n";
    }
    echo "Table 'factures' vérifiée.\n";

    // 10. Table devis_lignes
    $db->exec("
        CREATE TABLE IF NOT EXISTS devis_lignes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            devis_id INTEGER NOT NULL,
            description TEXT NOT NULL,
            quantite INTEGER DEFAULT 1,
            prix_unitaire REAL DEFAULT 0,
            total_ligne REAL DEFAULT 0,
            FOREIGN KEY (devis_id) REFERENCES devis(id) ON DELETE CASCADE
        )
    ");
    echo "Table 'devis_lignes' vérifiée.\n";

    // 11. Table facture_lignes
    $db->exec("
        CREATE TABLE IF NOT EXISTS facture_lignes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            facture_id INTEGER NOT NULL,
            description TEXT NOT NULL,
            quantite INTEGER DEFAULT 1,
            prix_unitaire REAL DEFAULT 0,
            total_ligne REAL DEFAULT 0,
            FOREIGN KEY (facture_id) REFERENCES factures(id) ON DELETE CASCADE
        )
    ");
    echo "Table 'facture_lignes' vérifiée.\n";

    // 12. Table paiements
    $db->exec("
        CREATE TABLE IF NOT EXISTS paiements (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            inscription_id INTEGER, -- Rendu optionnel pour permettre les paiements de services
            service_id INTEGER,     -- Ajout de la liaison service
            facture_id INTEGER,     -- Ajout de la liaison facture
            voyageur_id INTEGER NOT NULL,
            montant REAL NOT NULL,
            mode_paiement TEXT DEFAULT 'especes',
            reference_paiement TEXT,
            date_paiement TEXT DEFAULT (date('now')),
            notes TEXT,
            recu_genere INTEGER DEFAULT 0,
            created_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (inscription_id) REFERENCES inscriptions(id),
            FOREIGN KEY (service_id) REFERENCES services(id),
            FOREIGN KEY (facture_id) REFERENCES factures(id),
            FOREIGN KEY (voyageur_id) REFERENCES voyageurs(id),
            FOREIGN KEY (created_by) REFERENCES users(id)
        )
    ");
    $colsPaiements = array_column($db->query("PRAGMA table_info(paiements)")->fetchAll(), 'name');
    if (!in_array('service_id', $colsPaiements)) {
        $db->exec("ALTER TABLE paiements ADD COLUMN service_id INTEGER REFERENCES services(id)");
        echo "Colonne 'service_id' ajoutée à 'paiements'.\n";
    }
    if (!in_array('facture_id', $colsPaiements)) {
        $db->exec("ALTER TABLE paiements ADD COLUMN facture_id INTEGER REFERENCES factures(id)");
        echo "Colonne 'facture_id' ajoutée à 'paiements'.\n";
    }
    echo "Table 'paiements' vérifiée.\n";

    // 13. Table depenses
    $db->exec("
        CREATE TABLE IF NOT EXISTS depenses (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            titre TEXT NOT NULL,
            categorie TEXT NOT NULL,
            montant REAL NOT NULL,
            date_depense TEXT NOT NULL,
            mode_paiement TEXT DEFAULT 'especes',
            reference TEXT,
            fournisseur TEXT,
            programme_id INTEGER,
            notes TEXT,
            created_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (programme_id) REFERENCES programmes(id),
            FOREIGN KEY (created_by) REFERENCES users(id)
        )
    ");
    echo "Table 'depenses' vérifiée.\n";

    // 14. Table documents
    $db->exec("
        CREATE TABLE IF NOT EXISTS documents (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            voyageur_id INTEGER,
            inscription_id INTEGER,
            type_document TEXT NOT NULL, -- passeport, cin, photo, visa, vaccin, autre
            titre TEXT NOT NULL,
            nom_fichier TEXT NOT NULL,
            chemin_fichier TEXT NOT NULL,
            taille_fichier INTEGER,
            notes TEXT,
            uploaded_by INTEGER,
            created_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (voyageur_id) REFERENCES voyageurs(id),
            FOREIGN KEY (inscription_id) REFERENCES inscriptions(id),
            FOREIGN KEY (uploaded_by) REFERENCES users(id)
        )
    ");
    echo "Table 'documents' vérifiée.\n";

    // 15. Table groupes
    $db->exec("
        CREATE TABLE IF NOT EXISTS groupes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nom TEXT NOT NULL,
            responsable_id INTEGER,
            programme_id INTEGER,
            remarques TEXT,
            created_at TEXT DEFAULT (datetime('now')),
            FOREIGN KEY (responsable_id) REFERENCES voyageurs(id),
            FOREIGN KEY (programme_id) REFERENCES programmes(id)
        )
    ");
    echo "Table 'groupes' vérifiée.\n";

    // 16. Table hotels
    $db->exec("
        CREATE TABLE IF NOT EXISTS hotels (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nom TEXT NOT NULL,
            ville TEXT NOT NULL,
            categorie INTEGER, -- étoiles
            adresse TEXT,
            contact_nom TEXT,
            contact_tel TEXT,
            contact_email TEXT,
            remarques TEXT,
            created_at TEXT DEFAULT (datetime('now'))
        )
    ");
    echo "Table 'hotels' vérifiée.\n";

    // 17. Table vols
    $db->exec("
        CREATE TABLE IF NOT EXISTS vols (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            programme_id INTEGER NOT NULL,
            compagnie TEXT NOT NULL,
            num_vol_aller TEXT,
            date_depart TEXT,
            aeroport_depart TEXT,
            heure_depart TEXT,
            aeroport_arrivee_aller TEXT,
            heure_arrivee_aller TEXT,
            num_vol_retour TEXT,
            date_retour TEXT,
            aeroport_depart_retour TEXT,
            heure_depart_retour TEXT,
            aeroport_arrivee TEXT,
            heure_arrivee TEXT,
            pnr TEXT,
            poids_bagage TEXT,
            remarques TEXT,
            FOREIGN KEY (programme_id) REFERENCES programmes(id)
        )
    ");
    echo "Table 'vols' vérifiée.\n";

    $db->commit();
    echo "\n✅ Toutes les migrations ont été exécutées avec succès.\n";
    
} catch (Exception $e) {
    $db->rollBack();
    echo "\n❌ ERREUR LORS DES MIGRATIONS:\n" . $e->getMessage() . "\n";
}

if (php_sapi_name() !== 'cli') {
    echo "</pre>";
    echo '<a href="parametres.php" style="display:inline-block; padding:10px 20px; background:#065f46; color:white; text-decoration:none; border-radius:5px; margin-top:20px;">Retour aux paramètres</a>';
}
