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

$utilisateur_id = $_SESSION['user']['id'] ?? null;
if (!$utilisateur_id) {
    $_SESSION['pos_error'] = "Utilisateur non authentifié";
    header("Location: /eagle_client_istanbulcups/index.php?page=pos");
    exit;
}

// Vérifier session de caisse ouverte
$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) {
    $_SESSION['pos_error'] = "Aucune session de caisse ouverte";
    header("Location: /eagle_client_istanbulcups/index.php?page=pos");
    exit;
}

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

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $conn->beginTransaction();
    try {
        $client_id = $_POST['client_id'] ?? null;
        $produits  = $_POST['produits'] ?? [];
        $remise    = floatval($_POST['remise'] ?? 0);
        $montant_verse = floatval($_POST['montant_verse'] ?? 0);
        $mode_paiement_id = $_POST['mode_paiement_id'] ?? 1;

        if (!$client_id || empty($produits)) {
            throw new Exception("Client ou produits non définis");
        }

        // --- Calcul total
        $totalHT = 0;
        foreach ($produits as $p) {
            $stmt = $conn->prepare("SELECT prix_vente FROM produits WHERE id=?");
            $stmt->execute([$p['id']]);
            $prix = floatval($stmt->fetchColumn());
            $totalHT += $prix * $p['quantite'];
        }

        $taxe = 0;
        $totalTTC = max($totalHT + $taxe - $remise, 0);
        $montant_enregistre = min($montant_verse, $totalTTC);
        $reste_a_payer = $totalTTC - $montant_verse;
        $statut = ($reste_a_payer <= 0) ? 'Payé' : 'Impayé';

        // --- Numéro vente
        $annee = date("Y"); $mois = date("m");
        $stmt = $conn->prepare("SELECT COUNT(*) FROM ventes WHERE YEAR(date_vente)=? AND MONTH(date_vente)=?");
        $stmt->execute([$annee, $mois]);
        $ordre = str_pad($stmt->fetchColumn()+1,2,"0",STR_PAD_LEFT);
        $numero = "POS-$annee/$mois-$ordre";

        // --- Insert vente
        $stmt = $conn->prepare("
            INSERT INTO ventes
            (numero, client_id, date_vente, totalHT, taxe, remise, totalTTC,
             montant_verse, reste_a_payer, statut, mode_paiement_id, utilisateur_id, created_at)
            VALUES (?, ?, NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
        ");
        $stmt->execute([$numero,$client_id,$totalHT,$taxe,$remise,$totalTTC,
                        $montant_verse,$reste_a_payer,$statut,$mode_paiement_id,$utilisateur_id]);
        $vente_id = $conn->lastInsertId();

        // --- Détails produits + stock
        foreach ($produits as $p) {
            $produit_id = $p['id']; $qte = $p['quantite'];
            $stmt = $conn->prepare("SELECT prix_vente FROM produits WHERE id=?");
            $stmt->execute([$produit_id]);
            $prix = floatval($stmt->fetchColumn());

            $conn->prepare("
                INSERT INTO ventes_details
                (vente_id, produit_id, quantite, prix_unitaire)
                VALUES (?, ?, ?, ?)
            ")->execute([$vente_id,$produit_id,$qte,$prix]);

            $conn->prepare("UPDATE stock_depot SET quantite=quantite-? WHERE produit_id=?")
                 ->execute([$qte,$produit_id]);

            $conn->prepare("
                INSERT INTO mouvements_stock
                (produit_id, quantite, type, reference_table, reference_id, utilisateur_id, date_mouvement)
                VALUES (?, ?, 'vente', 'ventes', ?, ?, NOW())
            ")->execute([$produit_id,$qte,$vente_id,$utilisateur_id]);
        }

        // --- Créance client si impayé
        if($reste_a_payer>0){
            $conn->prepare("
                INSERT INTO creances_clients
                (vente_id, client_id, montant_total, montant_paye, reste_a_payer, statut, date_creation)
                VALUES (?, ?, ?, ?, ?, 'En cours', NOW())
            ")->execute([$vente_id,$client_id,$totalTTC,$montant_enregistre,$reste_a_payer]);
        }

        // --- Caisse
        if($montant_enregistre>0){
            $stmt = $conn->prepare("
                SELECT tc.id AS type_caisse_id
                FROM modes_paiement mp
                JOIN types_caisse tc ON tc.id=mp.type_caisse_id
                WHERE mp.id=? LIMIT 1
            ");
            $stmt->execute([$mode_paiement_id]);
            $type_caisse_id = $stmt->fetchColumn();
            if(!$type_caisse_id) throw new Exception("Type de caisse introuvable");

            $stmt = $conn->prepare("
                SELECT ct.id, ct.caisse_id
                FROM sessions_caisse sc
                JOIN caisse_types ct ON ct.caisse_id=sc.caisse_id
                WHERE sc.id=? AND ct.type_caisse_id=? LIMIT 1
            ");
            $stmt->execute([$session_caisse_id,$type_caisse_id]);
            $row = $stmt->fetch(PDO::FETCH_ASSOC);
            if(!$row) throw new Exception("Aucune caisse disponible pour ce mode de paiement");

            $caisse_type_id = $row['id'];
            $caisse_id = $row['caisse_id'];

            $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',?,?, 'ventes',?, ?, NOW())
            ")->execute([$session_caisse_id,$caisse_type_id,$montant_enregistre,$mode_paiement_id,$vente_id,$utilisateur_id]);

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

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

        // --- Stocker les URLs tickets en session pour le JS
       $conn->prepare("
        INSERT INTO print_jobs (vente_id, type, session_caisse_id, utilisateur_id)
        VALUES (?, 'ticket_client', ?, ?)
    ")->execute([$vente_id, $session_caisse_id, $utilisateur_id]);


        // --- Redirection POS
        $_SESSION['pos_success'] = "Vente enregistrée avec succès (ID: $vente_id)";
        header("Location: /eagle_client_istanbulcups/index.php?page=pos");
        exit;

    } catch(Exception $e) {
        $conn->rollBack();
        $_SESSION['pos_error'] = "Erreur vente: " . $e->getMessage();
        header("Location: /eagle_client_istanbulcups/index.php?page=pos");
        exit;
    }
}
