<?php
session_start();
require_once __DIR__ . "/../../config/db.php";

try {

    /* =========================
       SÉCURITÉ UTILISATEUR
    ========================= */
    $utilisateur_id = $_SESSION['user']['id'] ?? null;
    if (!$utilisateur_id) {
        throw new Exception("Utilisateur non authentifié");
    }

    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        throw new Exception("Méthode non autorisée");
    }

    /* =========================
       DONNÉES FORMULAIRE
    ========================= */
    $production_id = (int)($_POST['production_id'] ?? 0);
    if ($production_id <= 0) {
        throw new Exception("ID production invalide");
    }

    /* =========================
       TRANSACTION
    ========================= */
    $conn->beginTransaction();

    //  Verrouiller production
    $stmt = $conn->prepare("SELECT * FROM productions WHERE id = ? FOR UPDATE");
    $stmt->execute([$production_id]);
    $prod = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$prod) throw new Exception("Production inexistante");
    if ($prod['statut'] !== 'brouillon') throw new Exception("Production déjà validée ou annulée");

    //  Sortie matières
    $stmt = $conn->prepare("SELECT * FROM production_matieres WHERE production_id = ?");
    $stmt->execute([$production_id]);
    $matieres = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if (!$matieres) throw new Exception("Aucune matière définie");

    foreach ($matieres as $m) {
        // Vérifier stock
        $stmtStock = $conn->prepare("SELECT quantite FROM stock_depot WHERE produit_id = ? AND depot_id = ?");
        $stmtStock->execute([$m['produit_id'], $m['depot_id']]);
        $stock = (float)($stmtStock->fetchColumn() ?? 0);
        if ($stock < $m['quantite']) {
            throw new Exception("Stock insuffisant pour le produit {$m['produit_id']}");
        }

        // Sortie stock
        $conn->prepare("
            UPDATE stock_depot
            SET quantite = quantite - ?
            WHERE produit_id = ? AND depot_id = ?
        ")->execute([$m['quantite'], $m['produit_id'], $m['depot_id']]);

        // Mouvement stock
        $conn->prepare("
            INSERT INTO mouvements_stock
            (produit_id, depot_id, quantite, type, reference_table, reference_id, utilisateur_id, date_mouvement)
            VALUES (?, ?, ?, 'production_sortie', 'productions', ?, ?, ?, NOW())
        ")->execute([$m['produit_id'], $m['depot_id'], -abs($m['quantite']), $production_id, $utilisateur_id, date('Y-m-d H:i:s')]);
    }

    //  Entrée produits finis
    $stmt = $conn->prepare("SELECT * FROM production_finis WHERE production_id = ?");
    $stmt->execute([$production_id]);
    $finis = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if (!$finis) throw new Exception("Aucun produit fini défini");

    foreach ($finis as $f) {
        // Entrée stock
        $check = $conn->prepare("SELECT id FROM stock_depot WHERE produit_id = ? AND depot_id = ?");
        $check->execute([$f['produit_id'], $f['depot_id']]);
        $stockFini = $check->fetch(PDO::FETCH_ASSOC);

        if ($stockFini) {
            $conn->prepare("UPDATE stock_depot SET quantite = quantite + ? WHERE id = ?")
                 ->execute([$f['quantite'], $stockFini['id']]);
        } else {
            $conn->prepare("INSERT INTO stock_depot (produit_id, depot_id, quantite) VALUES (?, ?, ?)")
                 ->execute([$f['produit_id'], $f['depot_id'], $f['quantite']]);
        }

        // Mouvement stock
        $conn->prepare("
            INSERT INTO mouvements_stock
            (produit_id, depot_id, quantite, type, reference_table, reference_id, utilisateur_id, date_mouvement)
            VALUES (?, ?, ?, 'production_entree', 'productions', ?, ?, ?, NOW())
        ")->execute([$f['produit_id'], $f['depot_id'], abs($f['quantite']), $production_id, $utilisateur_id, date('Y-m-d H:i:s')]);
    }

    //  Mettre à jour production
    $conn->prepare("UPDATE productions SET statut = 'valide', date_validation = NOW() WHERE id = ?")
         ->execute([$production_id]);

    $conn->commit();

} catch (Exception $e) {
    if ($conn->inTransaction()) $conn->rollBack();
    die("❌ Erreur PRODUCTION : " . $e->getMessage());
}

/* =========================
   REDIRECTION
========================= */
header("Location: /eagle_client_istanbulcups/index.php?page=productions");
exit;
