<?php
/**
 * dashboard.php — Métricas para el panel de inicio
 * GET /admin/api/dashboard.php
 *
 * Tipos de transacción para ventas:
 *   10 = Nota de Venta
 *   11 = Nota por Asignar
 *    6 = Nota Especial
 */

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;
}

// ── Fechas de referencia ───────────────────────────────────────────────────
// Usamos siempre el día 1 del mes actual para evitar problemas con meses
// cortos (ej: modify('-1 month') desde el 29-Mar salta a 29-Ene, no Feb)
$hoy        = new DateTime();
$anioActual = (int)$hoy->format('Y');
$mesActual  = (int)$hoy->format('n');

// Primer y último día del mes actual
$inicioMes = sprintf('%04d-%02d-01', $anioActual, $mesActual);
$finMes    = $hoy->format('Y-m-t');

// Hace 3 meses — calculado desde el día 1 del mes actual
$base = new DateTime(sprintf('%04d-%02d-01', $anioActual, $mesActual));
$base->modify('-3 months');
$inicio3 = $base->format('Y-m-01');
$fin3    = $base->format('Y-m-t');

// ── Helper: rango de un mes dado (año, mes) ────────────────────────────────
function mesRango(int $y, int $m): array {
    $ini = sprintf('%04d-%02d-01', $y, $m);
    $fin = date('Y-m-t', mktime(0, 0, 0, $m, 1, $y));
    return [$ini, $fin];
}

// ── Helper: retroceder N meses desde (año, mes) sin saltar meses cortos ───
function retrocederMeses(int $anio, int $mes, int $n): array {
    $total = ($anio * 12 + $mes - 1) - $n;
    return [intdiv($total, 12), ($total % 12) + 1];
}

// ── 1. Ventas del mes actual (MXN) ────────────────────────────────────────
$stmtVA = $db->prepare("
    SELECT COALESCE(SUM(d.cantidad), 0) AS total
    FROM transacciones t
    JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
    WHERE t.tipostr_idtipostr IN (10, 11, 6)
      AND t.fechat BETWEEN ? AND ?
");
$stmtVA->execute([$inicioMes, $finMes]);
$ventasMesActual = (float)$stmtVA->fetchColumn();

// ── 2. Ventas de hace 3 meses (MXN) ───────────────────────────────────────
$stmtV3 = $db->prepare("
    SELECT COALESCE(SUM(d.cantidad), 0) AS total
    FROM transacciones t
    JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
    WHERE t.tipostr_idtipostr IN (10, 11, 6)
      AND t.fechat BETWEEN ? AND ?
");
$stmtV3->execute([$inicio3, $fin3]);
$ventas3Meses = (float)$stmtV3->fetchColumn();

// ── 3. Ventas últimos 12 meses por mes (MXN) ──────────────────────────────
$ventas12 = [];
for ($i = 11; $i >= 0; $i--) {
    [$y, $mm] = retrocederMeses($anioActual, $mesActual, $i);
    [$ini, $fin] = mesRango($y, $mm);
    $key = sprintf('%04d-%02d', $y, $mm);

    $st = $db->prepare("
        SELECT COALESCE(SUM(d.cantidad), 0) AS total
        FROM transacciones t
        JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
        WHERE t.tipostr_idtipostr IN (10, 11, 6)
          AND t.fechat BETWEEN ? AND ?
    ");
    $st->execute([$ini, $fin]);
    $ventas12[$key] = (float)$st->fetchColumn();
}

// ── 4. Órdenes pendientes (tipo 7 u 8) ────────────────────────────────────
$stmtOP = $db->query("
    SELECT COUNT(*) FROM transacciones
    WHERE tipostr_idtipostr IN (7, 8)
");
$ordenesPendientes = (int)$stmtOP->fetchColumn();

// ── 5. Nuevos distribuidores últimos 6 meses ──────────────────────────────
$dist6 = [];
for ($i = 5; $i >= 0; $i--) {
    [$y, $mm] = retrocederMeses($anioActual, $mesActual, $i);
    [$ini, $fin] = mesRango($y, $mm);
    $key = sprintf('%04d-%02d', $y, $mm);

    $st = $db->prepare("
        SELECT COUNT(*) FROM inversionista
        WHERE estampa BETWEEN ? AND ?
    ");
    $st->execute([$ini, $fin]);
    $dist6[$key] = (int)$st->fetchColumn();
}

// ── 6. Regalías del mes (tabla regs2, cd = 0) ─────────────────────────────
$stmtReg = $db->prepare("
    SELECT
        COALESCE(SUM(CASE WHEN status IN (1,5) THEN apagar ELSE 0 END), 0) AS pagadas,
        COALESCE(SUM(CASE WHEN status = 0      THEN apagar ELSE 0 END), 0) AS por_pagar
    FROM regs2
    WHERE cd = 0
      AND fechap BETWEEN ? AND ?
");
$stmtReg->execute([$inicioMes, $finMes]);
$regRow      = $stmtReg->fetch(PDO::FETCH_ASSOC);
$regPagadas  = (float)($regRow['pagadas']  ?? 0);
$regPorPagar = (float)($regRow['por_pagar'] ?? 0);

// ── Respuesta ──────────────────────────────────────────────────────────────
echo json_encode([
    'success' => true,
    'data' => [
        'ventas_mes_actual'  => $ventasMesActual,
        'ventas_mes_3atras'  => $ventas3Meses,
        'ventas_12meses'     => $ventas12,
        'ordenes_pendientes' => $ordenesPendientes,
        'distribuidores_6m'  => $dist6,
        'regalias_mes' => [
            'pagadas'   => $regPagadas,
            'por_pagar' => $regPorPagar,
            'total'     => $regPagadas + $regPorPagar,
        ],
        'periodo' => [
            'mes'   => $mesActual,
            'anio'  => $anioActual,
            'label' => $hoy->format('F Y'),
        ],
    ]
], JSON_UNESCAPED_UNICODE);
