<?php

namespace WPD\Web;

final class View
{
    public function sealed($error)
    {
        $body = '<section class="intro"><p class="eyebrow">Configuración necesaria</p><h1>Acceso temporal no habilitado</h1><p class="lead">' . wpd_escape($error) . '</p>';
        $body .= '<ol class="steps"><li>Copia <code>config.example.php</code> como <code>config.php</code>.</li><li>Define un token aleatorio de al menos 32 caracteres.</li><li>Revisa la configuración mediante FTP y vuelve a cargar.</li></ol></section>';
        $this->layout('Acceso no habilitado', $body, false, '', true);
    }

    public function insecureHttp()
    {
        $body = '<section class="intro"><p class="eyebrow">Conexión no segura</p><h1>El acceso temporal está bloqueado</h1><p class="lead">Utiliza HTTPS. Si no es posible, activa por FTP un modo de emergencia limitado a tu IP.</p>';
        $body .= "<pre><code>'allow_insecure_http' =&gt; true,\n'allowed_ips' =&gt; array('TU_IP_PUBLICA'),</code></pre><p>El modo de emergencia dura 30 minutos, no acepta credenciales manuales y no permite descargas.</p></section>";
        $this->layout('Conexión no segura', $body, false, '', true);
    }

    public function restricted()
    {
        $body = '<section class="intro"><p class="eyebrow">Acceso restringido</p><h1>Mantenimiento no disponible</h1><p class="lead">Revisa la configuración temporal mediante FTP.</p></section>';
        $this->layout('Acceso restringido', $body, false, '', true);
    }

    public function unavailable()
    {
        $body = '<section class="intro"><p class="eyebrow">Acceso restringido</p><h1>La activación no está disponible</h1><p class="lead">Para reactivar, sustituye el token y elimina el estado de activación mediante FTP.</p></section>';
        $this->layout('Activación no disponible', $body, false, '', true);
    }

    public function login($csrf, $error = false, $emergency = false)
    {
        $body = '<section class="auth"><p class="eyebrow">Acceso temporal</p><h1>Mantenimiento restringido</h1><p class="lead">Introduce el token configurado mediante FTP.</p>';
        if ($error) {
            $body .= '<p class="notice danger" role="alert">No se pudo autorizar el acceso.</p>';
        }
        if ($emergency) {
            $body .= '<p class="notice warning"><strong>Modo HTTP de emergencia.</strong> La conexión no está cifrada y la ventana máxima es de 30 minutos.</p>';
        }
        $body .= '<form method="post" action="?action=login" class="form"><input type="hidden" name="csrf" value="' . wpd_escape($csrf) . '"><label for="access-token">Token de acceso</label><input id="access-token" name="access_token" type="password" required autocomplete="current-password"><button type="submit">Autorizar temporalmente</button></form></section>';
        $this->layout('Acceso temporal', $body, false, '', true);
    }

    public function setup($csrf, $detected, $configStatus = null, $error = null, $emergency = false)
    {
        $body = '<section class="intro"><p class="eyebrow">Nuevo diagnóstico</p><h1>Comprobar la instalación configurada</h1><p class="lead">Solo se examinará la raíz definida mediante FTP. No se ejecutarán archivos ni se modificarán datos.</p></section>';
        if ($error) {
            $body .= '<p class="notice danger" role="alert">' . wpd_escape($error) . '</p>';
        } elseif ($detected) {
            $body .= '<p class="notice success"><strong>WordPress detectado.</strong> La ruta absoluta permanecerá oculta.</p>';
        } else {
            $body .= '<p class="notice warning"><strong>WordPress no detectado.</strong> Corrige <code>allowed_root</code> en <code>config.php</code> mediante FTP.</p>';
        }
        if ($emergency) {
            $body .= '<p class="notice warning"><strong>Modo HTTP limitado.</strong> No se aceptarán credenciales manuales ni se permitirán exportaciones.</p>';
        }
        $body .= '<form method="post" action="?action=start" class="form wide"><input type="hidden" name="csrf" value="' . wpd_escape($csrf) . '">';
        if ($configStatus && !empty($configStatus['complete'])) {
            $body .= '<p class="notice success"><strong>Conexión localizada.</strong> Se leerán temporalmente valores literales de wp-config.php sin ejecutar el archivo.</p>';
        } else {
            $body .= '<p class="notice warning"><strong>Conexión automática incompleta.</strong> La cobertura de base de datos será parcial.</p>';
        }
        if (!$emergency) {
            $prefix = $configStatus && isset($configStatus['table_prefix']) ? $configStatus['table_prefix'] : 'wp_';
            $body .= '<details class="manual-db"><summary>Usar una conexión manual durante esta fase</summary><label class="check"><input type="checkbox" name="use_manual_database" value="1"> Usar temporalmente los datos siguientes</label><div class="field-grid">';
            $body .= '<label>Base de datos<input name="db_name" autocomplete="off"></label><label>Usuario<input name="db_user" autocomplete="off"></label><label>Contraseña<input name="db_password" type="password" autocomplete="new-password"></label><label>Servidor<input name="db_host" value="localhost" autocomplete="off"></label><label>Prefijo de tablas<input name="db_prefix" value="' . wpd_escape($prefix) . '" autocomplete="off"></label></div><p class="hint">Se eliminarán de la sesión al terminar la fase de base de datos, incluso si falla.</p></details>';
        }
        $body .= '<div class="actions"><button type="submit"' . ($detected ? '' : ' disabled') . '>Comenzar diagnóstico</button></div></form>';
        $this->layout('Nueva revisión', $body, true, $csrf, false, $emergency);
    }

    public function progress($csrf, array $progress, $emergency = false)
    {
        $body = '<section class="progress-view" data-scan-progress data-step-url="?action=step" data-csrf="' . wpd_escape($csrf) . '"><p class="eyebrow">Análisis en curso</p><h1>Revisando WordPress</h1><p class="lead" data-current>' . wpd_escape($progress['current']) . '</p>';
        $body .= '<div class="progress-track" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="' . (int) $progress['percent'] . '"><span data-progress-bar style="width:' . (int) $progress['percent'] . '%"></span></div><p class="hint"><span data-percent>' . (int) $progress['percent'] . '%</span> · <span data-count>' . (int) $progress['done'] . ' de ' . (int) $progress['total'] . ' fases</span></p>';
        if ($emergency) {
            $body .= '<p class="notice warning"><strong>Modo HTTP de emergencia.</strong> El resultado solo estará disponible en esta pantalla.</p>';
        }
        $body .= '<form method="post" action="?action=step" class="fallback"><input type="hidden" name="csrf" value="' . wpd_escape($csrf) . '"><input type="hidden" name="fallback" value="1"><button type="submit">Continuar una fase</button></form></section>';
        $this->layout('Analizando', $body, true, $csrf, false, $emergency);
    }

    public function report($csrf, array $report, $exportAllowed)
    {
        $body = '<section class="report-head"><p class="eyebrow">Diagnóstico terminado</p><h1>Problemas encontrados</h1><p class="lead">' . wpd_escape($report['summary']) . '</p>';
        $body .= '<div class="facts"><span><small>Confirmados</small>' . (int) $report['counts']['problema confirmado'] . '</span><span><small>Probables</small>' . (int) $report['counts']['causa probable'] . '</span><span><small>Cobertura</small>' . wpd_escape($report['coverage']) . '</span></div>';
        if ($exportAllowed) {
            $body .= '<div class="actions"><form method="post" action="?action=export_html"><input type="hidden" name="csrf" value="' . wpd_escape($csrf) . '"><button class="button secondary" type="submit">Descargar HTML</button></form><form method="post" action="?action=export_json"><input type="hidden" name="csrf" value="' . wpd_escape($csrf) . '"><button class="button secondary" type="submit">Descargar JSON</button></form></div>';
        } else {
            $body .= '<p class="notice warning"><strong>Exportación desactivada.</strong> El modo HTTP de emergencia solo muestra el resultado en esta sesión.</p>';
        }
        $body .= '</section>';

        if ($report['coverage'] === 'parcial') {
            $body .= '<p class="notice warning"><strong>Cobertura parcial.</strong> Algunas zonas no pudieron comprobarse; este resultado no certifica que todo esté correcto.</p>';
        }
        $body .= '<nav class="filters" aria-label="Filtrar resultados"><button type="button" data-filter="all" class="active">Todos</button><button type="button" data-filter="problema-confirmado">Confirmados</button><button type="button" data-filter="causa-probable">Probables</button><button type="button" data-filter="advertencia">Advertencias</button><button type="button" data-filter="información">Cobertura</button></nav>';
        $body .= '<section class="findings" data-findings>';
        if (!$report['findings']) {
            $body .= '<p class="empty">No se confirmó una causa. Revisa la cobertura incompleta antes de considerar correcta la instalación.</p>';
        }
        foreach ($report['findings'] as $finding) {
            $filter = str_replace(' ', '-', $finding['certainty']);
            $body .= '<article class="finding" data-kind="' . wpd_escape($filter) . '"><header><p class="meta"><span>' . wpd_escape($finding['certainty']) . '</span> · ' . wpd_escape($finding['severity']) . '</p><h2>' . wpd_escape($finding['title']) . '</h2></header>';
            $body .= '<p><strong>Prueba mínima:</strong> ' . wpd_escape($finding['evidence']) . '</p><p>' . wpd_escape($finding['explanation']) . '</p><details><summary>Ver solución recomendada</summary><ol>';
            foreach ($finding['solution'] as $step) {
                $body .= '<li>' . wpd_escape($step) . '</li>';
            }
            $body .= '</ol><p><strong>Después:</strong> ' . wpd_escape($finding['verification']) . '</p></details></article>';
        }
        $body .= '</section>';
        if ($report['checks']) {
            $body .= '<section class="checks"><h2>Fases sin cobertura completa</h2><ul>';
            foreach ($report['checks'] as $check) {
                $body .= '<li><span><strong>' . wpd_escape($check['label']) . '</strong></span><em>' . wpd_escape($check['status']) . '</em></li>';
            }
            $body .= '</ul></section>';
        }
        $body .= '<form method="post" action="?action=clear" class="clear-form"><input type="hidden" name="csrf" value="' . wpd_escape($csrf) . '"><button class="danger-button" type="submit">Borrar este diagnóstico</button><p class="hint">Después, elimina toda la carpeta mediante FTP.</p></form>';
        $this->layout('Informe', $body, true, $csrf, false, !$exportAllowed);
    }

    public function message($title, $message)
    {
        $body = '<section class="intro"><h1>' . wpd_escape($title) . '</h1><p class="lead">' . wpd_escape($message) . '</p><p><a class="button" href="./">Volver</a></p></section>';
        $this->layout($title, $body, false);
    }

    private function layout($title, $body, $authenticated, $csrf = '', $discreet = false, $emergency = false)
    {
        $product = $discreet ? 'Mantenimiento restringido' : 'Diagnóstico WordPress';
        echo '<!doctype html><html lang="es"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="color-scheme" content="light"><title>' . wpd_escape($title) . ' · ' . wpd_escape($product) . '</title><link rel="stylesheet" href="assets/app.css"></head><body>';
        echo '<header class="site-header"><a href="./" class="brand"><span>MT</span> ' . wpd_escape($product) . '</a>';
        if ($authenticated) {
            echo '<form method="post" action="?action=logout"><input type="hidden" name="csrf" value="' . wpd_escape($csrf) . '"><button type="submit" class="text-button">Cerrar sesión</button></form>';
        }
        echo '</header><main>' . $body . '</main><footer><p>' . ($discreet ? 'Acceso temporal restringido.' : 'Herramienta de solo lectura · Elimina esta carpeta del servidor cuando termines.') . '</p></footer><script src="assets/app.js" defer></script></body></html>';
    }
}
