<?php
/**
 * Flexia — gate when auth_config.enc cannot be decrypted (fatal avoided).
 * Spanish UI: recover instructions vs quarantine all encrypted vault data.
 */

declare(strict_types=1);

if (!defined('ANTARA_ROOT')) {
    define('ANTARA_ROOT', dirname(__DIR__, 2));
}

require_once ANTARA_ROOT . '/core/security/paths.php';
require_once ANTARA_ROOT . '/core/security/vault_state.php';
require_once ANTARA_ROOT . '/core/security/csrf.php';
require_once ANTARA_ROOT . '/core/security/vault_quarantine.php';
require_once ANTARA_ROOT . '/includes/install_public.php';

/**
 * Renders recovery UI or runs POST reset; always exits (CLI: stderr + exit 1).
 */
function antara_vault_config_recovery_respond_and_exit(?\RuntimeException $cause = null): void
{
    if (PHP_SAPI === 'cli') {
        $msg = 'Antara: no se puede leer la configuración cifrada.';
        if ($cause) {
            $msg .= ' ' . $cause->getMessage();
        }
        fwrite(STDERR, $msg . PHP_EOL);
        exit(1);
    }

    require_once ANTARA_ROOT . '/includes/install_checks.php';
    antara_install_prepare_hosting_layout();

    $esc = static function (string $s): string {
        return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
    };

    $allowed = AntaraVaultState::recoveryWebAllowed();
    $installLocked = is_file(AntaraPaths::installLockFile());
    $envTokenActive = is_string(getenv('ANTARA_RECOVERY_TOKEN')) && getenv('ANTARA_RECOVERY_TOKEN') !== '';
    $needsPostedRecoveryToken = $installLocked
        && !is_file(AntaraPaths::recoveryAllowFile())
        && $envTokenActive;

    $errors = [];

    if ($_SERVER['REQUEST_METHOD'] === 'POST' && $allowed) {
        $body = $_POST;
        $csrfIn = is_string($body['csrf'] ?? null) ? (string)$body['csrf'] : '';
        if (!AntaraCsrf::isValid($csrfIn)) {
            $errors[] = 'Sesión de seguridad caducada. Recarga la página e inténtalo de nuevo.';
        }
        $postedRecovery = is_string($body['recovery_token'] ?? null) ? (string)$body['recovery_token'] : '';
        if ($errors === [] && !AntaraVaultState::recoveryPostAuthorized($postedRecovery)) {
            $errors[] = 'Instalación finalizada: pide a quien administra el servidor que active la recuperación cifrada o que te indique el token de recuperación correcto.';
        }
        if ($errors === [] && empty($body['confirm_reset'])) {
            $errors[] = 'Debes marcar la casilla de confirmación para continuar.';
        }
        if ($errors === [] && (string)($body['vault_action'] ?? '') !== 'quarantine_reset') {
            $errors[] = 'Acción no válida.';
        }
        if ($errors === []) {
            $result = AntaraVaultQuarantine::executeFullVaultReset();
            if (!$result['ok']) {
                foreach ($result['errors'] as $msg) {
                    $errors[] = $msg;
                }
            } else {
                AntaraCsrf::rotate();
                if (!headers_sent()) {
                    header('Location: ' . antara_install_base_url(), true, 302);
                }
                exit;
            }
        }
    }

    $csrfToken = AntaraCsrf::token();
    if (!headers_sent()) {
        http_response_code(503);
        header('Content-Type: text/html; charset=utf-8');
        header('X-Robots-Tag: noindex, nofollow');
    }

    $tech = $cause ? $cause->getMessage() : '';

    ?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Recuperar Flexia — cofre ilegible</title>
    <style>
        body { font-family: system-ui, Segoe UI, sans-serif; background: #0a0f18; color: #e8f0ff; margin: 0; line-height: 1.55; }
        .wrap { max-width: 46rem; margin: 0 auto; padding: 2rem 1.25rem 3rem; }
        h1 { font-size: 1.4rem; font-weight: 700; margin: 0 0 .5rem; color: #7dd3fc; }
        h2 { font-size: 1.05rem; margin: 1.75rem 0 .5rem; color: #94a3b8; font-weight: 600; }
        .lead { color: #cbd5e1; margin: 0 0 1rem; }
        .card { background: #111827; border: 1px solid #1e293b; border-radius: 12px; padding: 1.25rem 1.35rem; margin-top: 1rem; }
        .err { color: #fca5a5; margin: .5rem 0; }
        label { display: block; margin: .75rem 0 .25rem; color: #94a3b8; }
        input[type=text], input[type=password] { width: 100%; max-width: 28rem; padding: .5rem .65rem; border-radius: 8px; border: 1px solid #334155; background: #0f172a; color: #e8f0ff; box-sizing: border-box; }
        .btn { margin-top: 1rem; padding: .55rem 1rem; background: #0ea5e9; color: #fff; border: none; border-radius: 8px; font-weight: 600; cursor: pointer; font-size: .95rem; }
        .btn-danger { background: #b91c1c; }
        .btn-danger:hover { background: #991b1b; }
        a { color: #38bdf8; }
        code { background: #0f172a; padding: .1rem .35rem; border-radius: 4px; font-size: .88em; }
        ul { padding-left: 1.2rem; margin: .5rem 0; }
        .muted { color: #94a3b8; font-size: .9rem; margin-top: .75rem; }
        .tech { font-size: .8rem; color: #64748b; word-break: break-all; margin-top: 1rem; }
    </style>
</head>
<body>
<div class="wrap">
    <h1>Recuperar Flexia</h1>
    <p class="lead">No se puede leer la configuración cifrada del sistema. Suele deberse a una <strong>clave de cifrado</strong> que no coincide con la que se usó al guardar los datos, o a información dañada.</p>

    <?php foreach ($errors as $e): ?>
        <p class="err"><?php echo $esc($e); ?></p>
    <?php endforeach; ?>

    <div class="card">
        <h2>Opción A — Intentar recuperar la información</h2>
        <p>Quien administra el servidor debe restaurar la <strong>copia de la clave de cifrado</strong> que corresponda a esta instalación (la del mismo respaldo que los datos). Si hubo varias copias antiguas, solo debe quedar la válida.</p>
        <p>Después <strong>recarga esta página</strong>.</p>
        <p class="muted">Lo que ya subiste como archivos o medios en el proyecto <strong>no</strong> se borra con esta recuperación; solo afecta al material cifrado del sistema.</p>
        <?php if ($allowed): ?>
            <p><a href="<?php echo $esc(antara_recovery_url()); ?>">Abrir recuperación criptográfica</a> (misma operación de cuarentena que la opción B).</p>
        <?php endif; ?>
    </div>

    <?php if ($allowed): ?>
    <div class="card">
        <h2>Opción B — Borrar todos los datos cifrados y reiniciar</h2>
        <p>Apartará los datos cifrados del sistema a una zona de cuarentena, quitará la clave interna de cifrado si la había y permitirá volver al <strong>instalador</strong>. <strong>Perderás usuarios, claves de acceso modernas y ajustes de inicio de sesión</strong> guardados en ese material.</p>
        <p>Si la clave estaba fuera del proyecto (carpeta auxiliar junto a la instalación), elimínala o sustitúyela para no reutilizar una clave antigua.</p>
        <form method="post">
            <input type="hidden" name="csrf" value="<?php echo $esc($csrfToken); ?>">
            <input type="hidden" name="vault_action" value="quarantine_reset">
            <?php if ($needsPostedRecoveryToken): ?>
                <label for="recovery_token">Token de recuperación (el que configuró quien administra el servidor)</label>
                <input type="password" name="recovery_token" id="recovery_token" autocomplete="off" required>
            <?php elseif ($installLocked && is_file(AntaraPaths::recoveryAllowFile())): ?>
                <p class="muted">Acceso permitido: el administrador activó la recuperación en el servidor.</p>
            <?php elseif (!$installLocked): ?>
                <p class="muted">Instalación no finalizada: no se pide token adicional.</p>
            <?php endif; ?>
            <label style="margin-top:1rem;">
                <input type="checkbox" name="confirm_reset" value="1" required>
                Entiendo que los datos cifrados actuales dejarán de usarse y pasarán a cuarentena.
            </label>
            <div>
                <button type="submit" class="btn btn-danger">Borrar datos cifrados del cofre y abrir instalador</button>
            </div>
        </form>
    </div>
    <?php else: ?>
    <div class="card">
        <h2>Reinicio no disponible por web</h2>
        <p>El administrador del servidor debe activar la recuperación cifrada (permiso en el panel o token acordado). Después podrás usar la <a href="<?php echo $esc(antara_recovery_url()); ?>">página de recuperación del instalador</a> o recargar esta página.</p>
    </div>
    <?php endif; ?>

    <p style="margin-top:1.5rem"><a href="<?php echo $esc(antara_public_app_base()); ?>">Volver a intentar el inicio</a></p>
    <?php if ($tech !== ''): ?>
        <p class="tech">Detalle técnico: <?php echo $esc($tech); ?></p>
    <?php endif; ?>
</div>
</body>
</html>
    <?php
    exit;
}
