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

$title = "Validation de production";

$message = '';
$alertType = 'info';

try {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        throw new Exception("Méthode non autorisée");
    }

    $user_id = $_SESSION['user']['id'] ?? null;
    if (!$user_id) {
        throw new Exception("Utilisateur non authentifié");
    }

    $produit_id = (int)($_POST['produit_id'] ?? 0);
    $quantite_produite = (float)($_POST['quantite'] ?? 0);

    if ($produit_id <= 0 || $quantite_produite <= 0) {
        throw new Exception("Données invalides pour la production");
    }

    // 👉 À adapter si multi-dépôt plus tard
    $depot_id = 1;

    // =========================
    // FICHE TECHNIQUE
    // =========================
    $stmt = $conn->prepare("
        SELECT 
            fl.article_id,
            fl.quantite AS qte_par_unite,
            a.nom,
            a.stock_actuel,
            a.cout_achat,
            u.nom AS unite
        FROM fiche_lignes fl
        JOIN articles a ON a.id = fl.article_id
        JOIN unites u ON u.id = a.unite_id
        WHERE fl.fiche_id = (
            SELECT id FROM fiches_techniques WHERE produit_id = ?
        )
    ");
    $stmt->execute([$produit_id]);
    $matieres = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if (!$matieres) {
        throw new Exception("Aucune fiche technique trouvée pour ce produit");
    }

    $conn->beginTransaction();

    // =========================
    // VÉRIFICATION DES STOCKS
    // =========================
    foreach ($matieres as $m) {
        $besoin = $m['qte_par_unite'] * $quantite_produite;
        if ($m['stock_actuel'] < $besoin) {
            throw new Exception(
                "Stock insuffisant : {$m['nom']} (disponible {$m['stock_actuel']} {$m['unite']}, besoin {$besoin} {$m['unite']})"
            );
        }
    }

    // =========================
    // CRÉATION PRODUCTION (ENTÊTE)
    // =========================
    $reference = 'PROD-' . date('Ymd-His');

    $stmt = $conn->prepare("
        INSERT INTO productions
        (reference, date_production, depot_id, statut, cout_total, utilisateur_id, created_at)
        VALUES (?, NOW(), ?, 'valide', 0, ?, NOW())
    ");
    $stmt->execute([$reference, $depot_id, $user_id]);

    $production_id = $conn->lastInsertId();

    // =========================
    // DÉBIT DES MATIÈRES + MOUVEMENTS
    // =========================
    $cout_total = 0;

    foreach ($matieres as $m) {
        $qte_utilisee = $m['qte_par_unite'] * $quantite_produite;
        $cout_ligne = $qte_utilisee * $m['cout_achat'];
        $cout_total += $cout_ligne;

        // Débit stock
        $conn->prepare("
            UPDATE articles 
            SET stock_actuel = stock_actuel - ?
            WHERE id = ?
        ")->execute([$qte_utilisee, $m['article_id']]);

        $conn->prepare("
            UPDATE stock_articles 
            SET quantite = quantite - ?
            WHERE id = ?
        ")->execute([$qte_utilisee, $m['article_id']]);

        // Mouvement stock
        $conn->prepare("
            INSERT INTO mouvements_stock_production
            (article_id, type, quantite, reference_table, reference_id, created_at)
            VALUES (?, 'sortie', ?, 'productions', ?, NOW())
        ")->execute([$m['article_id'], $qte_utilisee, $production_id]);
    }

    // =========================
    // PRODUIT FINI
    // =========================
    $cout_unitaire = $cout_total / $quantite_produite;

    $stmt = $conn->prepare("
        INSERT INTO production_finis
        (production_id, produit_id, depot_id, quantite, cout_unitaire, cout_total)
        VALUES (?, ?, ?, ?, ?, ?)
    ");
    $stmt->execute([
        $production_id,
        $produit_id,
        $depot_id,
        $quantite_produite,
        $cout_unitaire,
        $cout_total
    ]);

    $stmt = $conn->prepare("
    SELECT id, quantite
    FROM stock_depot
    WHERE produit_id = ? AND depot_id = ?
    ");
    $stmt->execute([$produit_id, $depot_id]);
    $stock = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($stock) {
        // Mise à jour stock existant
        $conn->prepare("
            UPDATE stock_depot
            SET quantite = quantite + ?
            WHERE id = ?
        ")->execute([$quantite_produite, $stock['id']]);
    } else {
        // Création stock
        $conn->prepare("
            INSERT INTO stock_depot (produit_id, depot_id, quantite)
            VALUES (?, ?, ?)
        ")->execute([$produit_id, $depot_id, $quantite_produite]);
    }

    /* ===============================
   7. MOUVEMENT STOCK (PRODUCTION)
=============================== */

    $conn->prepare("
        INSERT INTO mouvements_stock
        (
            produit_id,
            depot_source_id,
            depot_dest_id,
            quantite,
            type,
            reference_table,
            reference_id,
            utilisateur_id,
            note,
            date_mouvement
        )
        VALUES (?, NULL, ?, ?, 'production_entree', 'productions', ?, ?, ?, NOW())
    ")->execute([
        $produit_id,
        $depot_id,
        $quantite_produite,
        $production_id,
        $user_id,
        'Entrée stock produit fini via production'
    ]);


    // =========================
    // MAJ COÛT GLOBAL
    // =========================
    $conn->prepare("
        UPDATE productions
        SET cout_total = ?
        WHERE id = ?
    ")->execute([$cout_total, $production_id]);

    // Commit transaction
    $conn->commit();

    // Message flash
    $_SESSION['flash_message'] = "
        <strong>Production validée avec succès</strong><br>
        Référence : <strong>$reference</strong><br>
        Quantité produite : <strong>$quantite_produite</strong><br>
        Coût total : <strong>" . number_format($cout_total, 2, ',', ' ') . " F CFA</strong><br>
        Coût unitaire : <strong>" . number_format($cout_unitaire, 2, ',', ' ') . " F CFA</strong>
    ";

    $_SESSION['flash_type'] = 'success';

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


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

    $_SESSION['flash_message'] = "Erreur lors de la validation : " . $e->getMessage();
    $_SESSION['flash_type'] = 'danger';

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

?>

<div class="container mt-4">
    <div class="alert alert-<?= $alertType ?>">
        <?= $message ?>
    </div>

    <a href="/eagle_client_istanbulcups/index.php?page=simulation" class="btn btn-primary">
        <i class="fa fa-arrow-left"></i> Retour à la simulation
    </a>
</div>
