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

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

/* ===============================
   1. 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);

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

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

/* ===============================
   2. DATA
================================ */
$facture_id = (int)$_POST['facture_id'];
$client_id  = (int)$_POST['client_id'];
$montant    = (float)$_POST['montant'];
$mode       = (int)$_POST['mode_paiement_id'];
$reference  = $_POST['reference'] ?? null;

$conn->beginTransaction();

try {

    /* ===============================
       3. FACTURE
    ================================= */
    $f = $conn->query("
        SELECT * FROM factures_clients WHERE id=$facture_id
    ")->fetch(PDO::FETCH_ASSOC);

    if (!$f) throw new Exception("Facture introuvable");

    $total_paye = $conn->query("
        SELECT SUM(montant) FROM encaissements 
        WHERE facture_id=$facture_id
    ")->fetchColumn() ?? 0;

    $reste = $f['total_ttc'] - $total_paye;

    if ($montant <= 0 || $montant > $reste) {
        throw new Exception("Montant invalide");
    }

    /* ===============================
       4. ENCAISSEMENT
    ================================= */
    $conn->prepare("
        INSERT INTO encaissements
        (facture_id, client_id, montant, mode_paiement_id, reference, date_encaissement, utilisateur_id)
        VALUES (?,?,?,?,?,NOW(),?)
    ")->execute([
        $facture_id,
        $client_id,
        $montant,
        $mode,
        $reference,
        $utilisateur_id
    ]);

    /* ===============================
       5. TYPE CAISSE (IMPORTANT)
    ================================= */
    $stmt = $conn->prepare("
        SELECT ct.id AS caisse_type_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 = ?
    ");
    $stmt->execute([$caisse_id, $mode]);
    $caisseType = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$caisseType) {
        throw new Exception("Type de caisse non configuré");
    }

    $caisse_type_id = $caisseType['caisse_type_id'];

    /* ===============================
       6. OPERATION 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 (?, ?, 'entree', ?, ?, 'factures_clients', ?, ?, NOW())
    ")->execute([
        $session_caisse_id,
        $caisse_type_id,
        $montant,
        $mode,
        $facture_id,
        $utilisateur_id
    ]);

    /* ===============================
       7. UPDATE CAISSE TYPE
    ================================= */
    $conn->prepare("
        UPDATE caisse_types
        SET solde_actuel = solde_actuel + ?
        WHERE id = ?
    ")->execute([$montant, $caisse_type_id]);

    /* ===============================
       8. UPDATE 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]);

    /* ===============================
       9. STATUT FACTURE
    ================================= */
    $new_total = $total_paye + $montant;

    if ($new_total >= $f['total_ttc']) {
        $statut = 'payee';
    } elseif ($new_total > 0) {
        $statut = 'partiellement_payee';
    } else {
        $statut = 'non_payee';
    }

    $conn->prepare("
        UPDATE factures_clients
        SET statut=?, montant_paye = montant_paye + ?, reste_a_payer = total_ttc - (montant_paye + ?)
        WHERE id=?
    ")->execute([$statut, $montant, $montant, $facture_id]);

    $conn->commit();

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

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