<?php
/**
 * compra-detalle.php
 * Devuelve todos los datos de una transacción guardada en el formato
 * que necesita _ncBuildTicketHtml() para reimprimir el comprobante.
 *
 * GET ?id={idtransacciones}
 */
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');

require_once __DIR__ . '/../../config.php';
$db = getDB();

$id = intval($_GET['id'] ?? 0);
if ($id <= 0) {
    echo json_encode(['ok' => false, 'error' => 'ID inválido']);
    exit;
}

try {
    $db->exec("SET NAMES utf8mb4 COLLATE utf8mb4_general_ci");
    $db->exec("SET CHARACTER SET utf8mb4");

    // ── 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 AS fecha,
               i.id_inver, 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' => 'Transacción no encontrada']);
        exit;
    }

    // ── 2. Artículos (pedido_real con nombre de producto o promo) ─────────────
    $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
        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 = ?
    ");
    $stItems->execute([$id]);
    $items = $stItems->fetchAll(PDO::FETCH_ASSOC);

    // ── 3. Pagos (depositos_transaccion) ──────────────────────────────────────
    $stPagos = $db->prepare("
        SELECT dt.tipo, dt.monto, dt.folio, dt.idbanco, dt.id_voucher,
               b.cuenta AS banco_nombre
        FROM depositos_transaccion dt
        LEFT JOIN bancos b ON b.idbanco = dt.idbanco
        WHERE dt.idtransacciones = ?
    ");
    $stPagos->execute([$id]);
    $pagosRaw = $stPagos->fetchAll(PDO::FETCH_ASSOC);

    $pagos = [];
    foreach ($pagosRaw as $p) {
        if ($p['tipo'] == 4) {
            // Voucher
            $pagos[] = ['tipo' => 'voucher', 'metodo' => 'voucher', 'monto' => (float)$p['monto'], 'idv' => $p['id_voucher']];
        } elseif ($p['tipo'] == 3) {
            $pagos[] = ['tipo' => 'pago', 'metodo' => 'efectivo', 'monto' => (float)$p['monto']];
        } elseif ($p['tipo'] == 2) {
            $metodo = $p['idbanco'] == 42 ? 'tarjeta' : ('depósito ' . ($p['banco_nombre'] ?: $p['idbanco']));
            $pagos[] = ['tipo' => 'pago', 'metodo' => $metodo, 'monto' => (float)$p['monto']];
        }
    }

    // ── 4. Envío y dirección (transaccion_adicionales + direccionenvio) ────────
    $envio = null;
    if (in_array((int)$tx['cdentrega'], [8, 12])) {
        $stEnv = $db->prepare("
            SELECT ta.costo_envio, ta.telefono, ta.id_direccionenvio,
                   de.calle, de.noExt, de.noInt, de.entre1, de.entre2,
                   de.referencia, de.colonia, de.ciudad, de.estado, de.cp
            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 = [
                'tipo'       => 'envio',
                'carrier'    => '',
                'costo_envio'=> (int)($envRow['costo_envio'] ?? 0),
                'direccion'  => [
                    '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']        ?? '',
                ]
            ];
        }
    }

    // ── 5. Calcular porpagar ───────────────────────────────────────────────────
    $totalPagado = array_sum(array_column($pagos, 'monto'));
    $pend = max(0, (float)$tx['total'] - $totalPagado);

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

    // ── 7. Fecha formateada ────────────────────────────────────────────────────
    $fechaDt = new DateTime($tx['fecha']);
    $fecha = $fechaDt->format('d/m/Y');
    $hora  = $fechaDt->format('H:i');

    // ── 8. Construir objeto ticket ────────────────────────────────────────────
    $ticket = [
        'idTx'      => (int)$tx['idtransacciones'],
        'fecha'     => $fecha,
        'hora'      => $hora,
        'tipoNota'  => $tipoNota,
        'tipoColor' => $tipoColor,
        'dist' => [
            'nombre'    => $tx['nombre']    ?? '',
            'appat'     => $tx['appat']     ?? '',
            'rfc'       => $tx['rfc']       ?? '',
            'referencia'=> $tx['referencia']?? '',
        ],
        'cdVenta'   => (int)$tx['cd_venta'],
        'cdEntrega' => (int)$tx['cdentrega'],
        'envio'     => $envio ?? [],
        'items'     => array_map(function($i) {
            return [
                'nombre'   => $i['nombre'],
                'cantidad' => (int)$i['cantidad'],
                'precio'   => (float)$i['precio'],
                'puntos'   => (float)$i['puntos'],
            ];
        }, $items),
        'pagos'     => $pagos,
        'total'     => (float)$tx['total'],
        'puntos'    => (float)$tx['puntos'],
        'pend'      => $pend,
    ];

    echo json_encode(['ok' => true, 'ticket' => $ticket]);

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