<?php
require_once dirname(__FILE__) . '/../config.php';

if ($_SERVER['REQUEST_METHOD'] !== 'GET') { jsonErr(405, 'Metodo no permitido.'); }
$jwt   = auth();
$idinv = (int)$jwt['idinv'];
$db    = getDB();

// Parametros:
//   padre   = id_inver del nodo a expandir (default: propio distribuidor)
//   buscar  = texto para buscar por nombre o referencia
$padre  = isset($_GET['padre'])  ? (int)$_GET['padre']  : $idinv;
$buscar = isset($_GET['buscar']) ? trim($_GET['buscar']) : '';

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

// ── Calcular nivel del nodo padre respecto al usuario logueado ────────────────
// Nivel 1 = directos del usuario, Nivel 2 = hijos de directos, etc.
function calcularNivel($db, $idinv, $padre) {
    if ($padre === $idinv) return 1;
    $nivel   = 0;
    $actual  = $padre;
    $maxIter = 20;
    while ($actual && $nivel < $maxIter) {
        $nivel++;
        $stmt = $db->prepare('SELECT idprom FROM inversionista WHERE id_inver = ? LIMIT 1');
        $stmt->execute(array($actual));
        $idprom = $stmt->fetchColumn();
        if ((int)$idprom === $idinv) return $nivel + 1;
        $actual = $idprom ? (int)$idprom : null;
    }
    return $nivel + 1;
}

$nivelBase = calcularNivel($db, $idinv, $padre);

// ── Busqueda global ───────────────────────────────────────────────────────────
if ($buscar !== '') {
    $like = '%' . $buscar . '%';
    $stmt = $db->prepare(
        'SELECT i.id_inver AS idinv, i.nombre, i.appat, i.apmat,
                i.referencia, i.estatus_idestatus AS estatus,
                i.idprom,
                COALESCE(SUM(d.puntos), 0) AS puntos_mes
         FROM inversionista i
         LEFT JOIN transacciones t ON t.inversionista_id_inver = i.id_inver
                                   AND t.tipostr_idtipostr IN (10, 12)
                                   AND t.fechat BETWEEN ? AND ?
         LEFT JOIN depositos d     ON d.transacciones_idtransacciones = t.idtransacciones
         WHERE (CONCAT(i.nombre, \' \', i.appat, \' \', i.apmat) LIKE ?
                OR i.referencia LIKE ?)
         GROUP BY i.id_inver
         ORDER BY i.appat, i.nombre
         LIMIT 50'
    );
    $stmt->execute(array($mesInicio, $mesFin, $like, $like));
    $red = $stmt->fetchAll();

    foreach ($red as &$dist) {
        $pts = (float)$dist['puntos_mes'];
        if ($pts >= 1500)    $dist['calificacion'] = 'full';
        elseif ($pts >= 624) $dist['calificacion'] = 'basica';
        else                 $dist['calificacion'] = 'ninguna';
        $dist['tiene_hijos'] = false;
        $dist['nivel']       = 0; // desconocido en busqueda
    }
    unset($dist);

    jsonOk(array(
        'red'       => $red,
        'total_red' => count($red),
        'padre'     => $padre,
        'modo'      => 'busqueda',
    ));
}

// ── Cargar hijos directos del nodo padre ─────────────────────────────────────
$stmt = $db->prepare(
    'SELECT i.id_inver AS idinv, i.nombre, i.appat, i.apmat,
            i.referencia, i.estatus_idestatus AS estatus,
            i.idprom,
            COALESCE(SUM(d.puntos), 0) AS puntos_mes
     FROM inversionista i
     LEFT JOIN transacciones t ON t.inversionista_id_inver = i.id_inver
                               AND t.tipostr_idtipostr IN (10, 12)
                               AND t.fechat BETWEEN ? AND ?
     LEFT JOIN depositos d     ON d.transacciones_idtransacciones = t.idtransacciones
     WHERE i.idprom = ?
     GROUP BY i.id_inver
     ORDER BY i.appat, i.nombre'
);
$stmt->execute(array($mesInicio, $mesFin, $padre));
$red = $stmt->fetchAll();

// Marcar calificacion, nivel y si tiene hijos
foreach ($red as &$dist) {
    $pts = (float)$dist['puntos_mes'];
    if ($pts >= 1500)    $dist['calificacion'] = 'full';
    elseif ($pts >= 624) $dist['calificacion'] = 'basica';
    else                 $dist['calificacion'] = 'ninguna';

    $dist['nivel'] = $nivelBase;

    // Verificar si tiene hijos (consulta ligera con LIMIT 1)
    $stmtH = $db->prepare('SELECT COUNT(*) FROM inversionista WHERE idprom = ? LIMIT 1');
    $stmtH->execute(array($dist['idinv']));
    $dist['tiene_hijos'] = (int)$stmtH->fetchColumn() > 0;
}
unset($dist);

// Total de directos del usuario logueado
$stmtTotal = $db->prepare('SELECT COUNT(*) FROM inversionista WHERE idprom = ?');
$stmtTotal->execute(array($idinv));
$totalDirectos = (int)$stmtTotal->fetchColumn();

jsonOk(array(
    'red'       => $red,
    'total_red' => $totalDirectos,
    'padre'     => $padre,
    'modo'      => 'arbol',
));
