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

/* =========================================================
   SÉCURITÉ UTILISATEUR
========================================================= */

$utilisateur_id = $_SESSION['user']['id'] ?? 0;
if ($utilisateur_id <= 0) {
    throw new Exception("Utilisateur non authentifié");
}

/* =========================================================
   VALIDATION POST
========================================================= */

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit("Méthode non autorisée.");
}

$commande_id = (int)($_POST['commande_id'] ?? 0);
$depot_id    = (int)($_POST['depot_id'] ?? 0);
$produits    = $_POST['produits'] ?? [];

if ($commande_id <= 0 || empty($produits)) {
    exit("Données invalides.");
}

try {

    $conn->beginTransaction();

    /* =====================================================
       VERROUILLAGE COMMANDE
    ======================================================*/

    $stmt = $conn->prepare("
        SELECT * 
        FROM commandes_fournisseurs
        WHERE id = ?
        FOR UPDATE
    ");
    $stmt->execute([$commande_id]);
    $commande = $stmt->fetch(PDO::FETCH_ASSOC);

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

    if ($commande['statut'] === 'annulee') {
        throw new Exception("Commande annulée.");
    }

    if ($commande['statut'] === 'reçue') {
        throw new Exception("Commande déjà totalement reçue.");
    }

    /* =====================================================
       VERROUILLAGE DÉTAILS COMMANDE
    ======================================================*/

    $stmt = $conn->prepare("
        SELECT *
        FROM commandes_fournisseurs_details
        WHERE commande_id = ?
        FOR UPDATE
    ");
    $stmt->execute([$commande_id]);
    $detailsCommande = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (!$detailsCommande) {
        throw new Exception("Aucune ligne de commande trouvée.");
    }

    $mapCommande = [];
    foreach ($detailsCommande as $d) {
        $mapCommande[$d['produit_id']] = $d;
    }

    /* =====================================================
       INSERT RÉCEPTION (statut temporaire)
    ======================================================*/

    $numeroReception = "RC-" . date("YmdHis") . "-" . $commande_id;

    $stmt = $conn->prepare("
        INSERT INTO receptions_fournisseurs
        (commande_id, fournisseur_id, numero, date_reception,
         depot_id, statut, utilisateur_id, created_at)
        VALUES (?, ?, ?, NOW(), ?, 'partielle', ?, NOW())
    ");

    $stmt->execute([
        $commande_id,
        $commande['fournisseur_id'],
        $numeroReception,
        $depot_id,
        $utilisateur_id
    ]);

    $reception_id = $conn->lastInsertId();

    $ligneValide = false;

    /* =====================================================
       TRAITEMENT PRODUITS
    ======================================================*/

    foreach ($produits as $p) {

        $produit_id = (int)$p['produit_id'];
        $quantite   = (int)$p['quantite'];
        $prix       = (float)$p['prix'];

        if ($quantite <= 0) continue;

        if (!isset($mapCommande[$produit_id])) {
            throw new Exception("Produit non présent dans la commande.");
        }

        $cmd = $mapCommande[$produit_id];

        $resteAutorise = $cmd['quantite_commandee'] - $cmd['quantite_livree'];

        if ($quantite > $resteAutorise) {
            throw new Exception("Dépassement quantité pour produit ID ".$produit_id);
        }

        $ligneValide = true;

        /* Mise à jour détail réception */
        $conn->prepare("
            INSERT INTO receptions_fournisseurs_details
            (reception_id, produit_id, quantite_livree, prix_achat)
            VALUES (?, ?, ?, ?)
        ")->execute([$reception_id, $produit_id, $quantite, $prix]);

        /* Mise à jour quantite livrée commande */
        $conn->prepare("
            UPDATE commandes_fournisseurs_details
            SET quantite_livree = quantite_livree + ?
            WHERE commande_id = ? AND produit_id = ?
        ")->execute([$quantite, $commande_id, $produit_id]);

        /* Mise à jour stock */
        $conn->prepare("
            INSERT INTO stock_depot (produit_id, depot_id, quantite)
            VALUES (?, ?, ?)
            ON DUPLICATE KEY UPDATE quantite = quantite + VALUES(quantite)
        ")->execute([$produit_id, $depot_id, $quantite]);

        /* Mouvement stock */
        $conn->prepare("
            INSERT INTO mouvements_stock
            (produit_id, depot_dest_id, quantite, type,
             reference_table, reference_id,
             utilisateur_id, date_mouvement)
            VALUES (?, ?, ?, 'reception', 'receptions_fournisseurs',
                    ?, ?, NOW())
        ")->execute([
            $produit_id,
            $depot_id,
            $quantite,
            $reception_id,
            $utilisateur_id
        ]);
    }

    if (!$ligneValide) {
        throw new Exception("Aucune quantité valide reçue.");
    }

    /* =====================================================
       DÉTERMINATION STATUT (LIGNE PAR LIGNE)
    ======================================================*/

    $stmt = $conn->prepare("
        SELECT COUNT(*) 
        FROM commandes_fournisseurs_details
        WHERE commande_id = ?
        AND quantite_livree < quantite_commandee
    ");
    $stmt->execute([$commande_id]);
    $reste = $stmt->fetchColumn();

    $statutCommande = ($reste > 0) ? 'partielle' : 'reçue';
    $statutReception = ($reste > 0) ? 'partielle' : 'complete';

    /* Update réception */
    $conn->prepare("
        UPDATE receptions_fournisseurs
        SET statut = ?
        WHERE id = ?
    ")->execute([$statutReception, $reception_id]);

    /* Update commande */
    $conn->prepare("
        UPDATE commandes_fournisseurs
        SET statut = ?
        WHERE id = ?
    ")->execute([$statutCommande, $commande_id]);

    /* =====================================================
       STATUT PAIEMENT
    ======================================================*/

    if ($commande['statut_paiement'] === 'non_exigible') {
        $conn->prepare("
            UPDATE commandes_fournisseurs
            SET statut_paiement = 'impaye',
                reste_a_payer = total_ttc
            WHERE id = ?
        ")->execute([$commande_id]);
    }

    $conn->commit();

    header("Location: /eagle_client_istanbulcups/index.php?page=commande_fournisseur_view&id=".$commande_id);
    exit;

} catch (Exception $e) {

    $conn->rollBack();
    http_response_code(500);
    echo "Erreur réception : " . htmlspecialchars($e->getMessage());
}
