<?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'] !== 'valide') throw new Exception("Production non validée ou déjà annulée");

    //  Annuler entrée produits finis
    $stmt = $conn->prepare("SELECT * FROM production_finis WHERE production_id = ?");
    $stmt->execute([$production_id]);
    $finis = $stmt->fetchAll(PDO::FETCH_ASSOC);

    foreach ($finis as $f) {
        // Vérifier stock produit fini
        $stmtStock = $conn->prepare("SELECT quantite, id FROM stock_depot WHERE produit_id = ? AND depot_id = ?");
        $stmtStock->execute([$f['produit_id'], $f['depot_id']]);
        $stock = $stmtStock->fetch(PDO::FETCH_ASSOC);
        $quantiteStock = (float)($stock['quantite'] ?? 0);

        if ($quantiteStock < $f['quantite']) {
            throw new Exception("Impossible d'annuler : stock insuffisant pour produit fini {$f['produit_id']}");
        }

        // Retirer stock
        $conn->prepare("UPDATE stock_depot SET quantite = quantite - ? WHERE id = ?")
             ->execute([$f['quantite'], $stock['id']]);

        // Mouvement stock inverse
        $conn->prepare("
            INSERT INTO mouvements_stock
            (produit_id, depot_id, quantite, type, reference_table, reference_id, utilisateur_id, date_mouvement)
            VALUES (?, ?, ?, 'annulation_production', 'productions', ?, ?, NOW())
        ")->execute([$f['produit_id'], $f['depot_id'], -abs($f['quantite']), $production_id, $utilisateur_id]);
    }

    //  Remettre matières consommées
    $stmt = $conn->prepare("SELECT * FROM production_matieres WHERE production_id = ?");
    $stmt->execute([$production_id]);
    $matieres = $stmt->fetchAll(PDO::FETCH_ASSOC);

    foreach ($matieres as $m) {
        // Ajouter stock matières
        $check = $conn->prepare("SELECT id FROM stock_depot WHERE produit_id = ? AND depot_id = ?");
        $check->execute([$m['produit_id'], $m['depot_id']]);
        $stock = $check->fetch(PDO::FETCH_ASSOC);

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

        // Mouvement stock inverse
        $conn->prepare("
            INSERT INTO mouvements_stock
            (produit_id, depot_id, quantite, type, reference_table, reference_id, utilisateur_id, date_mouvement)
            VALUES (?, ?, ?, 'annulation_production', 'productions', ?, ?, NOW())
        ")->execute([$m['produit_id'], $m['depot_id'], abs($m['quantite']), $production_id, $utilisateur_id]);
    }

    //  Marquer production comme annulée
    $conn->prepare("UPDATE productions SET statut = 'annule', date_annulation = NOW() WHERE id = ?")
         ->execute([$production_id]);

    $conn->commit();

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

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