<?php
/**
 * Comment Date Manager - Admin Interface
 * Interfaz de administración para gestión de fechas de comentarios
 */

use dokuwiki\Extension\AdminPlugin;

class admin_plugin_commentdates extends AdminPlugin
{
    /** @var helper_plugin_commentdates */
    protected $helper;

    public function __construct()
    {
        $this->helper = plugin_load('helper', 'commentdates');
    }

    public function getMenuText($language)
    {
        return 'Gestor de Fechas de Comentarios';
    }

    public function getMenuSort()
    {
        return 50;
    }

    public function forAdminOnly()
    {
        return true;
    }

    public function handle()
    {
        // El procesamiento se hace en html()
    }

    public function html()
    {
        global $INPUT;

        echo '<h1>Gestor de Fechas de Comentarios</h1>';

        $this->printStyles();

        $action = $INPUT->str('action');

        // Procesar acciones POST
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && checkSecurityToken()) {
            switch ($action) {
                case 'update_project_comments':
                    $this->handleUpdateProjectComments();
                    break;
                case 'update_bez_date':
                    $this->handleUpdateBezDate();
                    break;
                case 'update_admin_comments':
                    $this->handleUpdateAdminComments();
                    break;
                case 'search_project':
                    $this->handleSearchProject();
                    return;
                case 'search_admin':
                    $this->handleSearchAdmin();
                    return;
            }
        }

        // Mostrar interfaz principal
        $this->showMainInterface();
    }

    /**
     * Muestra la interfaz principal con las 3 secciones
     */
    protected function showMainInterface()
    {
        global $INPUT;

        $projects = $this->helper->getProjects();
        $adminGroups = $this->helper->getAdminGroups();

        ?>
        <!-- Sección 1: Comentarios de Proyecto -->
        <div class="cd-section">
            <h2>1. Modificar Fechas de Comentarios de Proyecto</h2>
            <p class="cd-description">Busca un proyecto por su ID y modifica la fecha de creación de los comentarios en los archivos <code>registro.comments</code>.</p>

            <form method="post" class="cd-form">
                <input type="hidden" name="sectok" value="<?php echo getSecurityToken() ?>">
                <input type="hidden" name="action" value="search_project">

                <div class="cd-form-row">
                    <label>Seleccionar Proyecto:</label>
                    <select name="project_id" class="cd-select" required>
                        <option value="">-- Seleccione un proyecto --</option>
                        <?php foreach ($projects as $p): ?>
                            <option value="<?php echo $p['id'] ?>"
                                <?php echo $INPUT->int('project_id') == $p['id'] ? 'selected' : '' ?>>
                                #<?php echo $p['id'] ?> - <?php echo hsc($p['cliente'] ?: 'Sin cliente') ?> - <?php echo hsc(substr($p['title'], 0, 50)) ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>

                <div class="cd-form-row">
                    <label>Nueva Fecha para Comentarios:</label>
                    <input type="datetime-local" name="new_date_comments" class="cd-input"
                           value="<?php echo date('Y-m-d\TH:i') ?>" required>
                </div>

                <div class="cd-form-actions">
                    <button type="submit" class="button">Buscar Archivos</button>
                </div>
            </form>
        </div>

        <!-- Sección 2: Fecha de Creación en BEZ -->
        <div class="cd-section">
            <h2>2. Modificar Fecha de Creación en Base de Datos BEZ</h2>
            <p class="cd-description">Modifica la fecha de creación del proyecto en la base de datos BEZ (campo <code>create_date</code>).</p>

            <form method="post" class="cd-form">
                <input type="hidden" name="sectok" value="<?php echo getSecurityToken() ?>">
                <input type="hidden" name="action" value="update_bez_date">

                <div class="cd-form-row">
                    <label>Seleccionar Proyecto:</label>
                    <select name="project_id_bez" class="cd-select" required>
                        <option value="">-- Seleccione un proyecto --</option>
                        <?php foreach ($projects as $p): ?>
                            <option value="<?php echo $p['id'] ?>">
                                #<?php echo $p['id'] ?> - <?php echo hsc($p['cliente'] ?: 'Sin cliente') ?>
                                (Creado: <?php echo $p['create_date'] ?>)
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>

                <div class="cd-form-row">
                    <label>Nueva Fecha de Creación:</label>
                    <input type="datetime-local" name="new_date_bez" class="cd-input"
                           value="<?php echo date('Y-m-d\TH:i') ?>" required>
                </div>

                <div class="cd-form-actions">
                    <button type="submit" class="button primary"
                            onclick="return confirm('¿Está seguro de modificar la fecha de creación en la base de datos?')">
                        Actualizar en Base de Datos
                    </button>
                </div>
            </form>
        </div>

        <!-- Sección 3: Componente Administrativo -->
        <div class="cd-section">
            <h2>3. Modificar Fechas de Componente Administrativo</h2>
            <p class="cd-description">Modifica las fechas de creación de comentarios en los grupos administrativos (menu, menu1, menu2, etc.).</p>

            <form method="post" class="cd-form">
                <input type="hidden" name="sectok" value="<?php echo getSecurityToken() ?>">
                <input type="hidden" name="action" value="search_admin">

                <div class="cd-form-row">
                    <label>Seleccionar Grupo:</label>
                    <select name="admin_group" class="cd-select" required>
                        <option value="">-- Seleccione un grupo --</option>
                        <?php foreach ($adminGroups as $g): ?>
                            <option value="<?php echo hsc($g['name']) ?>"
                                <?php echo $INPUT->str('admin_group') == $g['name'] ? 'selected' : '' ?>>
                                <?php echo hsc($g['name']) ?> (<?php echo $g['file_count'] ?> archivos)
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>

                <div class="cd-form-row">
                    <label>Nueva Fecha para Comentarios:</label>
                    <input type="datetime-local" name="new_date_admin" class="cd-input"
                           value="<?php echo date('Y-m-d\TH:i') ?>" required>
                </div>

                <div class="cd-form-actions">
                    <button type="submit" class="button">Buscar Archivos</button>
                </div>
            </form>
        </div>

        <?php
    }

    /**
     * Maneja la búsqueda de archivos de proyecto
     */
    protected function handleSearchProject()
    {
        global $INPUT;

        $projectId = $INPUT->int('project_id');
        $newDate = $INPUT->str('new_date_comments');

        if (!$projectId) {
            msg('Debe seleccionar un proyecto', -1);
            $this->showMainInterface();
            return;
        }

        $project = $this->helper->getProject($projectId);
        $files = $this->helper->findProjectCommentFiles($projectId);
        $timestamp = $this->helper->dateToTimestamp(str_replace('T', ' ', $newDate));

        ?>
        <div class="cd-section cd-results">
            <h2>Archivos Encontrados para Proyecto #<?php echo $projectId ?></h2>

            <div class="cd-project-info">
                <p><strong>Cliente:</strong> <?php echo hsc($project['cliente'] ?: 'Sin cliente') ?></p>
                <p><strong>Título:</strong> <?php echo hsc($project['title']) ?></p>
                <p><strong>Fecha actual BEZ:</strong> <?php echo $project['create_date'] ?></p>
                <p><strong>Nueva fecha para comentarios:</strong> <?php echo str_replace('T', ' ', $newDate) ?>
                   (Timestamp: <?php echo $timestamp ?>)</p>
            </div>

            <?php if (empty($files)): ?>
                <div class="cd-warning">No se encontraron archivos .comments para este proyecto.</div>
            <?php else: ?>
                <form method="post">
                    <input type="hidden" name="sectok" value="<?php echo getSecurityToken() ?>">
                    <input type="hidden" name="action" value="update_project_comments">
                    <input type="hidden" name="project_id" value="<?php echo $projectId ?>">
                    <input type="hidden" name="new_timestamp" value="<?php echo $timestamp ?>">

                    <table class="cd-table">
                        <thead>
                            <tr>
                                <th>Seleccionar</th>
                                <th>Archivo</th>
                                <th>Comentarios</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($files as $i => $file): ?>
                                <tr>
                                    <td><input type="checkbox" name="files[]" value="<?php echo $i ?>" checked></td>
                                    <td><code><?php echo hsc($file['relative']) ?></code></td>
                                    <td><?php echo $file['comment_count'] ?></td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>

                    <input type="hidden" name="files_data" value="<?php echo base64_encode(json_encode($files)) ?>">

                    <div class="cd-form-actions">
                        <button type="submit" class="button primary"
                                onclick="return confirm('¿Aplicar cambios a los archivos seleccionados?')">
                            Aplicar Cambios
                        </button>
                        <a href="?do=admin&page=commentdates" class="button">Cancelar</a>
                    </div>
                </form>
            <?php endif; ?>
        </div>
        <?php
    }

    /**
     * Procesa la actualización de comentarios de proyecto
     */
    protected function handleUpdateProjectComments()
    {
        global $INPUT;

        $selectedFiles = $INPUT->arr('files');
        $filesData = json_decode(base64_decode($INPUT->str('files_data')), true);
        $newTimestamp = $INPUT->int('new_timestamp');

        if (empty($selectedFiles) || empty($filesData)) {
            msg('No se seleccionaron archivos', -1);
            return;
        }

        $filesToUpdate = [];
        foreach ($selectedFiles as $index) {
            if (isset($filesData[$index])) {
                $filesToUpdate[] = $filesData[$index];
            }
        }

        // Crear backups
        foreach ($filesToUpdate as $file) {
            $this->helper->backupFile($file['path']);
        }

        // Aplicar cambios
        $result = $this->helper->updateMultipleCommentDates($filesToUpdate, $newTimestamp);

        if ($result['success']) {
            msg("Se actualizaron {$result['total_changes']} comentarios en {$result['success_count']} archivos.", 1);
        } else {
            msg("Se completó con errores: {$result['error_count']} archivos fallaron.", -1);
        }

        // Mostrar detalles
        echo '<div class="cd-section cd-results">';
        echo '<h2>Resultado de la Operación</h2>';
        echo '<table class="cd-table">';
        echo '<thead><tr><th>Archivo</th><th>Estado</th><th>Cambios</th></tr></thead>';
        echo '<tbody>';
        foreach ($result['details'] as $detail) {
            $statusClass = $detail['success'] ? 'cd-success' : 'cd-error';
            echo '<tr>';
            echo '<td><code>' . hsc($detail['file']) . '</code></td>';
            echo '<td class="' . $statusClass . '">' . ($detail['success'] ? 'OK' : 'ERROR') . '</td>';
            echo '<td>' . $detail['changes'] . ' comentarios</td>';
            echo '</tr>';
        }
        echo '</tbody></table>';
        echo '<p><a href="?do=admin&page=commentdates" class="button">Volver</a></p>';
        echo '</div>';
    }

    /**
     * Procesa la actualización de fecha en BEZ
     */
    protected function handleUpdateBezDate()
    {
        global $INPUT;

        $projectId = $INPUT->int('project_id_bez');
        $newDate = str_replace('T', ' ', $INPUT->str('new_date_bez'));

        if (!$projectId) {
            msg('Debe seleccionar un proyecto', -1);
            return;
        }

        // Asegurar formato correcto
        if (strlen($newDate) === 16) {
            $newDate .= ':00';
        }

        $result = $this->helper->updateBezProjectDate($projectId, $newDate);

        if ($result['success']) {
            msg($result['message'], 1);
        } else {
            msg($result['message'], -1);
        }
    }

    /**
     * Maneja la búsqueda de archivos administrativos
     */
    protected function handleSearchAdmin()
    {
        global $INPUT;

        $adminGroup = $INPUT->str('admin_group');
        $newDate = $INPUT->str('new_date_admin');

        if (empty($adminGroup)) {
            msg('Debe seleccionar un grupo', -1);
            $this->showMainInterface();
            return;
        }

        $files = $this->helper->findAdminCommentFiles($adminGroup);
        $timestamp = $this->helper->dateToTimestamp(str_replace('T', ' ', $newDate));

        ?>
        <div class="cd-section cd-results">
            <h2>Archivos Encontrados en Grupo: <?php echo hsc($adminGroup) ?></h2>

            <div class="cd-project-info">
                <p><strong>Nueva fecha para comentarios:</strong> <?php echo str_replace('T', ' ', $newDate) ?>
                   (Timestamp: <?php echo $timestamp ?>)</p>
            </div>

            <?php if (empty($files)): ?>
                <div class="cd-warning">No se encontraron archivos .comments en este grupo.</div>
            <?php else: ?>
                <form method="post">
                    <input type="hidden" name="sectok" value="<?php echo getSecurityToken() ?>">
                    <input type="hidden" name="action" value="update_admin_comments">
                    <input type="hidden" name="admin_group" value="<?php echo hsc($adminGroup) ?>">
                    <input type="hidden" name="new_timestamp" value="<?php echo $timestamp ?>">

                    <table class="cd-table">
                        <thead>
                            <tr>
                                <th>Seleccionar</th>
                                <th>Archivo</th>
                                <th>Comentarios</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($files as $i => $file): ?>
                                <tr>
                                    <td><input type="checkbox" name="files[]" value="<?php echo $i ?>" checked></td>
                                    <td><code><?php echo hsc($file['relative']) ?></code></td>
                                    <td><?php echo $file['comment_count'] ?></td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>

                    <input type="hidden" name="files_data" value="<?php echo base64_encode(json_encode($files)) ?>">

                    <div class="cd-form-actions">
                        <button type="submit" class="button primary"
                                onclick="return confirm('¿Aplicar cambios a los archivos seleccionados?')">
                            Aplicar Cambios
                        </button>
                        <a href="?do=admin&page=commentdates" class="button">Cancelar</a>
                    </div>
                </form>
            <?php endif; ?>
        </div>
        <?php
    }

    /**
     * Procesa la actualización de comentarios administrativos
     */
    protected function handleUpdateAdminComments()
    {
        global $INPUT;

        $selectedFiles = $INPUT->arr('files');
        $filesData = json_decode(base64_decode($INPUT->str('files_data')), true);
        $newTimestamp = $INPUT->int('new_timestamp');

        if (empty($selectedFiles) || empty($filesData)) {
            msg('No se seleccionaron archivos', -1);
            return;
        }

        $filesToUpdate = [];
        foreach ($selectedFiles as $index) {
            if (isset($filesData[$index])) {
                $filesToUpdate[] = $filesData[$index];
            }
        }

        // Crear backups
        foreach ($filesToUpdate as $file) {
            $this->helper->backupFile($file['path']);
        }

        // Aplicar cambios
        $result = $this->helper->updateMultipleCommentDates($filesToUpdate, $newTimestamp);

        if ($result['success']) {
            msg("Se actualizaron {$result['total_changes']} comentarios en {$result['success_count']} archivos.", 1);
        } else {
            msg("Se completó con errores: {$result['error_count']} archivos fallaron.", -1);
        }

        // Mostrar detalles
        echo '<div class="cd-section cd-results">';
        echo '<h2>Resultado de la Operación</h2>';
        echo '<table class="cd-table">';
        echo '<thead><tr><th>Archivo</th><th>Estado</th><th>Cambios</th></tr></thead>';
        echo '<tbody>';
        foreach ($result['details'] as $detail) {
            $statusClass = $detail['success'] ? 'cd-success' : 'cd-error';
            echo '<tr>';
            echo '<td><code>' . hsc($detail['file']) . '</code></td>';
            echo '<td class="' . $statusClass . '">' . ($detail['success'] ? 'OK' : 'ERROR') . '</td>';
            echo '<td>' . $detail['changes'] . ' comentarios</td>';
            echo '</tr>';
        }
        echo '</tbody></table>';
        echo '<p><a href="?do=admin&page=commentdates" class="button">Volver</a></p>';
        echo '</div>';
    }

    /**
     * Estilos CSS del plugin
     */
    protected function printStyles()
    {
        ?>
        <style>
            .cd-section {
                background: #fff;
                border: 1px solid #ddd;
                border-radius: 8px;
                padding: 20px;
                margin: 20px 0;
            }
            .cd-section h2 {
                margin-top: 0;
                padding-bottom: 10px;
                border-bottom: 2px solid #2196F3;
                color: #1976D2;
            }
            .cd-description {
                color: #666;
                margin-bottom: 20px;
            }
            .cd-form {
                max-width: 800px;
            }
            .cd-form-row {
                margin-bottom: 15px;
            }
            .cd-form-row label {
                display: block;
                font-weight: bold;
                margin-bottom: 5px;
                color: #333;
            }
            .cd-select, .cd-input {
                width: 100%;
                padding: 10px;
                border: 1px solid #ccc;
                border-radius: 4px;
                font-size: 14px;
                box-sizing: border-box;
            }
            .cd-select:focus, .cd-input:focus {
                border-color: #2196F3;
                outline: none;
                box-shadow: 0 0 5px rgba(33, 150, 243, 0.3);
            }
            .cd-form-actions {
                margin-top: 20px;
                padding-top: 15px;
                border-top: 1px solid #eee;
            }
            .button {
                display: inline-block;
                padding: 10px 20px;
                background: #f5f5f5;
                border: 1px solid #ccc;
                border-radius: 4px;
                color: #333;
                text-decoration: none;
                cursor: pointer;
                font-size: 14px;
                margin-right: 10px;
            }
            .button:hover {
                background: #e9e9e9;
            }
            .button.primary {
                background: #2196F3;
                border-color: #1976D2;
                color: white;
            }
            .button.primary:hover {
                background: #1976D2;
            }
            .cd-table {
                width: 100%;
                border-collapse: collapse;
                margin: 15px 0;
            }
            .cd-table th, .cd-table td {
                padding: 10px;
                border: 1px solid #ddd;
                text-align: left;
            }
            .cd-table th {
                background: #f5f5f5;
                font-weight: bold;
            }
            .cd-table tr:hover {
                background: #fafafa;
            }
            .cd-project-info {
                background: #e3f2fd;
                padding: 15px;
                border-radius: 4px;
                margin-bottom: 20px;
            }
            .cd-project-info p {
                margin: 5px 0;
            }
            .cd-warning {
                background: #fff3e0;
                border: 1px solid #ff9800;
                color: #e65100;
                padding: 15px;
                border-radius: 4px;
            }
            .cd-success {
                color: #2e7d32;
                font-weight: bold;
            }
            .cd-error {
                color: #c62828;
                font-weight: bold;
            }
            .cd-results {
                background: #fafafa;
            }
            code {
                background: #f5f5f5;
                padding: 2px 6px;
                border-radius: 3px;
                font-size: 13px;
            }
        </style>
        <?php
    }
}
