<?php
    namespace Zampet\Module\Auth\v0\Middlewares;

    use Exception;
    use Zampet\Services\JWTService;
    use Zampet\Module\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.
         *
         * #### Fluxo de Operação:
         * 1.  **Obtenção do Token:** Tenta extrair o token Bearer do cabeçalho da requisição usando `JWTService::getBearerToken()`.
         * 2.  **Verificação de Presença:** Se o token não for encontrado, uma `Exception` é lançada com o código `401 Unauthorized`.
         * 3.  **Validação do Token:** Chama `AuthService::validateToken()` para verificar a validade do token (assinatura, expiração e status no banco de dados).
         * 4.  **Conclusão:**
         * * Se a validação for bem-sucedida, o método retorna `true`, permitindo que o processamento da rota continue.
         *
         * #### Tratamento de Erros:
         * - Qualquer `Exception` lançada durante o processo (token ausente, falha de validação JWT, token expirado) é capturada.
         * - O método retorna um array de erro formatado, contendo o código HTTP e a mensagem de erro da exceção, o que é útil para a camada de controle enviar uma resposta JSON padronizada ao cliente.
         *
         * @return array|bool Retorna `true` se o token for válido; caso contrário, retorna um array associativo com o status da operação, o código de resposta HTTP e uma mensagem de erro.
         */
        public static function handle(): array|bool {
            // Recebe o token JWT 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);
                }

                // Verifica se o token é válido
                $validateTokenService = (new AuthService())->validateToken(token: $bearerToken);
                if ($validateTokenService['status'] !== 'success') {
                    throw new Exception(message: $validateTokenService['message'], code: 401);
                }

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