<?php
/**
 * Controlador para crear/editar Proyectos Administrativos
 *
 * Rutas:
 *   - es:bez:admin_thread_form (crear nuevo)
 *   - es:bez:admin_thread_form:action:edit:id:X (editar)
 *
 * @author NICC
 * @date 2026-01-31
 * @updated 2026-02-01
 */

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

use dokuwiki\plugin\bez\mdl\AdminThreadFactory;

// ── Permisos específicos para TAREAS ADMINISTRATIVAS ──
// DIOS: manager, admin (grupo DW)
// SIN permisos: director (no puede crear/editar)
// LEADER: puede crear, y editar si es creador/coordinador
$_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);

// Director NO tiene permisos en admin_thread
if ($_isDirector && !$_isAdminThreadGod) {
    throw new \dokuwiki\plugin\bez\meta\PermissionDeniedException();
}
// Requiere al menos LEADER (o ser DIOS)
if (!$_isAdminThreadGod && $this->model->get_level() < BEZ_AUTH_LEADER) {
    throw new \dokuwiki\plugin\bez\meta\PermissionDeniedException();
}

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

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

// Procesar POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    $tipoTrabajador = isset($_POST['tipo_trabajador']) ? trim($_POST['tipo_trabajador']) : 'usuario';
    $trabajadorNombre = isset($_POST['trabajador_nombre']) ? trim($_POST['trabajador_nombre']) : '';
    $fechaInicio = isset($_POST['fecha_inicio']) ? trim($_POST['fecha_inicio']) : null;
    $observaciones = isset($_POST['observaciones']) ? trim($_POST['observaciones']) : null;
    $paginaRegistros = isset($_POST['pagina_registros']) ? trim($_POST['pagina_registros']) : '';
    $periodo = isset($_POST['periodo']) ? trim($_POST['periodo']) : null;
    $privado = isset($_POST['privado']) ? 1 : 0;
    $rutaManualCalidad = isset($_POST['ruta_manual_calidad']) ? trim($_POST['ruta_manual_calidad']) : null;
    $rutaCodigoEtica = isset($_POST['ruta_codigo_etica']) ? trim($_POST['ruta_codigo_etica']) : null;
    // Convertir cadenas vacías a null para usar defaults
    if ($rutaManualCalidad === '') $rutaManualCalidad = null;
    if ($rutaCodigoEtica === '') $rutaCodigoEtica = null;

    // Determinar trabajador_id según el tipo
    if ($tipoTrabajador === 'firma') {
        $trabajadorId = 'firma_principal';
        $trabajadorNombre = isset($_POST['nombre_firma']) ? trim($_POST['nombre_firma']) : $trabajadorNombre;
    } else {
        $trabajadorId = isset($_POST['usuario_id']) ? trim($_POST['usuario_id']) : '';
    }

    // Validaciones
    if (empty($trabajadorNombre)) {
        throw new \dokuwiki\plugin\bez\meta\ValidationException('admin_thread', ['trabajador_nombre' => 'El nombre es requerido']);
    }

    if ($tipoTrabajador === 'usuario' && empty($trabajadorId)) {
        throw new \dokuwiki\plugin\bez\meta\ValidationException('admin_thread', ['usuario_id' => 'Debe seleccionar un usuario']);
    }

    if ($action === 'edit' && $id) {
        // Verificar ownership: DIOS (manager/admin DW) o creador/coordinador puede editar
        $proyectoCheck = $factory->get($id);
        if (!$proyectoCheck) {
            throw new \Exception('Proyecto no encontrado');
        }
        $currentUser = $_SERVER['REMOTE_USER'] ?? '';
        $isOwner = ($proyectoCheck['created_by'] === $currentUser)
            || (!empty($proyectoCheck['trabajador_id']) && $proyectoCheck['trabajador_id'] === $currentUser);
        if (!$_isAdminThreadGod && !$isOwner) {
            throw new \dokuwiki\plugin\bez\meta\PermissionDeniedException();
        }

        // Actualizar proyecto existente
        $updateData = [
            'trabajador_id' => $trabajadorId,
            'trabajador_nombre' => $trabajadorNombre,
            'tipo_trabajador' => $tipoTrabajador,
            'pagina_registros' => $paginaRegistros,
            'fecha_inicio' => $fechaInicio,
            'observaciones' => $observaciones,
            'periodo' => $periodo,
            'privado' => $privado
        ];
        // Siempre incluir rutas de documentos en update (null = usar default)
        $updateData['ruta_manual_calidad'] = $rutaManualCalidad;
        $updateData['ruta_codigo_etica'] = $rutaCodigoEtica;
        $factory->update($id, $updateData);

        // Asegurar que existan las páginas de documentos
        $factory->ensureDocumentPages($id);

        // Si es el proyecto preferido, actualizar generalidades
        if ($factory->isPreferido($id)) {
            $factory->actualizarGeneralidades($id);
        }

        header('Location: ' . $this->url('admin_thread', 'id', $id));
        exit;

    } else {
        // Crear nuevo proyecto
        $newId = $factory->crear(
            $trabajadorId,
            $trabajadorNombre,
            $tipoTrabajador,
            $paginaRegistros,
            $fechaInicio,
            $observaciones,
            $periodo,
            $privado,
            $rutaManualCalidad,
            $rutaCodigoEtica
        );

        // Insertar creador como participante del proyecto
        try {
            $sqlite->query("INSERT OR IGNORE INTO admin_thread_participant (admin_thread_id, user_id, role, added_by) VALUES (?, ?, 'creator', ?)",
                [$newId, $_SERVER['REMOTE_USER'] ?? '', $_SERVER['REMOTE_USER'] ?? '']);
        } catch (\Exception $e) { /* Tabla puede no existir aún */ }

        // Marcar nuevo proyecto como preferido y actualizar generalidades
        $sqlite->query("DELETE FROM admin_thread_preferencia");
        $sqlite->query("INSERT INTO admin_thread_preferencia (admin_thread_id, marcado_por) VALUES (?, ?)", [$newId, $_SERVER['REMOTE_USER']]);
        $factory->ensureDocumentPages($newId);
        $factory->actualizarGeneralidades($newId);

        header('Location: ' . $this->url('admin_thread', 'id', $newId));
        exit;
    }
}

// Obtener datos para el formulario
$proyecto = null;
$isEdit = false;

if ($action === 'edit' && $id) {
    $proyecto = $factory->get($id);
    if (!$proyecto) {
        throw new \Exception('Proyecto no encontrado');
    }
    // Verificar ownership para mostrar formulario de edición
    $currentUser = $_SERVER['REMOTE_USER'] ?? '';
    $isOwner = ($proyecto['created_by'] === $currentUser)
        || (!empty($proyecto['trabajador_id']) && $proyecto['trabajador_id'] === $currentUser);
    if (!$_isAdminThreadGod && !$isOwner) {
        throw new \dokuwiki\plugin\bez\meta\PermissionDeniedException();
    }
    $isEdit = true;
}

// Obtener páginas de registros ya usadas por otros proyectos
$paginasUsadas = [];
try {
    $resPag = $sqlite->query("SELECT pagina_registros FROM admin_thread WHERE deleted_at IS NULL");
    $arrPag = $sqlite->res2arr($resPag);
    foreach ($arrPag as $row) {
        $paginasUsadas[] = $row['pagina_registros'];
    }
} catch (\Exception $e) {
    // Si falla (tabla no existe aún), continuar con array vacío
}

// Obtener el próximo ID que se asignará (sin incrementar el contador)
// para que el formulario pre-seleccione el destino que coincida con el ID
$nextId = $factory->peekNextId();

// Calcular rutas de documentos para el template
$projectIdForPaths = $isEdit ? $id : $nextId;
$docPaths = [];
$defaultDocPaths = [
    'manual_de_calidad' => $factory->getDefaultDocPath($projectIdForPaths, 'manual_de_calidad'),
    'codigo_de_etica' => $factory->getDefaultDocPath($projectIdForPaths, 'codigo_de_etica')
];

if ($isEdit && $proyecto) {
    // Mostrar solo las rutas explícitamente guardadas en BD (no los defaults)
    $docPaths = [
        'manual_de_calidad' => $proyecto['ruta_manual_calidad'] ?? '',
        'codigo_de_etica' => $proyecto['ruta_codigo_etica'] ?? ''
    ];
}

// Pasar datos al template
// Nota: 'users' se setea automáticamente en Tpl.php desde userFactory->get_all()
$this->tpl->set('proyecto', $proyecto);
$this->tpl->set('isEdit', $isEdit);
$this->tpl->set('id', $id);
$this->tpl->set('paginasUsadas', $paginasUsadas);
$this->tpl->set('nextId', $nextId);
$this->tpl->set('docPaths', $docPaths);
$this->tpl->set('defaultDocPaths', $defaultDocPaths);
