<?php
/**
 * Controlador para listar Proyectos Administrativos
 *
 * Ruta: es:bez:admin_threads
 *
 * @author NICC
 * @date 2026-01-31
 */

/** @var \dokuwiki\plugin\bez\meta\action $this */

use dokuwiki\plugin\bez\mdl\AdminThreadFactory;

// Verificar permisos
if ($this->model->get_level() < BEZ_AUTH_USER) {
    throw new \dokuwiki\plugin\bez\meta\PermissionDeniedException();
}

// ── Permisos específicos para TAREAS ADMINISTRATIVAS ──
// DIOS: manager, admin (grupo DW)
// Director: NO tiene permisos (puede ver listado pero NO crear)
$_userGrps = $GLOBALS['USERINFO']['grps'] ?? [];
$_isAdminThreadGod = in_array('manager', $_userGrps) || in_array('admin', $_userGrps)
    || (class_exists('action_plugin_managerprotect') && action_plugin_managerprotect::shouldHaveManagerGroup($_SERVER['REMOTE_USER'] ?? ''));
$_isDirector = in_array('director', $_userGrps);

// Liberar sesión PHP para evitar bloqueo durante queries pesadas (previene error 520)
if (session_status() === PHP_SESSION_ACTIVE) {
    session_write_close();
}

// Inicializar DB + Factory (consolidado en helper)
list($sqlite, $factory) = helper_plugin_bez_db::initAdmin('AdminThreadFactory', false, true);

// Procesar filtros (soportar URL BEZ :key:value y POST del formulario)
$filters = [];

$stateFilter = $this->get_param('state');
$isPostSubmit = ($_SERVER['REQUEST_METHOD'] === 'POST');

if (empty($stateFilter) && $isPostSubmit && isset($_POST['state'])) {
    $stateFilter = trim($_POST['state']);
}

// Si no hay envío de formulario ni parámetro URL, predeterminar "opened"
if (!$isPostSubmit && empty($stateFilter)) {
    $stateFilter = 'opened';
}

if (!empty($stateFilter)) {
    $filters['state'] = $stateFilter;
}

$trabajadorFilter = $this->get_param('trabajador');
if (empty($trabajadorFilter) && !empty($_POST['trabajador'])) {
    $trabajadorFilter = trim($_POST['trabajador']);
}
if (!empty($trabajadorFilter)) {
    $filters['trabajador_id'] = $trabajadorFilter;
}

$anioFilter = $this->get_param('anio');
if (empty($anioFilter) && !empty($_POST['anio'])) {
    $anioFilter = trim($_POST['anio']);
}
if (!empty($anioFilter)) {
    $filters['anio'] = $anioFilter;
}

// Obtener proyectos
$proyectos = $factory->getAll($filters);

// Obtener lista de trabajadores distintos desde la base de datos
$resTrab = $sqlite->query("SELECT DISTINCT trabajador_id, trabajador_nombre FROM admin_thread WHERE deleted_at IS NULL ORDER BY trabajador_nombre");
$trabajadores = $sqlite->res2arr($resTrab);

// Obtener años disponibles desde fecha_inicio
$resAnios = $sqlite->query("SELECT DISTINCT strftime('%Y', fecha_inicio) AS anio FROM admin_thread WHERE deleted_at IS NULL AND fecha_inicio IS NOT NULL AND fecha_inicio != '' ORDER BY anio DESC");
$anios = $sqlite->res2arr($resAnios);

// Verificar permisos para crear
// DIOS (manager/admin DW): siempre puede crear
// Director: NO puede crear
// LEADER+: puede crear
$puedeCrear = $_isAdminThreadGod
    || (!$_isDirector && $this->model->get_level() >= BEZ_AUTH_LEADER);

// Obtener preferencia actual
$preferenciaActual = null;
try {
    $resP = $sqlite->query("SELECT admin_thread_id FROM admin_thread_preferencia LIMIT 1");
    $arrP = $sqlite->res2arr($resP);
    $preferenciaActual = !empty($arrP) ? intval($arrP[0]['admin_thread_id']) : null;
} catch (\Exception $e) {
    // Tabla puede no existir aún
}

// Permisos para editar/eliminar en el listado (misma lógica que crear)
$puedeOperar = $puedeCrear;

// Pasar datos al template
$this->tpl->set('proyectos', $proyectos);
$this->tpl->set('trabajadores', $trabajadores);
$this->tpl->set('filters', $filters);
$this->tpl->set('puedeCrear', $puedeCrear);
$this->tpl->set('puedeOperar', $puedeOperar);
$this->tpl->set('preferenciaActual', $preferenciaActual);
$this->tpl->set('anios', $anios);
