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

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

/* ===============================
   SESSION CAISSE OBLIGATOIRE
================================= */

$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);

if (!$session) {
    die("Aucune session de caisse ouverte");
}

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

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

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

    try {

        $conn->beginTransaction();

        $dette_id       = (int)($_POST['dette_id'] ?? 0);
        $montant_paye   = (float)($_POST['montant_paye'] ?? 0);
        $mode_paiement_id = (int)($_POST['mode_paiement_id'] ?? 0);

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

        /* ===============================
           VERROUILLAGE DETTE
        ================================= */

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

        if (!$dette) {
            throw new Exception("Dette introuvable");
        }

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

        /* ===============================
           MISE À JOUR DETTE
        ================================= */

        $nouveau_paye  = $dette['montant_paye'] + $montant_paye;
        $reste         = $dette['montant_total'] - $nouveau_paye;
        $statut_dette  = ($reste <= 0) ? "Soldé" : "En cours";

        $stmt = $conn->prepare("
            UPDATE dettes_fournisseurs
            SET montant_paye = ?, 
                reste_a_payer = ?, 
                statut = ?
            WHERE id = ?
        ");
        $stmt->execute([
            $nouveau_paye,
            max(0, $reste),
            $statut_dette,
            $dette_id
        ]);

        /* ===============================
           MISE À JOUR ACHAT
        ================================= */

        $achat_id = $dette['achat_id'];

        $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");
        }

        $new_montant_verse = $achat['montant_verse'] + $montant_paye;
        $new_reste         = $achat['totalTTC'] - $new_montant_verse;
        $statut_achat      = ($new_reste <= 0) ? "Payé" : "Impayé";

        $stmt = $conn->prepare("
            UPDATE achats
            SET montant_verse = ?, 
                reste_a_payer = ?, 
                statut = ?
            WHERE id = ?
        ");
        $stmt->execute([
            $new_montant_verse,
            max(0, $new_reste),
            $statut_achat,
            $achat_id
        ]);

        /* ===============================
           HISTORIQUE PAIEMENT
        ================================= */

        $conn->prepare("
            INSERT INTO paiements_fournisseurs
            (achat_id, fournisseur_id, montant,
             mode_paiement_id, date_paiement,
             utilisateur_id, entreprise_id, created_at)
            VALUES (?, ?, ?, ?, NOW(), ?, 1, NOW())
        ")->execute([
            $achat_id,
            $achat['fournisseur_id'],
            $montant_paye,
            $mode_paiement_id,
            $utilisateur_id
        ]);

        /* ===============================
           CAISSE
        ================================= */

        $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");
            }

        // Opération caisse
        $conn->prepare("
            INSERT INTO operations_caisse
            (caisse_type_id, session_caisse_id,
             type_operation, montant,
             mode_paiement_id,
             reference_table, reference_id,
             utilisateur_id, date_operation)
            VALUES (?, ?, 'sortie', ?, ?, 
                    'dettes_fournisseurs', ?, ?, NOW())
        ")->execute([
            $caisse_type_id,
            $session_caisse_id,
            $montant_paye,
            $mode_paiement_id,
            $dette_id,
            $utilisateur_id
        ]);

        // Mise à jour solde type
        $conn->prepare("
            UPDATE caisse_types
            SET solde_actuel = solde_actuel - ?
            WHERE id = ?
        ")->execute([$montant_paye, $caisse_type_id]);

        // Mise à jour solde global
        $conn->prepare("
            UPDATE caisses c
            SET c.solde_actuel = (
                SELECT SUM(solde_actuel)
                FROM caisse_types
                WHERE caisse_id = c.id
            )
            WHERE c.id = ?
        ")->execute([$caisse_id]);

        $conn->commit();

    } catch (Exception $e) {

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

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