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

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

/* ===============================
   SESSION CAISSE
================================= */
$stmt = $conn->prepare("
    SELECT id, caisse_id
    FROM sessions_caisse
    WHERE utilisateur_id = ?
    AND statut = 'ouverte'
    LIMIT 1
");
$stmt->execute([$utilisateur_id]);
$session = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt->closeCursor(); // IMPORTANT

if (!$session) {
    throw new Exception("Aucune session de caisse ouverte");
}

$session_caisse_id = $session['id'];
$caisse_id = $session['caisse_id'];


/* ===============================
   POST
================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST") {

    $fournisseur_id = (int)($_POST['fournisseur_id'] ?? 0);
    $mode_paiement_id = (int)($_POST['mode_paiement_id'] ?? 0);
    $produits = $_POST['produits'] ?? [];
    $date_achat = $_POST['date_achat'] ?? date("Y-m-d H:i:s");
    $taxe = (float)($_POST['taxe'] ?? 0);
    $remise = (float)($_POST['remise'] ?? 0);
    $montant_verse = (float)($_POST['montant_verse'] ?? 0);
    $type_achat = $_POST['type_achat'] ?? 'Comptant';
    $depot_id = (int)($_POST['depot_id'] ?? 1);

    if (!$mode_paiement_id) {
        throw new Exception("Mode de paiement obligatoire");
    }

    if (!$fournisseur_id) {
        throw new Exception("Fournisseur obligatoire");
    }

    if (empty($produits)) {
        throw new Exception("Aucun produit sélectionné");
    }

    /* ===============================
       NUMÉRO AUTO
    ================================= */
    $stmt = $conn->prepare("
        SELECT COUNT(*) 
        FROM achats 
        WHERE YEAR(date_achat)=YEAR(NOW()) 
        AND MONTH(date_achat)=MONTH(NOW())
    ");
    $stmt->execute();
    $nb = $stmt->fetchColumn();
    $stmt->closeCursor();

    $numero = "BC-" . date("Y/m") . "-" . str_pad($nb + 1, 2, "0", STR_PAD_LEFT);

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

    try {

        /* TOTAL */
        $totalHT = 0;
        foreach ($produits as $prod) {
            $p = $conn->prepare("SELECT prix_achat FROM produits WHERE id=?");
            $p->execute([$prod['id']]);
            $prix = $p->fetchColumn();
            $p->closeCursor();

            $totalHT += $prix * $prod['quantite'];
        }

        $totalTTC = $totalHT + $taxe - $remise;
        $reste = $totalTTC - $montant_verse;
        $statut = ($reste <= 0) ? "Payé" : "Impayé";

        /* ACHAT */
        $stmt = $conn->prepare("
            INSERT INTO achats 
            (numero,fournisseur_id,date_achat,totalHT,taxe,remise,totalTTC,
             montant_verse,reste_a_payer,type_achat,mode_paiement_id,
             statut,utilisateur_id,created_at)
            VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())
        ");
        $stmt->execute([
            $numero,$fournisseur_id,$date_achat,$totalHT,$taxe,$remise,
            $totalTTC,$montant_verse,$reste,$type_achat,
            $mode_paiement_id,$statut,$utilisateur_id
        ]);

        $achat_id = $conn->lastInsertId();

        /* DETAILS + STOCK */
        foreach ($produits as $prod) {

            $p = $conn->prepare("SELECT prix_achat FROM produits WHERE id=?");
            $p->execute([$prod['id']]);
            $prix = $p->fetchColumn();
            $p->closeCursor();

            $conn->prepare("
                INSERT INTO achats_details 
                (achat_id,produit_id,quantite,prix_unitaire, depot_id)
                VALUES (?,?,?,?,?)
            ")->execute([$achat_id,$prod['id'],$prod['quantite'],$prix,$depot_id]);

            $conn->prepare("
                INSERT INTO stock_depot (produit_id, depot_id, quantite)
                VALUES (?, ?, ?)
                ON DUPLICATE KEY UPDATE quantite = quantite + VALUES(quantite)
            ")->execute([$prod['id'], $depot_id, $prod['quantite']]);


            $conn->prepare("
                INSERT INTO mouvements_stock
                (produit_id,depot_dest_id,quantite,type,
                 reference_table,reference_id,utilisateur_id,date_mouvement)
                VALUES (?,?,?,'achat','achats',?,?,NOW())
            ")->execute([
                $prod['id'],$depot_id,$prod['quantite'],
                $achat_id,$utilisateur_id
            ]);
        }

        /* SORTIE CAISSE */
        if ($montant_verse > 0) {

            $stmt = $conn->prepare("
                SELECT ct.id
                FROM sessions_caisse sc
                JOIN caisse_types ct ON ct.caisse_id = sc.caisse_id
                JOIN modes_paiement mp 
                    ON mp.type_caisse_id = ct.type_caisse_id
                WHERE sc.id = ?
                AND mp.id = ?
                FOR UPDATE
            ");
            $stmt->execute([$session_caisse_id,$mode_paiement_id]);
            $caisse_type_id = $stmt->fetchColumn();
            $stmt->closeCursor();

            if (!$caisse_type_id) {
                throw new Exception("Mode non autorisé dans cette caisse");
            }

            $stmt = $conn->prepare("
                SELECT solde_actuel 
                FROM caisse_types 
                WHERE id=? 
                FOR UPDATE
            ");
            $stmt->execute([$caisse_type_id]);
            $solde = $stmt->fetchColumn();
            $stmt->closeCursor();

            if ($montant_verse > $solde) {
                throw new Exception("Solde insuffisant");
            }

            $conn->prepare("
                INSERT INTO operations_caisse
                (session_caisse_id,caisse_type_id,type_operation,
                 montant,mode_paiement_id,
                 reference_table,reference_id,utilisateur_id,date_operation)
                VALUES (?,?,'sortie',?,?,'achats',?,?,NOW())
            ")->execute([
                $session_caisse_id,$caisse_type_id,
                $montant_verse,$mode_paiement_id,
                $achat_id,$utilisateur_id
            ]);

            $conn->prepare("
                UPDATE caisse_types
                SET solde_actuel = solde_actuel - ?
                WHERE id=?
            ")->execute([$montant_verse,$caisse_type_id]);
        }

        $conn->commit();

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

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