<?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") {
    die("❌ Accès non autorisé.");
}

$from_id     = (int)($_POST['from_caisse_id'] ?? 0);
$to_id       = (int)($_POST['to_caisse_id'] ?? 0);
$montant     = (float)($_POST['montant'] ?? 0);
$commentaire = trim($_POST['commentaire'] ?? '');

if ($from_id <= 0 || $to_id <= 0 || $from_id === $to_id || $montant <= 0) {
    die("❌ Données invalides.");
}

/* ============================
   RÉCUP CAISSES + TYPES
============================ */
$stmt = $conn->prepare("
    SELECT id, solde_actuel, type_caisse_id
    FROM caisse_types
    WHERE id IN (?, ?)
");
$stmt->execute([$from_id, $to_id]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (count($rows) !== 2) {
    die("❌ Caisse introuvable.");
}

foreach ($rows as $r) {
    if ($r['id'] == $from_id) $from = $r;
    if ($r['id'] == $to_id)   $to   = $r;
}

/*  BLOCAGE MÉTIER */
if ($from['type_caisse_id'] === $to['type_caisse_id']) {
    die("❌ Transfert interdit entre caisses de même nature.");
}

if ($from['solde_actuel'] < $montant) {
    die("❌ Solde insuffisant dans la caisse source.");
}

/* ============================
   MODE DE PAIEMENT TRANSFERT
============================ */
$stmt = $conn->query("
    SELECT id FROM modes_paiement
    WHERE code = 'TRANSFERT'
    LIMIT 1
");
$mode_transfert_id = $stmt->fetchColumn();

if (!$mode_transfert_id) {
    die("❌ Mode de paiement TRANSFERT manquant.");
}

try {
    $conn->beginTransaction();

    /* === TABLE TRANSFERT === */
    $stmt = $conn->prepare("
        INSERT INTO caisses_transferts
        (from_caisse_id, to_caisse_id, montant, utilisateur_id, commentaire, created_at)
        VALUES (?, ?, ?, ?, ?, NOW())
    ");
    $stmt->execute([$from_id, $to_id, $montant, $utilisateur_id, $commentaire]);
    $transfert_id = $conn->lastInsertId();

    /* === SOLDES === */
    $conn->prepare("
        UPDATE caisse_types SET solde_actuel = solde_actuel - ?
        WHERE id = ?
    ")->execute([$montant, $from_id]);

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

    /* === OPÉRATION SORTIE === */
    $conn->prepare("
        INSERT INTO operations_caisse
        (caisse_type_id, session_caisse_id, type_operation, montant,
         mode_paiement_id, reference_table, reference_id, description,
         utilisateur_id, date_operation)
        VALUES (?, ?, 'sortie', ?, ?, 'caisses_transferts', ?, ?, ?, NOW())
    ")->execute([
        $from_id,
        $session_caisse_id,
        $montant,
        $mode_transfert_id,
        $transfert_id,
        "Transfert depuis caisse #$from_id. $commentaire",
        $utilisateur_id
    ]);

    /* === OPÉRATION ENTRÉE === */
    $conn->prepare("
        INSERT INTO operations_caisse
        (caisse_type_id, session_caisse_id, type_operation, montant,
         mode_paiement_id, reference_table, reference_id, description,
         utilisateur_id, date_operation)
        VALUES (?, ?, 'entree', ?, ?, 'caisses_transferts', ?, ?, ?, NOW())
    ")->execute([
        $to_id,
        $session_caisse_id,
        $montant,
        $mode_transfert_id,
        $transfert_id,
        "Transfert vers caisse #$to_id. $commentaire",
        $utilisateur_id
    ]);

    $conn->commit();

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

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