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

if ($_SERVER["REQUEST_METHOD"] !== "POST") {
    header("Location: /eagle_client_istanbulcups/index.php?page=pos-liste");
    exit;
}

$vente_id = intval($_POST['id'] ?? 0);
$utilisateur_id = $_SESSION['user']['id'] ?? null;

if (!$vente_id || !$utilisateur_id) {
    die("Paramètres invalides");
}

$conn->beginTransaction();

try {

    /* =========================
       1. Vente
    ========================== */
    $stmt = $conn->prepare("
        SELECT *
        FROM ventes
        WHERE id = ? AND annule = 0
        FOR UPDATE
    ");
    $stmt->execute([$vente_id]);
    $vente = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$vente) {
        throw new Exception("Vente inexistante ou déjà annulée");
    }

    /* =========================
       2. Marquer annulée
    ========================== */
    $conn->prepare("
        UPDATE ventes
        SET annule = 1, statut = 'Annulée'
        WHERE id = ?
    ")->execute([$vente_id]);

    /* =========================
       3. Détails produits
    ========================== */
    $stmt = $conn->prepare("
        SELECT produit_id, quantite
        FROM ventes_details
        WHERE vente_id = ?
    ");
    $stmt->execute([$vente_id]);
    $details = $stmt->fetchAll(PDO::FETCH_ASSOC);

    foreach ($details as $d) {

        /* ---- Remise en stock ---- */
        $stmt = $conn->prepare("
            SELECT id FROM stock_depot
            WHERE produit_id = ?
            FOR UPDATE
        ");
        $stmt->execute([$d['produit_id']]);
        $stock = $stmt->fetch(PDO::FETCH_ASSOC);

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

        /* ---- Mouvement stock ---- */
        $conn->prepare("
            INSERT INTO mouvements_stock
            (produit_id, quantite, type, reference_table, reference_id, utilisateur_id, date_mouvement)
            VALUES (?, ?, 'annulation_vente', 'ventes', ?, ?, NOW())
        ")->execute([
            $d['produit_id'],
            $d['quantite'],
            $vente_id,
            $utilisateur_id
        ]);
    }

    /* =========================
       4. Caisse (contre-opération)
    ========================== */
    $stmt = $conn->prepare("
        SELECT *
        FROM operations_caisse
        WHERE reference_table = 'ventes'
          AND reference_id = ?
          AND type_operation = 'entree'
    ");
    $stmt->execute([$vente_id]);
    $operations = $stmt->fetchAll(PDO::FETCH_ASSOC);

    foreach ($operations as $op) {

        // écriture inverse
        $conn->prepare("
            INSERT INTO operations_caisse
            (session_caisse_id, caisse_type_id, type_operation,
             montant, devise_id, mode_paiement_id,
             reference_table, reference_id,
             utilisateur_id, date_operation)
            VALUES (?, ?, 'sortie', ?, ?, ?, 'ventes', ?, ?, NOW())
        ")->execute([
            $op['session_caisse_id'],
            $op['caisse_type_id'],
            $op['montant'],
            $op['devise_id'],
            $op['mode_paiement_id'],
            $vente_id,
            $utilisateur_id
        ]);

        // mise à jour solde type caisse
        $conn->prepare("
            UPDATE caisse_types
            SET solde_actuel = solde_actuel - ?
            WHERE id = ?
        ")->execute([$op['montant'], $op['caisse_type_id']]);
    }

    /* =========================
       5. Recalcul caisse globale
    ========================== */
    $conn->prepare("
        UPDATE caisses
        SET solde_actuel = (
            SELECT COALESCE(SUM(solde_actuel),0)
            FROM caisse_types
            WHERE caisse_id = caisses.id
        )
    ")->execute();

    /* =========================
       6. Créance
    ========================== */
    $conn->prepare("
        UPDATE creances_clients
        SET statut = 'Annulée',
            reste_a_payer = 0
        WHERE vente_id = ?
    ")->execute([$vente_id]);

    $conn->commit();

} catch (Exception $e) {
    $conn->rollBack();
    die("Erreur annulation : " . $e->getMessage());
}

header("Location: /eagle_client_yayesoda/index.php?page=pos-liste");
exit;
