<?php
// php/geolocalizacion_comunitaria/list.php
declare(strict_types=1);
require_once __DIR__ . '/_bootstrap.php';

$u = gcomm_user();

try {
  gcomm_ensure_tables($pdo);

  $src = strtoupper($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST' ? read_json_body() : $_GET;
  $tipo = gcomm_s($src['tipo'] ?? '');
  $categoria = gcomm_s($src['categoria_id'] ?? '');
  $sectorizacion = gcomm_s($src['sectorizacion'] ?? '');
  $sector = gcomm_s($src['sector'] ?? '');
  $estado = gcomm_s($src['estado'] ?? 'activo');
  $q = gcomm_s($src['q'] ?? '');

  $limit = (int)($src['limit'] ?? 2000);
  if ($limit < 1) $limit = 1;
  if ($limit > 10000) $limit = 10000;

  $where = [];
  $params = [];

  if ($tipo !== '' && in_array($tipo, ['activo','agente'], true)) {
    $where[] = 'p.tipo = :tipo';
    $params[':tipo'] = $tipo;
  }
  if ($categoria !== '' && ctype_digit($categoria)) {
    $where[] = 'p.categoria_id = :categoria_id';
    $params[':categoria_id'] = (int)$categoria;
  }
  if ($sectorizacion !== '' && ctype_digit($sectorizacion)) {
    $where[] = 'p.sectorizacion = :sectorizacion';
    $params[':sectorizacion'] = (int)$sectorizacion;
  }
  if ($sector !== '' && ctype_digit($sector)) {
    $where[] = 'p.sector = :sector';
    $params[':sector'] = (int)$sector;
  }
  if ($estado !== '' && in_array($estado, ['activo','inactivo','borrador','pendiente'], true)) {
    $where[] = 'p.estado = :estado';
    $params[':estado'] = $estado;
  }
  if ($q !== '') {
    $where[] = "(
      p.nombre LIKE :q
      OR COALESCE(p.rut_persona, '') LIKE :q
      OR COALESCE(p.contacto_nombre, '') LIKE :q
      OR COALESCE(p.telefono, '') LIKE :q
      OR COALESCE(p.direccion, '') LIKE :q
      OR COALESCE(p.descripcion, '') LIKE :q
      OR COALESCE(u.nombres, '') LIKE :q
      OR COALESCE(u.apellidos, '') LIKE :q
      OR CONCAT(COALESCE(u.nombres,''), ' ', COALESCE(u.apellidos,'')) LIKE :q
      OR CONCAT(COALESCE(u.apellidos,''), ' ', COALESCE(u.nombres,'')) LIKE :q
    )";
    $params[':q'] = '%' . $q . '%';
  }

  $whereSql = $where ? ('WHERE ' . implode(' AND ', $where)) : '';

  $sql = "SELECT
      p.id, p.tipo, p.categoria_id, p.nombre, p.rut_persona, p.contacto_nombre, p.telefono, p.correo,
      p.direccion, p.sectorizacion, p.sector, p.descripcion, p.observaciones, p.latitud, p.longitud, p.estado,
      p.registrado_por, p.creado_en, p.ultima_actualizacion,
      c.nombre AS categoria_nombre, c.icono AS categoria_icono, c.color AS categoria_color,
      s.nombre_sector, z.nombre_sectorizacion, z.color_sector,
      u.nombres AS persona_nombres, u.apellidos AS persona_apellidos, u.celular AS persona_celular,
      u.telefonos AS persona_telefonos, u.direccion AS persona_direccion, u.latitud AS persona_latitud, u.longitud AS persona_longitud,
      f.nombre AS registrado_nombre, f.apellido_paterno AS registrado_apellido_paterno, f.apellido_materno AS registrado_apellido_materno
    FROM geo_comunitaria_puntos p
    LEFT JOIN geo_comunitaria_categorias c ON c.id = p.categoria_id
    LEFT JOIN usuarios u ON u.rut = p.rut_persona
    LEFT JOIN sectores s ON s.id = p.sector
    LEFT JOIN sectorizacion z ON z.id = p.sectorizacion
    LEFT JOIN funcionario f ON f.rut = p.registrado_por
    $whereSql
    ORDER BY p.ultima_actualizacion DESC, p.id DESC
    LIMIT $limit";

  $st = $pdo->prepare($sql);
  foreach ($params as $k => $v) {
    $st->bindValue($k, $v, is_int($v) ? PDO::PARAM_INT : PDO::PARAM_STR);
  }
  $st->execute();
  $rows = $st->fetchAll(PDO::FETCH_ASSOC);

  $statsSql = "SELECT
      COUNT(*) AS total,
      SUM(CASE WHEN tipo='activo' THEN 1 ELSE 0 END) AS activos,
      SUM(CASE WHEN tipo='agente' THEN 1 ELSE 0 END) AS agentes,
      SUM(CASE WHEN rut_persona IS NOT NULL AND rut_persona <> '' THEN 1 ELSE 0 END) AS vinculados,
      COUNT(DISTINCT sector) AS sectores_con_puntos
    FROM geo_comunitaria_puntos
    WHERE estado = 'activo'";
  $stats = $pdo->query($statsSql)->fetch(PDO::FETCH_ASSOC) ?: [];

  $catStats = $pdo->query("SELECT p.tipo, COALESCE(c.nombre, 'Sin categoría') AS categoria, COALESCE(c.color, '#64748b') AS color, COUNT(*) AS total
    FROM geo_comunitaria_puntos p
    LEFT JOIN geo_comunitaria_categorias c ON c.id = p.categoria_id
    WHERE p.estado = 'activo'
    GROUP BY p.tipo, categoria, color
    ORDER BY total DESC, categoria ASC")->fetchAll(PDO::FETCH_ASSOC);

  json_response([
    'ok' => true,
    'readonly' => is_monitor_user($u),
    'data' => $rows,
    'stats' => $stats,
    'category_stats' => $catStats,
  ]);
} catch (Throwable $e) {
  error_log('GEO COM LIST ERROR: ' . $e->getMessage());
  json_response(['ok' => false, 'message' => 'Error listando geolocalización comunitaria.'], 500);
}
