<?php
require_once __DIR__ . "/../../config/db.php";
require_once __DIR__ . "/../../includes/check_auth.php";

ini_set('display_errors', 1);
error_reporting(E_ALL);

try {

    /* 🔒 Méthode */
    if (!isset($_GET['reception_id'])) {
        throw new Exception("Réception invalide");
    }

    $reception_id = (int) $_GET['reception_id'];
    $user_id = $_SESSION['user']['id'] ?? 0;

    if ($reception_id <= 0 || $user_id <= 0) {
        throw new Exception("Accès refusé");
    }

    $conn->beginTransaction();

    /* 🔐 Anti double génération */
    $check = $conn->prepare("
        SELECT id FROM achats 
        WHERE reception_id = ? 
        LIMIT 1
        FOR UPDATE
    ");
    $check->execute([$reception_id]);

    if ($check->fetch()) {
        throw new Exception("Achat déjà généré pour cette réception");
    }

    /* 📦 Infos réception */
    $stmt = $conn->prepare("
        SELECT rf.commande_id, cf.fournisseur_id
        FROM receptions_fournisseurs rf
        JOIN commandes_fournisseurs cf ON cf.id = rf.commande_id
        WHERE rf.id = ?
    ");
    $stmt->execute([$reception_id]);
    $rec = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$rec) {
        throw new Exception("Réception introuvable");
    }

    /* 📄 Lignes réception + prix fournisseur */
    $stmt = $conn->prepare("
        SELECT 
            rfd.produit_id,
            rfd.quantite_livree,
            COALESCE(
                (
                    SELECT ad.prix_unitaire
                    FROM achats_details ad
                    JOIN achats a ON a.id = ad.achat_id
                    WHERE ad.produit_id = rfd.produit_id
                      AND a.fournisseur_id = ?
                    ORDER BY a.date_achat DESC
                    LIMIT 1
                ),
                p.prix_achat,
                0
            ) AS prix_achat
        FROM receptions_fournisseurs_details rfd
        JOIN produits p ON p.id = rfd.produit_id
        WHERE rfd.reception_id = ?
    ");
    $stmt->execute([$rec['fournisseur_id'], $reception_id]);
    $lignes = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (!$lignes) {
        throw new Exception("Aucune ligne à facturer");
    }

    /* 🧮 Total */
    $totalHT = 0;
    foreach ($lignes as $l) {
        $totalHT += $l['quantite_livree'] * $l['prix_achat'];
    }

    /* 🔢 Numéro achat sécurisé */
    $numero = "ACH-" . date('Ymd-His') . "-" . random_int(100, 999);

    /* 🧾 Création achat */
    $stmt = $conn->prepare("
        INSERT INTO achats (
            numero, fournisseur_id, date_achat,
            totalHT, taxe, remise, totalTTC,
            montant_verse, reste_a_payer,
            type_achat, statut,
            utilisateur_id, commande_id, reception_id,
            created_at
        ) VALUES (
            ?, ?, NOW(),
            ?, 0, 0, ?,
            0, ?,
            'Crédit', 'Impayé',
            ?, ?, ?, NOW()
        )
    ");
    $stmt->execute([
        $numero,
        $fournisseur_id,
        $totalHT,
        $totalTTC,
        $reste_a_payer,
        $utilisateur_id,
        $commande_id,
        $reception_id
    ]);

    $achat_id = $conn->lastInsertId();
    
    /* 📦 Détails */
    $stmt = $conn->prepare("
        INSERT INTO achats_details
        (achat_id, produit_id, quantite, prix_unitaire)
        VALUES (?, ?, ?, ?)
    ");

    foreach ($lignes as $l) {
        $stmt->execute([
            $achat_id,
            $l['produit_id'],
            $l['quantite_livree'],
            $l['prix_achat']
        ]);
    }

    $conn->commit();

    /* Redirection paiement */
    header("Location: /eagle_client_istanbulcups/index.php?page=achat_reglement_view&id=" . $achat_id);
    exit;

} catch (Throwable $e) {
    if ($conn->inTransaction()) {
        $conn->rollBack();
    }
    die("Erreur : " . htmlspecialchars($e->getMessage()));
}
