<?php
/**
 * ganancias-regs.php
 * Devuelve los registros de regalías de la tabla regs2 para un mes/año dado.
 *
 * Método: GET
 * Params: mes, anio, status (opcional: 0|1|5|20|all), orden (opcional: _real|apagar), dir (asc|desc)
 * Auth: Bearer token (admin_sessions)
 *
 * status: 0=Por Pagar, 1=Depósito, 5=Voucher, 20=Retenida
 */

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: Content-Type, Authorization');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

// config.php está dos niveles arriba: /admin/api/ -> /admin/ -> /
require_once __DIR__ . '/../../config.php';

// ── Autenticación admin ─────────────────────────────────────────────────────
$headers    = function_exists('getallheaders') ? getallheaders() : [];
$authHeader = $headers['Authorization'] ?? $headers['authorization'] ?? '';
if (!$authHeader && !empty($_SERVER['HTTP_AUTHORIZATION'])) {
    $authHeader = $_SERVER['HTTP_AUTHORIZATION'];
} elseif (!$authHeader && !empty($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
    $authHeader = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
}

if (!preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Token requerido']);
    exit;
}
$adminToken = trim($m[1]);

$db  = getDB();
$now = date('Y-m-d H:i:s');

$stmtSess = $db->prepare(
    "SELECT s.idusuarios_sist FROM admin_sessions s
     WHERE s.token = ? AND s.expira > ? LIMIT 1"
);
$stmtSess->execute([$adminToken, $now]);
if (!$stmtSess->fetch()) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Sesión expirada o inválida']);
    exit;
}

// ── Parámetros ──────────────────────────────────────────────────────────────
$mes    = isset($_GET['mes'])    ? (int)$_GET['mes']    : 0;
$anio   = isset($_GET['anio'])   ? (int)$_GET['anio']   : 0;
$status = isset($_GET['status']) ? $_GET['status']      : 'all';
$orden  = isset($_GET['orden'])  ? $_GET['orden']       : '_real';
$dir    = isset($_GET['dir'])    ? strtoupper($_GET['dir']) : 'DESC';

if ($mes < 1 || $mes > 12 || $anio < 2020 || $anio > 2100) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Mes o año inválido']);
    exit;
}

// Validar columna de orden (whitelist)
$ordenesPermitidos = ['_real', 'apagar', 'puntos', 'calificados', 'niveles', 'id_inver'];
if (!in_array($orden, $ordenesPermitidos, true)) {
    $orden = '_real';
}
$dir = ($dir === 'ASC') ? 'ASC' : 'DESC';

// Rango del mes
$mesInicio = sprintf('%04d-%02d-01', $anio, $mes);
$mesFin    = date('Y-m-t', strtotime($mesInicio));

// ── Construir WHERE de status ───────────────────────────────────────────────
$statusValidos = [0, 1, 5, 20];
$whereStatus   = '';
$paramsStatus  = [];

if ($status !== 'all' && $status !== '') {
    $statusInt = (int)$status;
    if (in_array($statusInt, $statusValidos, true)) {
        $whereStatus  = ' AND r.status = ?';
        $paramsStatus = [$statusInt];
    }
}

// ── Query principal ─────────────────────────────────────────────────────────
$sql = "
    SELECT
        r.idreg,
        r.id_inver,
        i.referencia,
        i.rfc,
        TRIM(CONCAT(COALESCE(i.nombre,''), ' ', COALESCE(i.appat,''), ' ', COALESCE(i.apmat,''))) AS nombre_completo,
        r.puntos,
        r.calificados,
        r.niveles,
        r.primera,
        r.segunda,
        r.tercera,
        r.cuarta,
        r.total,
        r._real,
        r.apagar,
        r.impuestos,
        r.pagado,
        r.fechap,
        r.status,
        r.observaciones
    FROM regs2 r
    INNER JOIN inversionista i ON i.id_inver = r.id_inver
    WHERE r.fechap BETWEEN ? AND ?
      AND r.cd = 0
      $whereStatus
    ORDER BY r.$orden $dir
";

$params = array_merge([$mesInicio, $mesFin], $paramsStatus);
$stmt   = $db->prepare($sql);
$stmt->execute($params);
$rows   = $stmt->fetchAll(PDO::FETCH_ASSOC);

// ── Totales ─────────────────────────────────────────────────────────────────
$totalReal   = 0.0;
$totalApagar = 0.0;
$contadores  = [0 => 0, 1 => 0, 5 => 0, 20 => 0];

foreach ($rows as &$row) {
    $row['_real']      = (float)$row['_real'];
    $row['apagar']     = (float)$row['apagar'];
    $row['impuestos']  = (float)$row['impuestos'];
    $row['pagado']     = (float)$row['pagado'];
    $row['puntos']     = (int)$row['puntos'];
    $row['calificados']= (int)$row['calificados'];
    $row['niveles']    = (int)$row['niveles'];
    $row['status']     = (int)$row['status'];
    $totalReal         += $row['_real'];
    $totalApagar       += $row['apagar'];
    $s = $row['status'];
    if (isset($contadores[$s])) $contadores[$s]++;
}
unset($row);

$MESES_ES = [
    1=>'Enero',2=>'Febrero',3=>'Marzo',4=>'Abril',5=>'Mayo',6=>'Junio',
    7=>'Julio',8=>'Agosto',9=>'Septiembre',10=>'Octubre',11=>'Noviembre',12=>'Diciembre'
];

echo json_encode([
    'success'      => true,
    'periodo'      => ($MESES_ES[$mes] ?? $mes) . ' ' . $anio,
    'mes'          => $mes,
    'anio'         => $anio,
    'total_regs'   => count($rows),
    'total_real'   => round($totalReal, 2),
    'total_apagar' => round($totalApagar, 2),
    'contadores'   => $contadores,
    'registros'    => $rows,
], JSON_UNESCAPED_UNICODE);
