<?php
/**
 * Flexia — cryptographic vault recovery (quarantine .enc + optional reinstall).
 * Does not load bootstrap_auth (avoids migrate/store reads when ciphertext is unreadable).
 */

declare(strict_types=1);

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

@chdir(GRID_ROOT);

require_once GRID_ROOT . '/core/security/paths.php';
require_once GRID_ROOT . '/core/security/vault_state.php';
require_once GRID_ROOT . '/includes/install_checks.php';
antara_install_prepare_hosting_layout();
require_once GRID_ROOT . '/core/security/vault_quarantine.php';
require_once GRID_ROOT . '/core/auth/session.php';
require_once GRID_ROOT . '/core/security/csrf.php';
require_once GRID_ROOT . '/includes/install_public.php';
require_once GRID_ROOT . '/includes/install_wizard_state.php';

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

if (!AntaraVaultState::recoveryWebAllowed()) {
    if (!headers_sent()) {
        http_response_code(404);
        header('Content-Type: text/html; charset=utf-8');
        header('X-Robots-Tag: noindex, nofollow');
    }
    echo '<!DOCTYPE html><html lang="es"><head><meta charset="utf-8"><title>Flexia</title></head><body style="font-family:system-ui;padding:2rem;background:#0a0f18;color:#e8f0ff">';
    echo '<p>No disponible.</p></body></html>';
    exit;
}

$errors = [];
$vaultCase = AntaraVaultState::vaultBootstrapCase();
$envTokenActive = is_string(getenv('ANTARA_RECOVERY_TOKEN')) && getenv('ANTARA_RECOVERY_TOKEN') !== '';
$installLocked = is_file(AntaraPaths::installLockFile());
$needsPostedRecoveryToken = $installLocked
    && !is_file(AntaraPaths::recoveryAllowFile())
    && $envTokenActive;

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $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 === []) {
        $result = AntaraVaultQuarantine::executeFullVaultReset();
        if (!$result['ok']) {
            foreach ($result['errors'] as $msg) {
                $errors[] = $msg;
            }
        } else {
            antara_install_wizard_clear_draft();
            AntaraCsrf::rotate();
            if (!headers_sent()) {
                header('Location: ' . antara_install_base_url(), true, 302);
            }
            exit;
        }
    }
}

$csrfToken = AntaraCsrf::token();

if (!headers_sent()) {
    header('Content-Type: text/html; charset=utf-8');
    header('X-Robots-Tag: noindex, nofollow');
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Recuperación criptográfica — Flexia</title>
    <style>
        body { font-family: system-ui, Segoe UI, sans-serif; background: #0a0f18; color: #e8f0ff; margin: 0; line-height: 1.55; }
        .wrap { max-width: 42rem; margin: 0 auto; padding: 2rem 1.25rem 3rem; }
        h1 { font-size: 1.35rem; font-weight: 700; margin: 0 0 .5rem; color: #7dd3fc; }
        .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; }
        .btn { margin-top: 1rem; padding: .55rem 1rem; background: #0ea5e9; color: #fff; border: none; border-radius: 8px; font-weight: 600; cursor: pointer; }
        a { color: #38bdf8; }
        code { background: #0f172a; padding: .1rem .35rem; border-radius: 4px; }
        ul { padding-left: 1.2rem; }
    </style>
</head>
<body>
<div class="wrap">
    <h1>Recuperación criptográfica</h1>
    <p>Esta acción aparta los datos cifrados del sistema a una zona de cuarentena, quita la clave interna de cifrado si la había y puede devolverte al instalador. Opcionalmente deja de aplicarse el bloqueo de instalación ya terminada.</p>
    <p><strong>Perderás usuarios, credenciales WebAuthn y la configuración de autenticación</strong> asociados a esos datos. Si la clave de cifrado estaba solo fuera del proyecto (carpeta auxiliar junto a la instalación), deberás borrarla o sustituirla para que no se reutilice una clave antigua.</p>

    <div class="card">
        <p>Estado detectado: <strong><?php echo $esc($vaultCase); ?></strong></p>
        <ul>
            <li>Clave de cifrado en el servidor: <?php echo AntaraVaultState::masterKeyExistsAnywhere() ? 'sí' : 'no'; ?></li>
            <li>Hay datos cifrados guardados: <?php echo AntaraVaultState::hasNonEmptyStoreCiphertexts() ? 'sí' : 'no'; ?></li>
        </ul>
        <?php if ($installLocked && is_file(AntaraPaths::recoveryAllowFile())): ?>
            <p>Acceso permitido: el administrador activó la recuperación en el servidor.</p>
        <?php elseif ($installLocked && $envTokenActive): ?>
            <p>Instalación bloqueada: indica el <strong>token de recuperación</strong> que configuró quien administra el servidor.</p>
        <?php elseif (!$installLocked): ?>
            <p>Instalador no finalizado: no se requiere token adicional.</p>
        <?php endif; ?>
    </div>

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

    <form method="post" class="card">
        <input type="hidden" name="csrf" value="<?php echo $esc($csrfToken); ?>">
        <?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 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">Ejecutar recuperación y abrir instalador</button>
        </div>
    </form>
    <p><a href="<?php echo $esc(antara_public_app_base()); ?>">Volver al inicio</a> · <a href="<?php echo $esc(antara_install_base_url()); ?>">Instalador</a></p>
</div>
</body>
</html>
