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

try {

    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        throw new Exception("Méthode invalide");
    }

    $achat_id = (int)($_POST['achat_id'] ?? 0);
    $montant  = floatval($_POST['montant'] ?? 0);
    $mode_paiement_id = (int)($_POST['mode_paiement_id'] ?? 0);
    $user_id = $_SESSION['user']['id'];

    if (!$achat_id || $montant <= 0 || !$mode_paiement_id) {
        throw new Exception("Données invalides");
    }

    /** Achat */
    $stmt = $conn->prepare("SELECT * FROM achats WHERE id=? FOR UPDATE");
    $stmt->execute([$achat_id]);
    $achat = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$achat) throw new Exception("Achat introuvable");

    if ($montant > $achat['reste_a_payer']) {
        throw new Exception("Montant supérieur au reste à payer");
    }

    /** Session caisse */
    $stmt = $conn->prepare("
        SELECT sc.id, sc.caisse_id
        FROM sessions_caisse sc
        WHERE sc.utilisateur_id=? AND sc.statut='ouverte'
        LIMIT 1
    ");
    $stmt->execute([$user_id]);
    $session = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$session) throw new Exception("Aucune caisse ouverte");

    $conn->beginTransaction();

    /** Mise à jour achat */
    $nouveau_paye = $achat['montant_verse'] + $montant;
    $reste = $achat['totalTTC'] - $nouveau_paye;
    $statut = ($reste <= 0) ? 'regle' : 'partiel';

    $conn->prepare("
        UPDATE achats
        SET montant_verse=?, reste_a_payer=?, statut_paiement=?
        WHERE id=?
    ")->execute([$nouveau_paye, $reste, $statut, $achat_id]);

    /** Dette fournisseur */
    $conn->prepare("
        UPDATE dettes_fournisseurs
        SET montant_paye = montant_paye + ?,
            reste_a_payer = reste_a_payer - ?,
            statut = ?
        WHERE achat_id = ?
    ")->execute([
        $montant,
        $montant,
        ($reste <= 0 ? 'Soldé' : 'En cours'),
        $achat_id
    ]);

    /** Type caisse autorisé */
    $stmt = $conn->prepare("
        SELECT ct.id
        FROM caisse_types ct
        JOIN types_caisse tc ON tc.id = ct.type_caisse_id
        JOIN modes_paiement mp ON mp.code = tc.code
        WHERE ct.caisse_id=? AND mp.id=?
        LIMIT 1
    ");
    $stmt->execute([$session['caisse_id'], $mode_paiement_id]);
    $caisse_type_id = $stmt->fetchColumn();
    if (!$caisse_type_id) throw new Exception("Type de caisse interdit");

    /** Opération caisse */
    $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 (?,?,?,?,?,'achats',?,?,NOW())
    ")->execute([
        $session['id'],
        $caisse_type_id,
        'sortie',
        $montant,
        $mode_paiement_id,
        $achat_id,
        $user_id
    ]);

    $conn->commit();

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

} catch (Throwable $e) {
    if ($conn->inTransaction()) $conn->rollBack();
    die("❌ ".$e->getMessage());
}
