<?php
/**
 * compra-reimprimir.php
 * Devuelve JSON con los datos de la transacción para que el frontend
 * construya el ticket usando _ncBuildTicketHtml (igual que agrupaciones).
 *
 * GET ?id={idtransacciones}&token={token}
 */

header('Content-Type: application/json; charset=UTF-8');
require_once __DIR__ . '/../../config.php';

$token = $_GET['token'] ?? '';
$id    = intval($_GET['id'] ?? 0);

if (!$token || !$id) {
    echo json_encode(['ok' => false, 'error' => 'Parámetros inválidos.']);
    exit;
}

$db = getDB();

// Verificar sesión
$stSes = $db->prepare('SELECT idusuarios_sist FROM admin_sessions WHERE token = ? AND expira > NOW() LIMIT 1');
$stSes->execute([$token]);
if (!$stSes->fetch()) {
    echo json_encode(['ok' => false, 'error' => 'Sesión inválida o expirada.']);
    exit;
}

try {
    // ── 1. Transacción principal ──────────────────────────────────────────────
    $stTx = $db->prepare("
        SELECT t.idtransacciones,
               t.tipostr_idtipostr AS tipo,
               t.usuarios_ci_idusuarios_ci AS cd_venta,
               t.cdentrega,
               t.fechat,
               t.horat,
               i.nombre, i.appat, i.apmat, i.rfc, i.referencia,
               d.cantidad AS total,
               d.puntos
        FROM transacciones t
        JOIN inversionista i ON i.id_inver = t.inversionista_id_inver
        JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
        WHERE t.idtransacciones = ?
        LIMIT 1
    ");
    $stTx->execute([$id]);
    $tx = $stTx->fetch(PDO::FETCH_ASSOC);

    if (!$tx) {
        echo json_encode(['ok' => false, 'error' => 'No se encontró la transacción #' . $id]);
        exit;
    }

    // ── 2. Artículos ──────────────────────────────────────────────────────────
    $stItems = $db->prepare("
        SELECT pr.id_prod,
               COALESCE(p.nombreProd, pm.promodesc, CONCAT('Prod #', pr.id_prod)) AS nombre,
               pr.cant AS cantidad,
               COALESCE(p.precio, pm.precio, 0) AS precio,
               COALESCE(p.puntos, pm.puntos, 0) AS puntos_unit
        FROM pedido_real pr
        LEFT JOIN productos p  ON p.id_prod  = pr.id_prod AND pr.id_prod < 1000
        LEFT JOIN promod pm    ON pm.id_promo = pr.id_prod AND pr.id_prod >= 1000
        WHERE pr.transacciones = ?
        ORDER BY nombre
    ");
    $stItems->execute([$id]);
    $itemsRaw = $stItems->fetchAll(PDO::FETCH_ASSOC);

    $items = [];
    foreach ($itemsRaw as $row) {
        $items[] = [
            'nombre'   => $row['nombre'],
            'cantidad' => (int)$row['cantidad'],
            'precio'   => (float)$row['precio'],
        ];
    }

    // ── 3. Pagos ──────────────────────────────────────────────────────────────
    $stPagos = $db->prepare("SELECT tipo, monto FROM depositos_transaccion WHERE idtransacciones = ?");
    $stPagos->execute([$id]);
    $pagosRaw = $stPagos->fetchAll(PDO::FETCH_ASSOC);

    $metodos = [1 => 'tarjeta', 2 => 'depósito', 3 => 'efectivo', 4 => 'voucher'];
    $pagos = [];
    foreach ($pagosRaw as $p) {
        $pagos[] = [
            'metodo' => $metodos[(int)$p['tipo']] ?? 'otro',
            'monto'  => (float)$p['monto'],
            'tipo'   => 'pago',
        ];
    }

    // ── 4. Por pagar (pagovta) ────────────────────────────────────────────────
    $stPago = $db->prepare("SELECT porpagar FROM pagovta WHERE idtransacciones = ? LIMIT 1");
    $stPago->execute([$id]);
    $pagoRow = $stPago->fetch(PDO::FETCH_ASSOC);
    $porPagar = $pagoRow ? (float)$pagoRow['porpagar'] : 0;

    // ── 5. Envío (si aplica) ──────────────────────────────────────────────────
    $envio = [];
    if (in_array((int)$tx['cdentrega'], [8, 12])) {
        $stEnv = $db->prepare("
            SELECT ta.costoEnvio,
                   de.calle, de.noExt, de.noInt, de.colonia,
                   de.ciudad, de.estado, de.cp, de.referencia AS ref_dir
            FROM transaccion_adicionales ta
            LEFT JOIN direccionenvio de ON de.id = ta.id_direccionenvio
            WHERE ta.idtransacciones = ?
            LIMIT 1
        ");
        $stEnv->execute([$id]);
        $envRow = $stEnv->fetch(PDO::FETCH_ASSOC);
        if ($envRow) {
            $envio = [
                'costo_envio' => (float)($envRow['costoEnvio'] ?? 0),
                'carrier'     => 'Envío',
                'direccion'   => [
                    'calle'   => $envRow['calle']   ?? '',
                    'noExt'   => $envRow['noExt']   ?? '',
                    'noInt'   => $envRow['noInt']   ?? '',
                    'colonia' => $envRow['colonia'] ?? '',
                    'ciudad'  => $envRow['ciudad']  ?? '',
                    'estado'  => $envRow['estado']  ?? '',
                    'cp'      => $envRow['cp']      ?? '',
                ],
            ];
        }
    }

    // ── 6. Tipo de nota → label y color ──────────────────────────────────────
    $tipoLabels = [
        7  => 'Venta Pendiente',
        8  => 'Por Asignar Pendiente',
        10 => 'Venta',
        11 => 'Asignación',
        12 => 'Asignación',
        15 => 'Agrupación',
    ];
    $tipoColors = [
        7  => '#dc3545',
        8  => '#dc3545',
        10 => '#198754',
        11 => '#198754',
        12 => '#0d6efd',
        15 => '#6f42c1',
    ];
    $tipo      = (int)$tx['tipo'];
    $tipoLabel = $tipoLabels[$tipo] ?? ('Tipo ' . $tipo);
    $tipoColor = $tipoColors[$tipo] ?? '#6c757d';

    // ── 7. Fecha y hora ───────────────────────────────────────────────────────
    $fechaDt = new DateTime($tx['fechat']);
    $fecha   = $fechaDt->format('d/m/Y');
    $hora    = $tx['horat'] ? substr($tx['horat'], 0, 5) : $fechaDt->format('H:i');

    // ── 8. Respuesta JSON ─────────────────────────────────────────────────────
    echo json_encode([
        'ok'     => true,
        'ticket' => [
            'idTx'      => $id,
            'fecha'     => $fecha,
            'hora'      => $hora,
            'tipoNota'  => $tipoLabel,
            'tipoColor' => $tipoColor,
            'dist' => [
                'nombre'     => trim($tx['nombre'] . ' ' . ($tx['appat'] ?? '')),
                'appat'      => '',
                'rfc'        => $tx['rfc']        ?? '',
                'referencia' => $tx['referencia'] ?? '',
            ],
            'cdVenta'   => (int)$tx['cd_venta'],
            'cdEntrega' => (int)$tx['cdentrega'],
            'envio'     => $envio,
            'items'     => $items,
            'pagos'     => $pagos,
            'total'     => (float)$tx['total'],
            'puntos'    => (int)$tx['puntos'],
            'pend'      => $porPagar,
        ],
    ]);

} catch (Exception $e) {
    echo json_encode(['ok' => false, 'error' => $e->getMessage()]);
}
