<?php
declare(strict_types=1);
require_once dirname(__FILE__) . '/../config.php';

if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
    jsonErr(405, 'Metodo no permitido.');
}

$jwt   = auth();
$idinv = (int)$jwt['idinv'];
$db    = getDB();

$id_tx = isset($_GET['id']) ? (int)$_GET['id'] : 0;
if ($id_tx <= 0) {
    jsonErr(400, 'ID de transaccion requerido.');
}

try {
    // 1. Información general del pedido
    $stmt = $db->prepare(
        'SELECT i.id_inver, i.rfc, i.referencia,
                i.nombre, i.appat, i.apmat,
                COALESCE(d.puntos, 0)    AS puntos,
                COALESCE(d.cantidad, 0)  AS monto,
                t.fechat, t.tipostr_idtipostr, t.cdentrega,
                ta.costoEnvio, ta.id_direccionenvio
         FROM transacciones t
         JOIN depositos d ON t.idtransacciones = d.transacciones_idtransacciones
         JOIN inversionista i ON i.id_inver = t.inversionista_id_inver
         LEFT JOIN transaccion_adicionales ta ON t.idtransacciones = ta.idtransacciones
         WHERE t.idtransacciones = ?
           AND t.inversionista_id_inver = ?'
    );
    $stmt->execute([$id_tx, $idinv]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$row) {
        jsonErr(404, 'Transaccion no encontrada.');
    }

    // 2. Sección "Pedido": tabla pedido_real
    $stmt2 = $db->prepare(
        'SELECT id_prod, cant FROM pedido_real WHERE transacciones = ?'
    );
    $stmt2->execute([$id_tx]);
    $items = $stmt2->fetchAll(PDO::FETCH_ASSOC);

    $pedido = [];
    foreach ($items as $item) {
        $id_prod  = (int)$item['id_prod'];
        $cantidad = (int)$item['cant'];

        if ($id_prod < 1000) {
            $sp = $db->prepare(
                'SELECT nombreProd AS nombre, precio, puntos FROM productos WHERE id_prod = ?'
            );
        } else {
            $sp = $db->prepare(
                'SELECT promodesc AS nombre, precio, puntos FROM promod WHERE id_promo = ?'
            );
        }
        $sp->execute([$id_prod]);
        $prod = $sp->fetch(PDO::FETCH_ASSOC);

        $pedido[] = [
            'id_prod'  => $id_prod,
            'nombre'   => $prod['nombre'] ?? 'Producto',
            'cant'     => $cantidad,
            'precio'   => (float)($prod['precio'] ?? 0),
            'puntos'   => (int)($prod['puntos'] ?? 0),
            'es_promo' => $id_prod >= 1000,
        ];
    }

    // 3. Sección "Productos": tabla pedido JOIN productos
    $stmt3 = $db->prepare(
        'SELECT p.nombreProd AS nombre, p.precio, p.puntos, pe.cant
         FROM pedido pe
         JOIN productos p ON p.id_prod = pe.productos_idprod
         WHERE pe.transacciones_idtransacciones = ?'
    );
    $stmt3->execute([$id_tx]);
    $prodRows = $stmt3->fetchAll(PDO::FETCH_ASSOC);

    $productos = [];
    foreach ($prodRows as $pr) {
        $productos[] = [
            'nombre' => $pr['nombre'] ?? 'Producto',
            'cant'   => (int)$pr['cant'],
            'precio' => (float)$pr['precio'],
            'puntos' => (int)$pr['puntos'],
        ];
    }

    $costoEnvio = (float)($row['costoEnvio'] ?? 0);
    $tipo       = (int)$row['tipostr_idtipostr'];
    $cdentrega  = (int)($row['cdentrega'] ?? 0);

    // 4. Datos de envío (solo cuando cdentrega = 8)
    $envio = null;
    if ($cdentrega === 8) {
        $id_dir = (int)($row['id_direccionenvio'] ?? 0);
        if ($id_dir > 0) {
            $stmtEnv = $db->prepare(
                'SELECT calle, noInt, noExt, entre1, entre2,
                        referencia, colonia, ciudad, estado, cp, pais
                 FROM direccionenvio
                 WHERE id = ?'
            );
            $stmtEnv->execute([$id_dir]);
            $envRow = $stmtEnv->fetch(PDO::FETCH_ASSOC);
            if ($envRow) {
                $envio = [
                    'calle'      => $envRow['calle'],
                    'noExt'      => $envRow['noExt'],
                    'noInt'      => $envRow['noInt'],
                    'entre1'     => $envRow['entre1'],
                    'entre2'     => $envRow['entre2'],
                    'referencia' => $envRow['referencia'],
                    'colonia'    => $envRow['colonia'],
                    'ciudad'     => $envRow['ciudad'],
                    'estado'     => $envRow['estado'],
                    'cp'         => $envRow['cp'],
                    'pais'       => $envRow['pais'],
                ];
            }
        }
    }

    // 5. Productos por Asignar (solo tipos 8 y 11): tabla nsalida
    $nsalida = [];
    if ($tipo === 8 || $tipo === 11) {
        $stmt4 = $db->prepare(
            'SELECT productos_idprod, cant, asignar FROM nsalida WHERE transacciones_idtransacciones = ?'
        );
        $stmt4->execute([$id_tx]);
        $nsItems = $stmt4->fetchAll(PDO::FETCH_ASSOC);

        foreach ($nsItems as $ns) {
            $id_prod_ns = (int)$ns['productos_idprod'];
            if ($id_prod_ns < 1000) {
                $spNs = $db->prepare(
                    'SELECT nombreProd AS nombre FROM productos WHERE id_prod = ?'
                );
            } else {
                $spNs = $db->prepare(
                    'SELECT promodesc AS nombre FROM promod WHERE id_promo = ?'
                );
            }
            $spNs->execute([$id_prod_ns]);
            $prodNs = $spNs->fetch(PDO::FETCH_ASSOC);

            $nsalida[] = [
                'id_prod'  => $id_prod_ns,
                'nombre'   => $prodNs['nombre'] ?? 'Producto',
                'cant'     => (int)$ns['cant'],
                'asignar'  => (int)($ns['asignar'] ?? 0),
            ];
        }
    }

    // 6. Pago: pagovta
    $stmtPago = $db->prepare(
        'SELECT efectivo, deposito, tarjeta, regalias, voucher, porpagar, abono
         FROM pagovta
         WHERE idtransacciones = ?'
    );
    $stmtPago->execute([$id_tx]);
    $pagoRow = $stmtPago->fetch(PDO::FETCH_ASSOC);

    $pago = $pagoRow ? [
        'efectivo'  => (float)$pagoRow['efectivo'],
        'deposito'  => (float)$pagoRow['deposito'],
        'tarjeta'   => (float)$pagoRow['tarjeta'],
        'regalias'  => (float)$pagoRow['regalias'],
        'voucher'   => (float)$pagoRow['voucher'],
        'porpagar'  => (float)$pagoRow['porpagar'],
        'abono'     => (float)$pagoRow['abono'],
    ] : null;

    // 7. Asignaciones realizadas de esta nota
    $asignaciones = [];
    $stmt5 = $db->prepare(
        'SELECT t.idtransacciones, i.nombre, i.appat, i.apmat,
                t.fechat, d.puntos, i.referencia
         FROM transacciones t
         JOIN asignaciones a ON t.idtransacciones = a.idtransacciones
         JOIN inversionista i ON t.inversionista_id_inver = i.id_inver
         JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
         WHERE a.nsalida = ?'
    );
    $stmt5->execute([$id_tx]);
    $asigRows = $stmt5->fetchAll(PDO::FETCH_ASSOC);

    foreach ($asigRows as $ar) {
        $asignaciones[] = [
            'idtransacciones' => (int)$ar['idtransacciones'],
            'nombre'          => trim($ar['nombre'] . ' ' . $ar['appat'] . ' ' . ($ar['apmat'] ?? '')),
            'referencia'      => $ar['referencia'],
            'fechat'          => $ar['fechat'],
            'puntos'          => (int)$ar['puntos'],
        ];
    }

    jsonOk([
        'transaccion' => [
            'idtransacciones'   => $id_tx,
            'fechat'            => $row['fechat'],
            'tipostr_idtipostr' => $tipo,
            'cdentrega'         => $cdentrega,
            'referencia'        => $row['referencia'],
            'rfc'               => $row['rfc'],
            'nombre_completo'   => trim($row['nombre'] . ' ' . $row['appat'] . ' ' . ($row['apmat'] ?? '')),
            'puntos'            => (int)$row['puntos'],
            'monto'             => (float)$row['monto'],
            'costoEnvio'        => $costoEnvio,
        ],
        'envio'        => $envio,
        'pedido'       => $pedido,
        'productos'    => $productos,
        'nsalida'      => $nsalida,
        'asignaciones' => $asignaciones,
        'pago'         => $pago,
    ]);

} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Error interno: ' . $e->getMessage(),
    ], JSON_UNESCAPED_UNICODE);
    exit;
}
