<?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");
    }

    $appro_id = $_POST['id'] ?? null;
    if (!$appro_id) {
        throw new Exception("ID appro manquant");
    }

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

    /* =========================
       VERROU APPRO
    ========================= */
    $stmt = $conn->prepare("
        SELECT id, annule 
        FROM appro 
        WHERE id = ?
        FOR UPDATE
    ");
    $stmt->execute([$appro_id]);
    $appro = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$appro) {
        throw new Exception("Appro introuvable");
    }

    if ((int)$appro['annule'] === 1) {
        throw new Exception("Cet appro est déjà annulé");
    }

    /* =========================
       MARQUER APPRO ANNULÉ
    ========================= */
    $conn->prepare("
        UPDATE appro 
        SET annule = 1, statut = 'Annulé'
        WHERE id = ?
    ")->execute([$appro_id]);

    /* =========================
       DÉTAILS APPRO
    ========================= */
    $stmt = $conn->prepare("
        SELECT produit_id, quantite
        FROM appro_details
        WHERE appro_id = ?
    ");
    $stmt->execute([$appro_id]);
    $details = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (!$details) {
        throw new Exception("Aucun détail trouvé pour cet appro");
    }

    /* =========================
       RÉVERSER LE STOCK
    ========================= */
    foreach ($details as $d) {

        $produit_id = (int)$d['produit_id'];
        $quantite   = (int)$d['quantite'];

        // Stock actuel
        $stmt = $conn->prepare("
            SELECT id, quantite 
            FROM stock_depot 
            WHERE produit_id = ?
            FOR UPDATE
        ");
        $stmt->execute([$produit_id]);
        $stock = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$stock) {
            throw new Exception("Stock inexistant pour le produit ID $produit_id");
        }

        if ($stock['quantite'] < $quantite) {
            throw new Exception("Stock insuffisant pour annuler l'appro (produit ID $produit_id)");
        }

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

        /* =========================
           MOUVEMENT STOCK (ANNULATION)
        ========================= */
        $conn->prepare("
            INSERT INTO mouvements_stock
            (produit_id, quantite, type, reference_table, reference_id, utilisateur_id, date_mouvement)
            VALUES (?, ?, 'annulation_appro', 'appro', ?, ?, NOW())
        ")->execute([
            $produit_id,
            $quantite,
            $appro_id,
            $utilisateur_id
        ]);
    }

    $conn->commit();

} catch (Exception $e) {

    if ($conn->inTransaction()) {
        $conn->rollBack();
    }

    die("❌ Erreur ANNULATION APPRO : " . $e->getMessage());
}

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