<?php
/**
 * transacciones.php — Listado de transacciones para el panel admin
 * GET /admin/api/transacciones.php
 *
 * Parámetros GET:
 *   desde              : fecha inicio  (YYYY-MM-DD)  — default: primer día del mes actual
 *   hasta              : fecha fin     (YYYY-MM-DD)  — default: hoy
 *   ci                 : idusuarios_ci (int)          — 0 = todos los centros
 *   mostrar_pendientes : 1 = incluir tipos 1, 7, 8    — default: 0
 *   tipo_nota          : tipo específico (int)         — 0 = todos los tipos visibles
 *   solo_por_pagar     : 1 = solo con saldo por pagar  — default: 0
 *   id_transaccion     : buscar por ID exacto (int)    — si se envía, ignora todos los demás filtros
 *
 * TOTALES (siempre sobre el período, sin importar filtros de tipo):
 *   - MXN       → tipos 6, 10, 11
 *   - Puntos    → tipos 10 y 12 únicamente
 *   - Por Pagar → suma de pagovta.porpagar para tipos 6, 10, 11
 *
 * TABLA por defecto: tipos 6, 10, 11, 12  (sin paginación — devuelve todos)
 * TABLA con pendientes: agrega tipos 1 (Cancelada), 7 y 8 (Venta Pendiente)
 */

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, OPTIONS');
header('Access-Control-Allow-Headers: Authorization, Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }

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

// ── Validar token ──────────────────────────────────────────────────────────
$headers    = getallheaders();
$authHeader = $headers['Authorization'] ?? $headers['authorization'] ?? '';
if (!preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) {
    http_response_code(401);
    echo json_encode(['error' => 'Token requerido']);
    exit;
}
$token = trim($m[1]);
$stmtTok = $db->prepare("SELECT idusuarios_sist FROM admin_sessions WHERE token = ? AND expira > NOW()");
$stmtTok->execute([$token]);
if (!$stmtTok->fetch()) {
    http_response_code(401);
    echo json_encode(['error' => 'Sesión expirada o inválida']);
    exit;
}

// ── Etiquetas de tipo de transacción ──────────────────────────────────────
$tipoLabel = [
    1  => 'Cancelada',
    6  => 'Especial',
    7  => 'Venta Pendiente',
    8  => 'Venta Pendiente',
    10 => 'Venta',
    11 => 'Por Asignar',
    12 => 'Asignación',
];

// ── Parámetros de filtro ───────────────────────────────────────────────────
$hoy       = new DateTime();
$mesActual = (int)$hoy->format('n');
$anio      = (int)$hoy->format('Y');

$desde             = $_GET['desde']    ?? sprintf('%04d-%02d-01', $anio, $mesActual);
$hasta             = $_GET['hasta']    ?? $hoy->format('Y-m-d');
$ci                = (int)($_GET['ci'] ?? 0);
$mostrarPendientes = (int)($_GET['mostrar_pendientes'] ?? 0) === 1;
$tipoNota          = (int)($_GET['tipo_nota'] ?? 0);
$soloPorPagar      = (int)($_GET['solo_por_pagar'] ?? 0) === 1;
$idTransaccion     = (int)($_GET['id_transaccion'] ?? 0);

// Validar formato de fechas
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $desde)) {
    $desde = sprintf('%04d-%02d-01', $anio, $mesActual);
}
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $hasta)) {
    $hasta = $hoy->format('Y-m-d');
}

// ── 1. Lista de centros de distribución (solo tipo_usuario = 2) ───────────
$centros = $db->query("
    SELECT idusuarios_ci, CONCAT(idusuarios_ci, ' - ', nombre) AS nombre
    FROM usuarios_ci
    WHERE tipo_usuario = 2
    ORDER BY nombre
")->fetchAll(PDO::FETCH_ASSOC);

// ── 2. WHERE para la tabla ────────────────────────────────────────────────
if ($idTransaccion > 0) {
    // Búsqueda por ID exacto — ignora todos los demás filtros
    $whereTabla  = "t.idtransacciones = ?";
    $paramsTabla = [$idTransaccion];
} elseif ($tipoNota > 0) {
    $whereTabla  = "t.tipostr_idtipostr = ? AND t.fechat BETWEEN ? AND ?";
    $paramsTabla = [$tipoNota, $desde, $hasta];
} else {
    $tiposTabla  = $mostrarPendientes ? '(1, 6, 7, 8, 10, 11, 12)' : '(6, 10, 11, 12)';
    $whereTabla  = "t.tipostr_idtipostr IN {$tiposTabla} AND t.fechat BETWEEN ? AND ?";
    $paramsTabla = [$desde, $hasta];
}
if ($idTransaccion === 0) {
    if ($ci > 0) {
        $whereTabla   .= " AND t.usuarios_ci_idusuarios_ci = ?";
        $paramsTabla[] = $ci;
    }
    if ($soloPorPagar) {
        $whereTabla .= " AND EXISTS (SELECT 1 FROM pagovta pv2 WHERE pv2.idtransacciones = t.idtransacciones AND pv2.porpagar > 0)";
    }
}

// ── 3. WHERE para totales MXN (tipos 6, 10, 11) — siempre sobre el período
$whereTotMxn  = "t.tipostr_idtipostr IN (6, 10, 11) AND t.fechat BETWEEN ? AND ?";
$paramsTotMxn = [$desde, $hasta];
if ($ci > 0) {
    $whereTotMxn   .= " AND t.usuarios_ci_idusuarios_ci = ?";
    $paramsTotMxn[] = $ci;
}

// ── 4. WHERE para totales de PUNTOS (tipos 10 y 12 únicamente) ───────────
$whereTotPts  = "t.tipostr_idtipostr IN (10, 12) AND t.fechat BETWEEN ? AND ?";
$paramsTotPts = [$desde, $hasta];
if ($ci > 0) {
    $whereTotPts   .= " AND t.usuarios_ci_idusuarios_ci = ?";
    $paramsTotPts[] = $ci;
}

// ── 5. Total de registros ─────────────────────────────────────────────────
$stmtCount = $db->prepare("SELECT COUNT(*) FROM transacciones t WHERE {$whereTabla}");
$stmtCount->execute($paramsTabla);
$totalRegistros = (int)$stmtCount->fetchColumn();

// ── 6. Total MXN (tipos 6, 10, 11) ───────────────────────────────────────
$stmtTotMxn = $db->prepare("
    SELECT COALESCE(SUM(d.cantidad), 0) AS total_mxn
    FROM transacciones t
    JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
    WHERE {$whereTotMxn}
");
$stmtTotMxn->execute($paramsTotMxn);
$totalMxn = (float)$stmtTotMxn->fetchColumn();

// ── 7. Total PUNTOS (tipos 10 y 12 únicamente) ───────────────────────────
$stmtTotPts = $db->prepare("
    SELECT COALESCE(SUM(d.puntos), 0) AS total_puntos
    FROM transacciones t
    JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
    WHERE {$whereTotPts}
");
$stmtTotPts->execute($paramsTotPts);
$totalPuntos = (int)$stmtTotPts->fetchColumn();

// ── 8a. PENDIENTE DE PAGO (suma de pagovta.porpagar, todos los tipos del filtro) ──
$stmtTotPend = $db->prepare("
    SELECT COALESCE(SUM(pv.porpagar), 0) AS total_pendiente
    FROM transacciones t
    JOIN pagovta pv ON pv.idtransacciones = t.idtransacciones
    WHERE {$whereTabla}
");
$stmtTotPend->execute($paramsTabla);
$totalPendientePago = (float)$stmtTotPend->fetchColumn();

// ── 8b. POR PAGAR (suma de pagovta.porpagar, solo tipos 6, 10 y 11) ────────
$stmtTotPP = $db->prepare("
    SELECT COALESCE(SUM(pv.porpagar), 0) AS total_porpagar
    FROM transacciones t
    JOIN pagovta pv ON pv.idtransacciones = t.idtransacciones
    WHERE {$whereTotMxn}
");
$stmtTotPP->execute($paramsTotMxn);
$totalPorPagar = (float)$stmtTotPP->fetchColumn();

// ── 9. Listado completo (sin paginación) ──────────────────────────────────
$stmtList = $db->prepare("
    SELECT
        t.idtransacciones,
        t.tipostr_idtipostr,
        t.fechat,
        t.consec,
        i.nombre       AS inv_nombre,
        i.appat        AS inv_appat,
        i.apmat        AS inv_apmat,
        i.referencia   AS inv_ref,
        uc.idusuarios_ci AS ci_id,
        uc.nombre      AS centro_nombre,
        d.cantidad,
        d.puntos,
        COALESCE(pv.porpagar, 0) AS pago_porpagar
    FROM transacciones t
    JOIN depositos d  ON d.transacciones_idtransacciones = t.idtransacciones
    LEFT JOIN inversionista i ON i.id_inver = t.inversionista_id_inver
    LEFT JOIN usuarios_ci uc  ON uc.idusuarios_ci = t.usuarios_ci_idusuarios_ci
    LEFT JOIN pagovta pv      ON pv.idtransacciones = t.idtransacciones
    WHERE {$whereTabla}
    ORDER BY t.fechat DESC, t.idtransacciones DESC
");
$stmtList->execute($paramsTabla);
$rows = $stmtList->fetchAll(PDO::FETCH_ASSOC);

// ── 10. Formatear filas ───────────────────────────────────────────────────
$transacciones = [];
foreach ($rows as $r) {
    $tipo  = (int)$r['tipostr_idtipostr'];
    $ciId  = $r['ci_id']         ?? null;
    $ciNom = $r['centro_nombre'] ?? null;

    $transacciones[] = [
        'id'           => (int)$r['idtransacciones'],
        'tipo'         => $tipo,
        'tipo_label'   => $tipoLabel[$tipo] ?? 'Desconocido',
        'es_pendiente' => in_array($tipo, [7, 8]),
        'es_cancelada' => ($tipo === 1),
        'es_especial'  => ($tipo === 6),
        'fecha'        => $r['fechat'],
        'consec'       => (int)$r['consec'],
        'distribuidor' => trim(($r['inv_nombre'] ?? '') . ' ' . ($r['inv_appat'] ?? '') . ' ' . ($r['inv_apmat'] ?? '')),
        'referencia'   => $r['inv_ref'] ?? '',
        'nota'         => ($ciId ? $ciId . ' - ' . (int)$r['consec'] : '—'),
        'cantidad'     => (float)$r['cantidad'],
        'puntos'       => (int)$r['puntos'],
        'por_pagar'    => (float)($r['pago_porpagar'] ?? 0),
    ];
}

// ── Respuesta ──────────────────────────────────────────────────────────────
echo json_encode([
    'success'       => true,
    'centros'       => $centros,
    'transacciones' => $transacciones,
    'totales' => [
        'mxn'              => $totalMxn,
        'puntos'           => $totalPuntos,
        'pendiente_pago'   => $totalPendientePago,
        'por_pagar'        => $totalPorPagar,
        'registros'        => $totalRegistros,
    ],
    'filtros' => [
        'desde'              => $desde,
        'hasta'              => $hasta,
        'ci'                 => $ci,
        'tipo_nota'          => $tipoNota,
        'solo_por_pagar'     => $soloPorPagar,
        'mostrar_pendientes' => $mostrarPendientes,
        'id_transaccion'     => $idTransaccion,
    ],
], JSON_UNESCAPED_UNICODE);
