<?php
session_start();

require_once __DIR__ . "/../../config/db.php";

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

$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) {
    throw new Exception("Aucune session de caisse ouverte pour cet utilisateur");
}


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

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $creance_id       = $_POST['creance_id'] ?? null;
    $montant_paye   = floatval($_POST['montant_paye'] ?? 0);
    $mode_paiement_id  = $_POST['mode_paiement_id'] ?? 'null';

    $montant_paye_devise = $montant_paye;


    if ($creance_id && $montant_paye_devise > 0) {
        //  Récupérer la creance
        $stmt = $conn->prepare("SELECT * FROM creances_clients WHERE id = ?");
        $stmt->execute([$creance_id]);
        $creance = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($creance) {
            $nouveau_paye   = $creance['montant_paye'] + $montant_paye_devise;
            $reste_a_payer  = $creance['montant_total'] - $nouveau_paye;
            $statut         = ($reste_a_payer <= 0) ? "Soldé" : "En cours";

            //  Mise à jour de la creance
            $stmt = $conn->prepare("
                UPDATE creances_clients
                SET montant_paye = ?, reste_a_payer = ?, statut = ?
                WHERE id = ?
            ");
            $stmt->execute([$nouveau_paye, max(0, $reste_a_payer), $statut, $creance_id]);

            if (!empty($creance['vente_id'])) {
                $vente_id = $creance['vente_id'];

                // Récupérer la vente
                $stmt = $conn->prepare("SELECT * FROM ventes WHERE id = ?");
                $stmt->execute([$vente_id]);
                $vente = $stmt->fetch(PDO::FETCH_ASSOC);

                if ($vente) {
                    $new_montant_verse = $vente['montant_verse'] + $montant_paye_devise;
                    $new_reste         = $vente['totalTTC'] - $new_montant_verse;
                    $vente_statut      = ($new_reste <= 0) ? "Payé" : "Impayé";

                    $stmt = $conn->prepare("
                        UPDATE ventes
                        SET montant_verse = ?, reste_a_payer = ?, statut = ?
                        WHERE id = ?
                    ");
                    $stmt->execute([$new_montant_verse, max(0, $new_reste), $vente_statut, $vente_id]);
                }
            }

            /*  $stmt = $conn->prepare("
                SELECT ct.id AS caisse_type_id
                FROM sessions_caisse sc
                JOIN caisse_types ct ON ct.caisse_id = sc.caisse_id
                JOIN types_caisse tc ON tc.id = ct.type_caisse_id
                JOIN modes_paiement mp ON mp.code = tc.code
                WHERE sc.id = ?
                AND mp.id = ?
                ");
                $stmt->execute([
                    $session_caisse_id,
                    $mode_paiement_id
                ]);

                $caisseType = $stmt->fetch(PDO::FETCH_ASSOC);

                if (!$caisseType) {
                    throw new Exception("Type de caisse non autorisé dans la caisse ouverte");
                }

                $caisse_type_id = $caisseType['caisse_type_id']; */

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

            //  Enregistrement en caisse (entree)
            $stmt = $conn->prepare("
                INSERT INTO operations_caisse (
                    caisse_type_id,
                    session_caisse_id,
                    type_operation,
                    montant,
                    mode_paiement_id,
                    reference_table,
                    reference_id,
                    date_operation
                )
                VALUES (?, ?, 'entree', ?, ?, 'creances_clients', ?, NOW())
            ");
            $stmt->execute([
                $caisse_type_id,
                $session_caisse_id,
                $montant_paye_devise,
                $mode_paiement_id,
                $creance_id
            ]);

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

            //  Mise à jour solde caisse
            $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]);
        }
    }
}

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