<?php
    namespace Workbloom\Component\Auth\v0\Middlewares;

    use Exception;
    use Workbloom\Services\JWTService;
    use Workbloom\Component\Auth\v0\Services\AuthService;

    class AuthMiddleware {
        /**
         * Gerencia o processo de autenticação de uma requisição de API via token Bearer.
         *
         * Este método estático atua como um **middleware de autenticação**, verificando a presença e a validade de um token JWT em uma requisição HTTP, incluindo checagens de revogação e expiração no banco de dados.
         *
         * #### Fluxo de Operação:
         * 1.  **Obtenção e Decodificação do Token:** Tenta extrair o token Bearer do cabeçalho `Authorization` e decodificá-lo. Se o token estiver ausente ou a decodificação inicial falhar, retorna `401 Unauthorized`.
         * 2.  **Validação de Segurança e Status:** Chama o método `validateAuthToken` do **`AuthService`**. Este serviço realiza as verificações críticas no banco de dados (revogação, expiração por data) e no dispositivo (IP/User Agent).
         * 3.  **Gerenciamento da Resposta:**
         * * Se a validação do serviço for **bem-sucedida** (`status === 'success'`), o método retorna `true`, permitindo que o processamento da rota continue.
         * * Se a validação do serviço **falhar** (por token expirado, revogado ou dispositivo inválido), o método retorna o array de erro formatado pelo serviço, com o código HTTP e a mensagem correspondente.
         *
         * @return array|bool Retorna `true` se o token for válido e o acesso for autorizado; caso contrário, retorna um array de erro formatado contendo o código HTTP e a mensagem da falha.
         */
        public static function handle(): array|bool {
            // Recebe o token decodificado do cabeçalho Authorization
            $bearerToken = JWTService::getBearerToken();

            try {
                // Verifica se o token está presente
                if (!$bearerToken) {
                    throw new Exception(message: "Token not provided", code: 401);
                }

                $decodedToken = JWTService::decode(token: $bearerToken);
                if(empty($decodedToken)) {
                    return [
                        'response_code' => 401,
                        'status' => 'error',
                        'message' => 'Unauthorized: Invalid or missing token.'
                    ];
                }

                // Chama serviço de login e valida token e permissões
                $authService = (new AuthService())->validateAuthToken(token: $bearerToken);

                // Verifica se a validação foi bem-sucedida
                if($authService['status'] !== 'success') {
                    return [
                        'response_code' => $authService['response_code'] ?? 500,
                        'status' => $authService['status'] ?? 'error',
                        'message' => $authService['message'] ?? 'Internal server error',
                        'output' => $authService['output'] ?? []
                    ];
                }

                return true;
            } catch(Exception $e) {
                return [
                    'response_code' => $e->getCode(),
                    'status' => 'error',
                    'message' => $e->getMessage()
                ];
            }
        }
    }