<?php

namespace App\Core;

class Auth
{
    private const SESSION_KEY = 'pbi_admin';
    private const ADMIN_FILE  = '/config/admin.php';

    public static function estaLogado(): bool
    {
        return !empty($_SESSION[self::SESSION_KEY]);
    }

    /**
     * Redireciona para setup (sem senha) ou login (com senha) se não autenticado.
     */
    public static function verificarOuRedirecionar(): void
    {
        if (self::estaLogado()) return;

        if (!self::temSenhaCadastrada()) {
            header('Location: /admin/setup');
            exit;
        }

        $redirect = urlencode($_SERVER['REQUEST_URI'] ?? '/');
        header('Location: /admin/login?redirect=' . $redirect);
        exit;
    }

    public static function login(string $senhaFornecida): bool
    {
        $hash = self::hashSalvo();
        if ($hash === null) return false;

        if (password_verify($senhaFornecida, $hash)) {
            $_SESSION[self::SESSION_KEY] = true;
            return true;
        }
        return false;
    }

    public static function logout(): void
    {
        unset($_SESSION[self::SESSION_KEY]);
    }

    public static function temSenhaCadastrada(): bool
    {
        return self::hashSalvo() !== null;
    }

    public static function hashSalvo(): ?string
    {
        $path = dirname(__DIR__, 2) . self::ADMIN_FILE;
        if (!file_exists($path)) return null;
        $cfg  = require $path;
        $hash = $cfg['senha_hash'] ?? null;
        return (is_string($hash) && $hash !== '') ? $hash : null;
    }

    /**
     * Marca que o usuário confirmou a senha agora (token de uso único).
     */
    public static function marcarReauth(): void
    {
        $_SESSION['pbi_reauth'] = true;
    }

    /**
     * Verifica e consome o token de reauth (uso único — expira na mesma requisição).
     */
    public static function consumirReauth(): bool
    {
        if (!empty($_SESSION['pbi_reauth'])) {
            unset($_SESSION['pbi_reauth']);
            return true;
        }
        return false;
    }

    public static function salvarSenha(string $novaSenha): void
    {
        $path = dirname(__DIR__, 2) . self::ADMIN_FILE;
        $hash = password_hash($novaSenha, PASSWORD_BCRYPT);

        $conteudo  = "<?php\n";
        $conteudo .= "// Senha de administrador do Premium Express Gestão — NÃO commitar\n";
        $conteudo .= "return " . var_export(['senha_hash' => $hash], true) . ";\n";

        if (file_put_contents($path, $conteudo) === false) {
            throw new \RuntimeException('Não foi possível gravar config/admin.php. Verifique as permissões.');
        }

        // Loga automaticamente após definir a senha
        $_SESSION[self::SESSION_KEY] = true;
    }
}
