<?php
declare(strict_types=1);

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

$u = require_login();
require_module_access($u, "dashboard");

function table_exists(PDO $pdo, string $table): bool {
  $st = $pdo->prepare("
    SELECT COUNT(*)
    FROM information_schema.tables
    WHERE table_schema = DATABASE() AND table_name = :t
  ");
  $st->execute([':t' => $table]);
  return (int)$st->fetchColumn() > 0;
}

function column_exists(PDO $pdo, string $table, string $col): bool {
  $st = $pdo->prepare("
    SELECT COUNT(*)
    FROM information_schema.columns
    WHERE table_schema = DATABASE() AND table_name = :t AND column_name = :c
  ");
  $st->execute([':t' => $table, ':c' => $col]);
  return (int)$st->fetchColumn() > 0;
}

function count_today(PDO $pdo, string $table): int {
  // ✅ Preferimos ultima_actualizacion (trabajo de hoy), si no existe usamos creado_en
  $col = column_exists($pdo, $table, 'ultima_actualizacion') ? 'ultima_actualizacion'
       : (column_exists($pdo, $table, 'creado_en') ? 'creado_en' : null);

  if (!$col) return 0;

  // Nota: CURDATE() depende del timezone del servidor
  $sql = "SELECT COUNT(*) FROM `$table` WHERE DATE(`$col`) = CURDATE()";
  return (int)$pdo->query($sql)->fetchColumn();
}

function count_all(PDO $pdo, string $table): int {
  return (int)$pdo->query("SELECT COUNT(*) FROM `$table`")->fetchColumn();
}

try {
  if (!isset($pdo) || !($pdo instanceof PDO)) {
    throw new RuntimeException("No se detectó PDO en conexion.php");
  }

  $hasUsuarios  = table_exists($pdo, 'usuarios');
  $hasFamilias  = table_exists($pdo, 'familias');
  $hasVivienda  = table_exists($pdo, 'vivienda');
  $hasVF        = table_exists($pdo, 'vivienda_familias');
  $hasCondViv   = table_exists($pdo, 'condiciones_vivienda');

  // Registros hoy = modificaciones de hoy (usuarios + familias + vivienda)
  $registrosHoy =
    ($hasUsuarios ? count_today($pdo, 'usuarios') : 0) +
    ($hasFamilias ? count_today($pdo, 'familias') : 0) +
    ($hasVivienda ? count_today($pdo, 'vivienda') : 0);

  // No inscritos (usuarios.inscrito_cesfam = 0 o NULL)
  $noInscritos = 0;
  if ($hasUsuarios && column_exists($pdo, 'usuarios', 'inscrito_cesfam')) {
    $noInscritos = (int)$pdo->query("
      SELECT COUNT(*)
      FROM usuarios
      WHERE inscrito_cesfam IS NULL OR inscrito_cesfam = 0
    ")->fetchColumn();
  }

  // Viviendas visitadas:
  // criterio: coords OR condiciones_vivienda OR familia asociada (puente o codigo_familia)
  $viviendasVisitadas = 0;
  $totalViviendas = $hasVivienda ? count_all($pdo, 'vivienda') : 0;

  if ($hasVivienda && $totalViviendas > 0) {
    $hasLat = column_exists($pdo, 'vivienda', 'latitud');
    $hasLng = column_exists($pdo, 'vivienda', 'longitud');
    $hasCodFam = column_exists($pdo, 'vivienda', 'codigo_familia');

    $checks = [];

    if ($hasLat && $hasLng) {
      $checks[] = "(v.latitud IS NOT NULL AND v.latitud <> '' AND v.longitud IS NOT NULL AND v.longitud <> '')";
    }
    if ($hasCondViv) {
      $checks[] = "cv.id_vivienda IS NOT NULL";
    }
    if ($hasVF) {
      $checks[] = "vf.id_vivienda IS NOT NULL";
    } else if ($hasCodFam) {
      $checks[] = "(v.codigo_familia IS NOT NULL AND v.codigo_familia <> '')";
    }

    if ($checks) {
      $sql = "
        SELECT COUNT(DISTINCT v.id)
        FROM vivienda v
        " . ($hasCondViv ? "LEFT JOIN condiciones_vivienda cv ON cv.id_vivienda = v.id" : "") . "
        " . ($hasVF ? "LEFT JOIN vivienda_familias vf ON vf.id_vivienda = v.id" : "") . "
        WHERE " . implode(" OR ", $checks) . "
      ";
      $viviendasVisitadas = (int)$pdo->query($sql)->fetchColumn();
    }
  }

  // Pendientes = total - visitadas
  $pendientes = max(0, $totalViviendas - $viviendasVisitadas);

  // Actividades recientes: administrador y monitor ven todo; digitadores solo lo propio.
  fp_ensure_actividad_reciente_table($pdo);
  $rolActual = normalize_role((string)($u['rol'] ?? $u['rol_funcionario'] ?? 'digitador'));
  $rutActual = normalize_rut((string)($u['rut'] ?? $u['rut_funcionario'] ?? ''));
  $actividades = [];
  if (in_array($rolActual, ['administrador', 'monitor'], true)) {
    $stAct = $pdo->prepare("
      SELECT id, funcionario_rut, funcionario_nombre, rol_funcionario, modulo, accion, descripcion, entidad_tipo, entidad_id, fecha_registro
      FROM actividad_reciente
      ORDER BY fecha_registro DESC, id DESC
      LIMIT 20
    ");
    $stAct->execute();
  } else {
    $stAct = $pdo->prepare("
      SELECT id, funcionario_rut, funcionario_nombre, rol_funcionario, modulo, accion, descripcion, entidad_tipo, entidad_id, fecha_registro
      FROM actividad_reciente
      WHERE funcionario_rut = :rut
      ORDER BY fecha_registro DESC, id DESC
      LIMIT 20
    ");
    $stAct->execute([':rut' => $rutActual]);
  }
  $actividades = $stAct->fetchAll(PDO::FETCH_ASSOC) ?: [];

  json_response([
    'ok' => true,
    'kpis' => [
      'registros_hoy'       => $registrosHoy,
      'no_inscritos'        => $noInscritos,
      'viviendas_visitadas' => $viviendasVisitadas,
      'pendientes'          => $pendientes,
    ],
    'actividades_alcance' => in_array($rolActual, ['administrador', 'monitor'], true) ? 'todas' : 'propias',
    'actividades' => $actividades,
    'generated_at' => date('c'),
  ]);

} catch (Throwable $e) {
  error_log("DASHBOARD summary ERROR: " . $e->getMessage());
  json_response(['ok' => false, 'message' => 'Error dashboard: ' . $e->getMessage()], 500);
}
