<?php
/**
 * Controlador para crear/editar Controles Administrativos
 *
 * Rutas:
 *   - es:bez:admin_control_form (crear nuevo)
 *   - es:bez:admin_control_form:action:edit:id:X (editar)
 *   - es:bez:admin_control_form:action:add (guardar nuevo)
 *   - es:bez:admin_control_form:action:update:id:X (actualizar)
 *
 * @author NICC
 * @date 2026-01-31
 */

/** @var action_plugin_bez $this */

use \dokuwiki\plugin\bez;

// Verificar permisos - requiere al menos nivel manager (sysadmin NO puede)
if ($this->model->get_level() < BEZ_AUTH_LEADER || $this->model->get_level() == BEZ_AUTH_SYSADMIN) {
    throw new bez\meta\PermissionDeniedException();
}

// Inicializar DB + Factory (consolidado en helper)
list($sqlite, $adminHelper) = helper_plugin_bez_db::initAdmin('AdminControlHelper');

$action = $this->get_param('action');
$id = $this->get_param('id');

// Manejar acciones POST
if ($action === 'add' && !empty($_POST)) {
    // Crear nuevo aplicador/grupo según el tipo de formulario
    $tipo_form = isset($_POST['tipo_form']) ? $_POST['tipo_form'] : '';

    if ($tipo_form === 'aplicador') {
        // Crear nuevo aplicador
        $tipo = isset($_POST['tipo']) ? trim($_POST['tipo']) : 'trabajador';
        $nombre = isset($_POST['nombre']) ? trim($_POST['nombre']) : '';
        $usuario_id = isset($_POST['usuario_id']) ? trim($_POST['usuario_id']) : null;
        $pagina_discusion = isset($_POST['pagina_discusion']) ? trim($_POST['pagina_discusion']) : null;

        if (empty($nombre)) {
            throw new bez\meta\ValidationException(['nombre' => 'required']);
        }

        $nuevoId = $adminHelper->crearAplicador($tipo, $nombre, $usuario_id, false, $pagina_discusion);

        header('Location: ' . $this->url('admin_controls'));
        exit;

    } elseif ($tipo_form === 'grupo') {
        // Crear nuevo grupo
        $nombre = isset($_POST['nombre']) ? trim($_POST['nombre']) : '';
        $descripcion = isset($_POST['descripcion']) ? trim($_POST['descripcion']) : '';
        $orden = isset($_POST['orden']) ? intval($_POST['orden']) : 0;

        if (empty($nombre)) {
            throw new bez\meta\ValidationException(['nombre' => 'required']);
        }

        $nuevoId = $adminHelper->crearGrupo($nombre, $descripcion, $orden);

        header('Location: ' . $this->url('admin_controls'));
        exit;

    } elseif ($tipo_form === 'item') {
        // Crear nuevo item
        $grupo_id = isset($_POST['grupo_id']) ? intval($_POST['grupo_id']) : 0;
        $nombre = isset($_POST['nombre']) ? trim($_POST['nombre']) : '';
        $ruta_wiki = isset($_POST['ruta_wiki']) ? trim($_POST['ruta_wiki']) : '';
        $orden = isset($_POST['orden']) ? intval($_POST['orden']) : 0;
        $tipo = isset($_POST['tipo']) ? trim($_POST['tipo']) : 'actividad';

        if (empty($nombre) || empty($ruta_wiki) || $grupo_id <= 0) {
            throw new bez\meta\ValidationException(['nombre' => 'required']);
        }

        $nuevoId = $adminHelper->crearItem($grupo_id, $nombre, $ruta_wiki, $orden, $tipo);

        header('Location: ' . $this->url('admin_controls'));
        exit;
    }

} elseif ($action === 'update' && !empty($_POST) && $id) {
    // Actualizar registro existente
    $tipo_form = isset($_POST['tipo_form']) ? $_POST['tipo_form'] : '';

    if ($tipo_form === 'aplicador') {
        $nombre = isset($_POST['nombre']) ? trim($_POST['nombre']) : '';
        $usuario_id = isset($_POST['usuario_id']) ? trim($_POST['usuario_id']) : null;
        $pagina_discusion = isset($_POST['pagina_discusion']) ? trim($_POST['pagina_discusion']) : null;
        $activo = isset($_POST['activo']) ? 1 : 0;

        if (empty($nombre)) {
            throw new bez\meta\ValidationException(['nombre' => 'required']);
        }

        $query = "UPDATE admin_control_aplicadores SET nombre = ?, usuario_id = ?, pagina_discusion = ?, activo = ? WHERE id = ?";
        $sqlite->query($query, [$nombre, $usuario_id, $pagina_discusion, $activo, $id]);

    } elseif ($tipo_form === 'grupo') {
        $nombre = isset($_POST['nombre']) ? trim($_POST['nombre']) : '';
        $descripcion = isset($_POST['descripcion']) ? trim($_POST['descripcion']) : '';
        $orden = isset($_POST['orden']) ? intval($_POST['orden']) : 0;
        $activo = isset($_POST['activo']) ? 1 : 0;

        if (empty($nombre)) {
            throw new bez\meta\ValidationException(['nombre' => 'required']);
        }

        $query = "UPDATE admin_control_groups SET nombre = ?, descripcion = ?, orden = ?, activo = ? WHERE id = ?";
        $sqlite->query($query, [$nombre, $descripcion, $orden, $activo, $id]);

    } elseif ($tipo_form === 'item') {
        $nombre = isset($_POST['nombre']) ? trim($_POST['nombre']) : '';
        $ruta_wiki = isset($_POST['ruta_wiki']) ? trim($_POST['ruta_wiki']) : '';
        $orden = isset($_POST['orden']) ? intval($_POST['orden']) : 0;
        $tipo = isset($_POST['tipo']) ? trim($_POST['tipo']) : 'actividad';
        $activo = isset($_POST['activo']) ? 1 : 0;

        if (empty($nombre)) {
            throw new bez\meta\ValidationException(['nombre' => 'required']);
        }

        $query = "UPDATE admin_control_items SET nombre = ?, ruta_wiki = ?, orden = ?, tipo = ?, activo = ? WHERE id = ?";
        $sqlite->query($query, [$nombre, $ruta_wiki, $orden, $tipo, $activo, $id]);
    }

    header('Location: ' . $this->url('admin_controls'));
    exit;

} elseif ($action === 'delete' && $id) {
    // Eliminar (soft delete)
    $tipo_form = $this->get_param('tipo');

    if ($tipo_form === 'aplicador') {
        $query = "UPDATE admin_control_aplicadores SET activo = 0 WHERE id = ?";
        $sqlite->query($query, [$id]);
    } elseif ($tipo_form === 'grupo') {
        $query = "UPDATE admin_control_groups SET activo = 0 WHERE id = ?";
        $sqlite->query($query, [$id]);
    } elseif ($tipo_form === 'item') {
        $query = "UPDATE admin_control_items SET activo = 0 WHERE id = ?";
        $sqlite->query($query, [$id]);
    }

    header('Location: ' . $this->url('admin_controls'));
    exit;
}

// Cargar datos para el formulario
$tipo_form = $this->get_param('tipo', 'aplicador');

$editData = null;
if ($action === 'edit' && $id) {
    if ($tipo_form === 'aplicador') {
        $res = $sqlite->query("SELECT * FROM admin_control_aplicadores WHERE id = ?", [$id]);
        $arr = $sqlite->res2arr($res);
        $editData = !empty($arr) ? $arr[0] : null;
    } elseif ($tipo_form === 'grupo') {
        $res = $sqlite->query("SELECT * FROM admin_control_groups WHERE id = ?", [$id]);
        $arr = $sqlite->res2arr($res);
        $editData = !empty($arr) ? $arr[0] : null;
    } elseif ($tipo_form === 'item') {
        $res = $sqlite->query("SELECT * FROM admin_control_items WHERE id = ?", [$id]);
        $arr = $sqlite->res2arr($res);
        $editData = !empty($arr) ? $arr[0] : null;
    }
}

// Obtener lista de usuarios para selector
$users = $this->model->userFactory->get_all();

// Obtener grupos para selector de items
$grupos = $adminHelper->getGrupos();

// Pasar datos al template
$this->tpl->set('tipo_form', $tipo_form);
$this->tpl->set('editData', $editData);
$this->tpl->set('users', $users);
$this->tpl->set('grupos', $grupos);
$this->tpl->set('isEdit', $action === 'edit' && $id);
$this->tpl->set('id', $id);
