<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

require_once __DIR__ . '/../../../config/db.php';
if (session_status() === PHP_SESSION_NONE) session_start();

header('Content-Type: application/json');

/**
 * Gestion centralisée des erreurs JSON
 */
function jsonError($msg, $code = 400, $debug = null) {
    http_response_code($code);
    $resp = ['success' => false, 'message' => $msg];
    if ($debug) $resp['debug'] = $debug;
    echo json_encode($resp);
    exit;
}

/* =========================
   UTILISATEUR
========================= */
if (!isset($_SESSION['user']['id'])) {
    jsonError("Accès refusé", 403);
}
$utilisateur_id = (int)$_SESSION['user']['id'];

/* =========================
   DONNÉES COMMANDE
========================= */
$table_id    = (int)($_POST['table_id'] ?? 0);
$commande_id = (int)($_POST['commande_id'] ?? $_SESSION['commande_en_cours'] ?? 0);

/* =========================
   PRODUITS
========================= */
$produits = [];
if (!empty($_POST['produits']) && is_array($_POST['produits'])) {
    foreach ($_POST['produits'] as $p) {
        $id   = (int)($p['id'] ?? 0);
        $qte  = (int)($p['qte'] ?? $p['quantite'] ?? 0);
        $prix = (float)($p['prix_vente'] ?? 0);

        if ($id > 0 && $qte > 0 && $prix > 0) {
            $produits[] = [
                'id' => $id,
                'qte' => $qte,
                'prix' => $prix
            ];
        }
    }
}

if ($table_id <= 0 || empty($produits)) {
    jsonError("Paramètres invalides");
}

/* =========================
   TRANSACTION
========================= */
try {
    $conn->beginTransaction();

    /* =========================
       VERROU TABLE
    ========================== */
    $stmt = $conn->prepare("
        SELECT id FROM commandes
        WHERE table_id = ? AND statut = 'ouverte' AND id != ?
    ");
    $stmt->execute([$table_id, $commande_id]);
    if ($stmt->fetch()) {
        jsonError("Cette table est déjà occupée");
    }

    /* =========================
       COMMANDE
    ========================== */
    if ($commande_id > 0) {
        // Mise à jour commande existante
        $stmt = $conn->prepare("
            UPDATE commandes
            SET table_id=?, utilisateur_id=?
            WHERE id=?
        ");
        $stmt->execute([$table_id, $utilisateur_id, $commande_id]);

        // Supprimer anciennes lignes
        $conn->prepare("DELETE FROM commande_lignes WHERE commande_id=?")->execute([$commande_id]);
    } else {
        // Nouvelle commande
        $stmt = $conn->prepare("
            INSERT INTO commandes (table_id, utilisateur_id, statut, created_at)
            VALUES (?, ?, 'ouverte', NOW())
        ");
        $stmt->execute([$table_id, $utilisateur_id]);
        $commande_id = (int)$conn->lastInsertId();
    }

    /* =========================
       INSERT LIGNES COMMANDE
    ========================== */
    $stmt = $conn->prepare("
        INSERT INTO commande_lignes
        (commande_id, produit_id, quantite, prix_unitaire, service_id, imprime)
        VALUES (?, ?, ?, ?, 1, 0)
    ");
    foreach ($produits as $p) {
        $stmt->execute([
            $commande_id,
            $p['id'],
            $p['qte'],
            $p['prix']
        ]);
    }

    $_SESSION['commande_en_cours'] = $commande_id;
    $conn->commit();

    echo json_encode([
        'success' => true,
        'commande_id' => $commande_id
    ]);
    exit;

} catch (Throwable $e) {
    if ($conn->inTransaction()) $conn->rollBack();

    error_log($e->getMessage());

    jsonError("Erreur serveur", 500, $e->getMessage());
}
