<?php
declare(strict_types=1);
require_once dirname(__FILE__) . '/../config.php';

if ($_SERVER['REQUEST_METHOD'] !== 'GET') { 
    jsonErr(405, 'Metodo no permitido.'); 
}

$jwt   = auth();
$idinv = (int)$jwt['idinv'];
$db    = getDB();

$mesInicio = date('Y-m-01');
$mesFin    = date('Y-m-t');

try {
    // Obtener directos del distribuidor logueado
    $stmtIds = $db->prepare(
        'SELECT id_inver, nombre, appat, apmat, referencia
         FROM inversionista
         WHERE idprom = ?
         ORDER BY nombre ASC'
    );
    $stmtIds->execute([$idinv]);
    $directos = $stmtIds->fetchAll(PDO::FETCH_ASSOC);

    // Modo debug: si se pasa ?debug=1, devuelve info de diagnostico
    $debug = isset($_GET['debug']) && $_GET['debug'] === '1';
    if ($debug) {
        $muestra = array_slice($directos, 0, 5);
        $puntosEjemplo = [];
        if (!empty($muestra)) {
            $muestraIds = [];
            foreach ($muestra as $m) { 
                $muestraIds[] = (int)$m['id_inver']; 
            }
            $placeholders = implode(',', array_fill(0, count($muestraIds), '?'));
            $params = array_merge($muestraIds, [$mesInicio, $mesFin]);
            $stmtPts = $db->prepare(
                "SELECT t.inversionista_id_inver AS id_inver,
                        COALESCE(SUM(d.puntos), 0) AS puntos
                 FROM transacciones t
                 JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
                 WHERE t.inversionista_id_inver IN ($placeholders)
                   AND (t.tipostr_idtipostr = 10 OR t.tipostr_idtipostr = 12)
                   AND t.fechat BETWEEN ? AND ?
                 GROUP BY t.inversionista_id_inver"
            );
            $stmtPts->execute($params);
            $puntosEjemplo = $stmtPts->fetchAll(PDO::FETCH_ASSOC);
        }
        jsonOk([
            'idinv_usado'      => $idinv,
            'total_directos'   => count($directos),
            'mes_inicio'       => $mesInicio,
            'mes_fin'          => $mesFin,
            'muestra_directos' => $muestra,
            'puntos_muestra'   => $puntosEjemplo,
        ]);
        exit;
    }

    if (empty($directos)) {
        jsonOk(['calificados' => [], 'total' => 0, 'periodo' => date('F Y')]);
        exit;
    }

    // Obtener IDs de directos
    $ids = [];
    foreach ($directos as $d) { 
        $ids[] = (int)$d['id_inver']; 
    }

    // Obtener puntos del periodo para todos los directos en una sola consulta
    $placeholders = implode(',', array_fill(0, count($ids), '?'));
    $params = array_merge($ids, [$mesInicio, $mesFin]);

    $stmtPts = $db->prepare(
        "SELECT t.inversionista_id_inver AS id_inver,
                COALESCE(SUM(d.puntos), 0) AS puntos
         FROM transacciones t
         JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
         WHERE t.inversionista_id_inver IN ($placeholders)
           AND (t.tipostr_idtipostr = 10 OR t.tipostr_idtipostr = 12)
           AND t.fechat BETWEEN ? AND ?
         GROUP BY t.inversionista_id_inver"
    );
    $stmtPts->execute($params);
    $puntosMap = [];
    
    // Usar fetchAll() en lugar de while loop para mejor compatibilidad PHP 8.2
    $puntosRows = $stmtPts->fetchAll(PDO::FETCH_ASSOC);
    foreach ($puntosRows as $row) {
        $puntosMap[(int)$row['id_inver']] = (float)$row['puntos'];
    }

    // Construir lista de calificados (>= 624 puntos)
    $calificados = [];
    foreach ($directos as $d) {
        $idKey = (int)$d['id_inver'];
        $pts   = $puntosMap[$idKey] ?? 0.0;
        if ($pts >= 624) {
            $nombre = trim(($d['nombre'] ?? '') . ' ' . ($d['appat'] ?? '') . ' ' . ($d['apmat'] ?? ''));
            $calificados[] = [
                'id_inver'   => $idKey,
                'nombre'     => $nombre,
                'referencia' => $d['referencia'] ?? '',
                'puntos'     => $pts,
                'nivel'      => $pts >= 1500 ? 'Calificado' : 'Parcial',
            ];
        }
    }

    // Ordenar por puntos descendente
    usort($calificados, function($a, $b): int {
        if ($b['puntos'] === $a['puntos']) {
            return 0;
        }
        return ($b['puntos'] > $a['puntos']) ? 1 : -1;
    });

    jsonOk([
        'calificados' => $calificados,
        'total'       => count($calificados),
        'periodo'     => date('F Y'),
    ]);

} catch (Throwable $e) {
    // Capturar cualquier error PHP 8
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Error interno: ' . $e->getMessage(),
        'debug' => [
            'file' => $e->getFile(),
            'line' => $e->getLine(),
        ],
    ], JSON_UNESCAPED_UNICODE);
    exit;
}
