<?php
// php/geolocalizacion_comunitaria/_bootstrap.php
declare(strict_types=1);

require_once __DIR__ . '/../conexion.php';
require_once __DIR__ . '/../_helpers.php';
require_once __DIR__ . '/../auth/guard.php';

function gcomm_user(): array {
  $u = require_login();
  require_module_access($u, 'geolocalizacion-comunitaria');
  return $u;
}

function gcomm_require_write(array $u): void {
  require_module_write($u, 'geolocalizacion-comunitaria');
}

function gcomm_s($v): string {
  return trim((string)($v ?? ''));
}

function gcomm_null($v): ?string {
  $s = trim((string)($v ?? ''));
  return $s === '' ? null : $s;
}

function gcomm_int_or_null($v): ?int {
  if ($v === null || $v === '') return null;
  if (!is_numeric($v)) return null;
  $i = (int)$v;
  return $i > 0 ? $i : null;
}

function gcomm_float_or_null($v): ?float {
  if ($v === null || $v === '') return null;
  if (!is_numeric($v)) return null;
  return (float)$v;
}

function gcomm_bool($v, bool $default = false): bool {
  if ($v === null || $v === '') return $default;
  if (is_bool($v)) return $v;
  $s = mb_strtolower(trim((string)$v), 'UTF-8');
  if (in_array($s, ['1','true','si','sí','yes','y','on'], true)) return true;
  if (in_array($s, ['0','false','no','n','off'], true)) return false;
  return is_numeric($v) ? ((int)$v === 1) : $default;
}

function gcomm_type(string $value): string {
  $v = mb_strtolower(trim($value), 'UTF-8');
  if (in_array($v, ['agente', 'persona', 'agente-comunitario'], true)) return 'agente';
  return 'activo';
}

function gcomm_estado(string $value): string {
  $v = mb_strtolower(trim($value), 'UTF-8');
  return in_array($v, ['inactivo','borrador','pendiente'], true) ? $v : 'activo';
}

function gcomm_validate_lat_lng(?float $lat, ?float $lng): void {
  if ($lat === null || $lng === null) {
    json_response(['ok' => false, 'message' => 'Debes marcar una ubicación en el mapa.'], 400);
  }
  if ($lat < -90 || $lat > 90 || $lng < -180 || $lng > 180) {
    json_response(['ok' => false, 'message' => 'Coordenadas fuera de rango.'], 400);
  }
}

function gcomm_current_rut(array $u): ?string {
  $rut = normalize_rut((string)($u['rut'] ?? $u['rut_funcionario'] ?? ''));
  return $rut !== '' ? $rut : null;
}

function gcomm_ensure_tables(PDO $pdo): void {
  static $done = false;
  if ($done) return;
  $done = true;

  $pdo->exec("CREATE TABLE IF NOT EXISTS `geo_comunitaria_categorias` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `tipo` ENUM('activo','agente') NOT NULL DEFAULT 'activo',
    `nombre` VARCHAR(120) NOT NULL,
    `icono` VARCHAR(80) NOT NULL DEFAULT 'bi-geo-alt-fill',
    `color` VARCHAR(30) NOT NULL DEFAULT '#2563eb',
    `descripcion` TEXT DEFAULT NULL,
    `orden` INT(11) NOT NULL DEFAULT 0,
    `activo` TINYINT(1) NOT NULL DEFAULT 1,
    `creado_en` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `ultima_actualizacion` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uq_geo_com_cat_tipo_nombre` (`tipo`, `nombre`),
    KEY `idx_geo_com_cat_tipo` (`tipo`),
    KEY `idx_geo_com_cat_activo` (`activo`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci");

  $pdo->exec("CREATE TABLE IF NOT EXISTS `geo_comunitaria_puntos` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `tipo` ENUM('activo','agente') NOT NULL DEFAULT 'activo',
    `categoria_id` BIGINT(20) UNSIGNED DEFAULT NULL,
    `nombre` VARCHAR(180) NOT NULL,
    `rut_persona` VARCHAR(15) DEFAULT NULL,
    `contacto_nombre` VARCHAR(180) DEFAULT NULL,
    `telefono` VARCHAR(60) DEFAULT NULL,
    `correo` VARCHAR(140) DEFAULT NULL,
    `direccion` TEXT DEFAULT NULL,
    `sectorizacion` BIGINT(20) UNSIGNED DEFAULT NULL,
    `sector` BIGINT(20) UNSIGNED DEFAULT NULL,
    `descripcion` TEXT DEFAULT NULL,
    `observaciones` TEXT DEFAULT NULL,
    `latitud` DOUBLE NOT NULL,
    `longitud` DOUBLE NOT NULL,
    `estado` ENUM('activo','inactivo','borrador','pendiente') NOT NULL DEFAULT 'activo',
    `registrado_por` VARCHAR(15) DEFAULT NULL,
    `creado_en` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `ultima_actualizacion` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_geo_com_p_tipo` (`tipo`),
    KEY `idx_geo_com_p_categoria` (`categoria_id`),
    KEY `idx_geo_com_p_rut` (`rut_persona`),
    KEY `idx_geo_com_p_sector` (`sector`),
    KEY `idx_geo_com_p_sectorizacion` (`sectorizacion`),
    KEY `idx_geo_com_p_estado` (`estado`),
    KEY `idx_geo_com_p_coords` (`latitud`, `longitud`),
    KEY `idx_geo_com_p_registrado_por` (`registrado_por`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci");

  $defaults = [
    ['activo','Junta de vecinos','bi-people-fill','#2563eb','Organización territorial comunitaria',10],
    ['activo','Almacén / comercio local','bi-shop','#f59e0b','Comercio local útil para la vida cotidiana',20],
    ['activo','Colegio / escuela','bi-mortarboard-fill','#7c3aed','Establecimiento educacional',30],
    ['activo','Establecimiento de salud','bi-hospital-fill','#dc2626','CESFAM, posta, estación médica u otro punto sanitario',40],
    ['activo','Sede comunitaria','bi-house-heart-fill','#059669','Infraestructura social o comunitaria',50],
    ['activo','Club deportivo','bi-trophy-fill','#16a34a','Organización o espacio deportivo',60],
    ['activo','Iglesia / espiritualidad','bi-stars','#9333ea','Espacio religioso o espiritual',70],
    ['activo','Espacio público','bi-tree-fill','#0f766e','Plaza, cancha, punto de encuentro o área verde',80],
    ['activo','Otro activo comunitario','bi-pin-map-fill','#64748b','Otro recurso reconocido por la comunidad',999],
    ['agente','Dirigente comunitario','bi-person-badge-fill','#2563eb','Persona reconocida como líder comunitario',10],
    ['agente','Apoyo espiritual / reza','bi-stars','#9333ea','Persona que acompaña, reza o apoya espiritualmente',20],
    ['agente','Oficio / reparación','bi-tools','#ea580c','Persona con oficio útil para la comunidad',30],
    ['agente','Cuidador/a comunitario/a','bi-heart-pulse-fill','#dc2626','Persona que apoya cuidados comunitarios o familiares',40],
    ['agente','Monitor/a social','bi-person-hearts','#0f766e','Persona que vincula, acompaña o informa a vecinos',50],
    ['agente','Otro agente comunitario','bi-person-fill-add','#64748b','Otro agente reconocido por la comunidad',999],
  ];

  $st = $pdo->prepare("INSERT IGNORE INTO geo_comunitaria_categorias
    (`tipo`, `nombre`, `icono`, `color`, `descripcion`, `orden`, `activo`)
    VALUES (:tipo, :nombre, :icono, :color, :descripcion, :orden, 1)");
  foreach ($defaults as $d) {
    $st->execute([
      ':tipo' => $d[0],
      ':nombre' => $d[1],
      ':icono' => $d[2],
      ':color' => $d[3],
      ':descripcion' => $d[4],
      ':orden' => $d[5],
    ]);
  }
}

function gcomm_person_display(array $row): string {
  $n = trim((string)($row['nombres'] ?? ''));
  $a = trim((string)($row['apellidos'] ?? ''));
  $name = trim($n . ' ' . $a);
  if ($name === '') $name = trim($a . ' ' . $n);
  return $name !== '' ? $name : 'Persona sin nombre';
}
