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

$utilisateur_id = $_SESSION['user']['id'] ?? null;
if (!$utilisateur_id) {
    die("Utilisateur non authentifié");
}

/* ===============================
   RECUPERATION POST
================================= */
$commande_id = (int)($_POST['commande_id'] ?? 0);
$livraisons = $_POST['livraisons'] ?? [];

if (!$commande_id) {
    die("Commande invalide");
}

$conn->beginTransaction();

try {

    /* ===============================
       RECUP COMMANDE
    ================================= */
    $stmt = $conn->prepare("SELECT * FROM commandes_clients WHERE id=?");
    $stmt->execute([$commande_id]);
    $commande = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$commande) {
        throw new Exception("Commande introuvable");
    }

    if (!in_array($commande['statut'], ['en_cours', 'partiellement_livree'])) {
        throw new Exception("Commande déjà finalisée");
    }

    /* ===============================
       DETAILS
    ================================= */
    $stmt = $conn->prepare("
        SELECT * FROM commandes_clients_details 
        WHERE commande_id=?
    ");
    $stmt->execute([$commande_id]);
    $details = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $total_reste_global = 0;

    foreach ($details as $d) {

        $detail_id = $d['id'];
        $quantite_a_livrer = (float)($livraisons[$detail_id] ?? 0);

        if ($quantite_a_livrer <= 0) continue;

        $reste = $d['quantite'] - $d['quantite_livree'];

        if ($quantite_a_livrer > $reste) {
            throw new Exception("Quantité invalide pour le produit ID ".$d['produit_id']);
        }

        $depot_id = $d['depot_id'] ?? 1;

        /* ===============================
           STOCK
        ================================= */
        $stmtStock = $conn->prepare("
            SELECT quantite FROM stock_depot 
            WHERE produit_id=? AND depot_id=?
        ");
        $stmtStock->execute([$d['produit_id'], $depot_id]);
        $stock = $stmtStock->fetch(PDO::FETCH_ASSOC);

        if ($stock && $stock['quantite'] < $quantite_a_livrer) {
            throw new Exception("Stock insuffisant pour produit ID ".$d['produit_id']);
        }

        // Décrément stock
        $conn->prepare("
            UPDATE stock_depot 
            SET quantite = quantite - ? 
            WHERE produit_id=? AND depot_id=?
        ")->execute([$quantite_a_livrer, $d['produit_id'], $depot_id]);

        /* ===============================
           MOUVEMENT STOCK
        ================================= */
        $conn->prepare("
            INSERT INTO mouvements_stock 
            (produit_id, depot_source_id, quantite, type, reference_table, reference_id, utilisateur_id, date_mouvement)
            VALUES (?, ?, ?, 'sortie_commande_client', 'commandes_clients', ?, ?, NOW())
        ")->execute([
            $d['produit_id'],
            $depot_id,
            $quantite_a_livrer,
            $commande_id,
            $utilisateur_id
        ]);

        /* ===============================
           UPDATE LIGNE
        ================================= */
        $conn->prepare("
            UPDATE commandes_clients_details 
            SET quantite_livree = quantite_livree + ?
            WHERE id=?
        ")->execute([$quantite_a_livrer, $detail_id]);

        $total_reste_global += ($reste - $quantite_a_livrer);
    }

    /* ===============================
       STATUT GLOBAL
    ================================= */
    if ($total_reste_global <= 0) {
        $statut = 'livree';
    } elseif ($total_reste_global < array_sum(array_column($details, 'quantite'))) {
        $statut = 'partiellement_livree';
    } else {
        $statut = 'en_cours';
    }

    $conn->prepare("
        UPDATE commandes_clients 
        SET statut=? 
        WHERE id=?
    ")->execute([$statut, $commande_id]);

    $conn->commit();

    /* ===============================
       REDIRECTION
    ================================= */
    header("Location: /eagle_client_istanbulcups/index.php?page=commandes_clients&success=livraison");
    exit;

} catch (Exception $e) {

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