<?php

use \dokuwiki\plugin\bez;

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


$thread_id = $this->get_param('id');
if ($thread_id != '') {
	/** @var \dokuwiki\plugin\bez\mdl\Thread $thread */
	$thread = $this->model->threadFactory->get_one($thread_id);
} else {
    $thread = $this->model->threadFactory->create_object();
}

$this->tpl->set('thread', $thread);

if ($this->get_param('action') == 'edit') {
    if ($thread_id == '') {
        throw new Exception('there is now row with given id');
    }
    $this->tpl->set_values($thread->get_assoc());
} elseif ($this->get_param('action') == 'update') {

    // Ejecutar update_save PRIMERO
    $this->model->threadFactory->update_save($thread, $_POST);

    // === INICIO: Actualizar columna year si se proporcionó ===
    if (isset($_POST['year'])) {
        $yearValue = trim($_POST['year']);
        if ($yearValue !== 'na' && $yearValue !== '') {
            $this->model->sqlite->query('UPDATE thread SET year = ? WHERE id = ?', $yearValue, $thread->id);
        } else {
            // Si seleccionó N.A., intentar extraer año del título guardado
            $titleSaved = isset($_POST['title']) ? $_POST['title'] : '';
            if (preg_match('/Año:\s*(\d{4})/', $titleSaved, $mYear)) {
                $this->model->sqlite->query('UPDATE thread SET year = ? WHERE id = ?', $mYear[1], $thread->id);
            }
        }
    }
    // === FIN: Actualizar columna year ===

    // === INICIO: Procesar pcliente, NIT y DV DESPUÉS de update_save R**G ===
    $tipoThread = isset($thread->type) ? $thread->type : (isset($_POST['type']) ? $_POST['type'] : '');
    $threadId = $thread->id;
    $pclienteNuevo = isset($_POST['pcliente']) ? trim($_POST['pcliente']) : '';
    $pnitNuevo = isset($_POST['pnit']) ? preg_replace('/[^0-9]/', '', $_POST['pnit']) : '';
    $pcodigoVerificacionNuevo = isset($_POST['pcodigo_verificacion']) ? preg_replace('/[^0-9]/', '', $_POST['pcodigo_verificacion']) : '';

    if (!empty($pclienteNuevo)) {
        $usuarioActual = $_SERVER['REMOTE_USER'];
        $fechaActual = date('Y-m-d H:i:s');

        // Buscar si el cliente ya existe
        $res = $this->model->sqlite->query('SELECT id FROM label WHERE name = ?', $pclienteNuevo);
        $labelIdNuevo = $this->model->sqlite->res2single($res);

        if (!$labelIdNuevo) {
            // Crear nuevo label con NIT y código de verificación
            $this->model->sqlite->query(
                'INSERT INTO label (name, nit, codigo_verificacion, added_by, added_date, count) VALUES (?, ?, ?, ?, ?, 1)',
                $pclienteNuevo, $pnitNuevo, $pcodigoVerificacionNuevo, $usuarioActual, $fechaActual
            );
            $res = $this->model->sqlite->query('SELECT id FROM label WHERE name = ?', $pclienteNuevo);
            $labelIdNuevo = $this->model->sqlite->res2single($res);
        } else {
            // Actualizar NIT y código de verificación del label existente
            $this->model->sqlite->query('UPDATE label SET nit = ?, codigo_verificacion = ? WHERE id = ?', $pnitNuevo, $pcodigoVerificacionNuevo, $labelIdNuevo);
        }

        if ($labelIdNuevo) {
            // Usar REPLACE para simplificar (elimina si existe y luego inserta)
            $this->model->sqlite->query('DELETE FROM thread_label WHERE thread_id = ?', $threadId);
            $this->model->sqlite->query('INSERT INTO thread_label (thread_id, label_id) VALUES (?, ?)', $threadId, $labelIdNuevo);
        }
    }
    // === FIN: Procesar pcliente, NIT y DV ===
    header('Location: ?id='.$this->id('thread', 'id', $thread->id));
    exit;
    
} elseif ($this->get_param('action') == 'add') {

    // Validamos el insert del proyecto y submodulos. R**G
    if (!empty($_POST)){
        
        // === INICIO: Procesar pcliente para proyectos propios (type=project) R**G ===
        $labelIdParaProyecto = null;
        
        if (isset($_POST['type']) && $_POST['type'] == 'project' && !empty($_POST['pcliente'])) {
            $nombreCliente = trim($_POST['pcliente']);
            $nitCliente = isset($_POST['pnit']) ? preg_replace('/[^0-9]/', '', $_POST['pnit']) : '';
            $codigoVerificacion = isset($_POST['pcodigo_verificacion']) ? preg_replace('/[^0-9]/', '', $_POST['pcodigo_verificacion']) : '';

            // Obtener el usuario actual
            $usuarioActual = $_SERVER['REMOTE_USER'];

            // Obtener fecha actual en formato ISO
            $fechaActual = date('Y-m-d H:i:s');

            // Buscar si el cliente ya existe en la tabla label
            $res = $this->model->sqlite->query('SELECT id FROM label WHERE name = ?', $nombreCliente);
            $labelExistente = $this->model->sqlite->res2single($res);

            if ($labelExistente) {
                // Si existe, usar el ID existente y actualizar NIT y código de verificación si se proporcionaron
                $labelIdParaProyecto = $labelExistente;
                if (!empty($nitCliente) || !empty($codigoVerificacion)) {
                    $this->model->sqlite->query('UPDATE label SET nit = ?, codigo_verificacion = ? WHERE id = ?', $nitCliente, $codigoVerificacion, $labelExistente);
                }
            } else {
                // Si no existe, crear nuevo label con todos los campos requeridos incluyendo NIT y código de verificación
                $this->model->sqlite->query(
                    'INSERT INTO label (name, nit, codigo_verificacion, added_by, added_date, count) VALUES (?, ?, ?, ?, ?, 0)',
                    $nombreCliente,
                    $nitCliente,
                    $codigoVerificacion,
                    $usuarioActual,
                    $fechaActual
                );

                // Obtener el ID del nuevo label creado
                $res = $this->model->sqlite->query('SELECT id FROM label WHERE name = ?', $nombreCliente);
                $labelIdParaProyecto = $this->model->sqlite->res2single($res);
            }
        }
        // === FIN: Procesar pcliente para proyectos propios ===
        
        // Guardamos el thread primero para obtener el ID real de la base de datos
        $this->model->threadFactory->initial_save($thread, $_POST);

        // Obtenemos el ID real asignado por la BD (evita duplicados por concurrencia)
        $codigoReal = $thread->id;
        $codigoFormulario = $_POST['codigoProyecto'];
        
        // === INICIO: Insertar en thread_label si es proyecto propio R**G ===
        if ($labelIdParaProyecto !== null) {
            // Primero verificar si ya existe la relación
            $res = $this->model->sqlite->query(
                'SELECT COUNT(*) FROM thread_label WHERE thread_id = ? AND label_id = ?',
                $codigoReal,
                $labelIdParaProyecto
            );
            $existe = $this->model->sqlite->res2single($res);
            
            if (!$existe) {
                // Insertar la relación en thread_label
                $this->model->sqlite->query(
                    'INSERT INTO thread_label (thread_id, label_id) VALUES (?, ?)',
                    $codigoReal,
                    $labelIdParaProyecto
                );
            }
            
            // Actualizar el contador en label
            $this->model->sqlite->query(
                'UPDATE label SET count = count + 1 WHERE id = ?',
                $labelIdParaProyecto
            );
        }
        // === FIN: Insertar en thread_label ===

        // Si el código del formulario es diferente al ID real, recalculamos el contenido
        $contenidoFinal = $_POST['content'];
        if ($codigoFormulario != $codigoReal) {
            // Reemplazamos todas las ocurrencias del código viejo por el código real
            $contenidoFinal = str_replace(
                ':' . $codigoFormulario . ':',
                ':' . $codigoReal . ':',
                $_POST['content']
            );
            // Actualizamos solo el campo content directamente en la BD (evita problemas de validación)
            $this->model->sqlite->query(
                'UPDATE thread SET content = ? WHERE id = ?',
                $contenidoFinal, $codigoReal
            );
        }

        // Extraemos los submodulos usando el código real
        $dataModulos = extraerSubmodulos($contenidoFinal, $codigoReal, $_POST['tipo']);
        if(!empty($dataModulos)){
            $this->model->threadFactory->progreso_proyecto($codigoReal, $dataModulos);
        }

        header('Location: ?id='.$this->id('thread', 'id', $thread->id));
        exit;
    }
    // Fin ajuste.

}

/**
 * Funcion encargada de recibir la action consul R**G
 */
if ($this->get_param('action') == 'consul') {

    $datos = $this->model->threadFactory->consul_id();

    $type = $_POST['type'];

    header('Location: ?id=es:bez:thread_report:type:'.$type.'&cal='.$datos);
    exit;
}

/**
 * Funcion encargada de extraer los submodulos del proyecto. R**G
 */
function extraerSubmodulos($texto, $codigo, $tipo) {

    $patron = '/\[\[\{\}(proyectos:[^\]]*:' . preg_quote($codigo, '/') . ':[^\]]*)\|([^\]]+)\]\]/';
    $submodulos = array();
    $tipoProyectoRevisoria = false;
    $tipoProyectoIndex = 0;

    # Validamos el proceso de ejecucion.
    $procesos_ejecucion = [
        [
            "tipo" => "Revisoría fiscal",
            "identificador" => "8."
        ],
        [
            "tipo" => "Outsourcing Contable",
            "identificador" => "4."
        ],
        [
            "tipo" => "Asesoría Contable",
            "identificador" => "4."
        ]
    ];

    # Validamos si el proyecto es recurrente.
    foreach ($procesos_ejecucion as $index => $proceso) {
        if (stripos($tipo, $proceso['tipo']) !== false ){
            $tipoProyectoRevisoria = true;
            $tipoProyectoIndex = $index;
        }
    }
    
    preg_match_all($patron, $texto, $dataSubmodulo, PREG_SET_ORDER);

    # Asignamos los valores correspondientes.
    foreach ($dataSubmodulo as $index => $submodulo) {
        $submodulos[$index]['ruta'] = trim($submodulo[1]);
        $submodulos[$index]['nombre'] = trim($submodulo[2]);
        $submodulos[$index]['procesos_ejecucion'] = 0;

        if ((stripos($submodulo[2], $procesos_ejecucion[$tipoProyectoIndex]['identificador']) !== false) && $tipoProyectoRevisoria) {
            $submodulos[$index]['procesos_ejecucion'] = 1;
        }
    }
    
    return $submodulos;
}

$this->tpl->set('labels', $this->model->labelFactory->get_all());
