<?php
namespace App\Middleware;

use Tinywan\Jwt\JwtToken;
use App\Utils\ApiResponse;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;

use ReflectionClass;

class JwtAuthMiddleware implements MiddlewareInterface
{
    /**
     * 处理请求
     * 
     * @param Request $request
     * @param callable $handler
     * @return Response
     */
    public function process(Request $request, callable $handler): Response
    {


        /**
         * 通过反射获取不需要登录的方法
         */
        $controller = new ReflectionClass($request->controller);
        /**
         * apidoc 直接继续向洋葱芯穿越
         */
        if($controller->name=='hg\apidoc\Controller'){
            return $handler($request);
        }
        $noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? [];
        if (in_array($request->action, $noNeedLogin)) {
            // 不需要登录的方法继续向洋葱芯穿越
            return $handler($request);
        }

        // 获取 Authorization 头部中的 token，通常格式为 "Bearer <token>"
        $token1 = $request->header('Authorization');
        $token2 =$request->header('Token');
        $token_tmp = !empty($token1) ? $token1 : $token2;
       
        if (strpos($token_tmp,"Bearer ") === false) {
            $token= 'Bearer '.$token_tmp;
        }else{
            $token= $token_tmp;
        }
        // 检查 token 是否为空
        if (empty($token)) {
            return ApiResponse::error(401, ['error' => '缺少令牌'], '未授权');
        }
        // var_dump($token);

        // 移除 Bearer 前缀并获取纯 token
        // if (strpos($token, 'Bearer ') === 0) {
        //     $token = substr($token, 7);  // 去掉 "Bearer " 部分
        // }

        try {
            // 解码 token，返回用户信息
            $decoded = JwtToken::getExtend($token);
            // var_dump($decoded);
        } catch (\Exception $e) {
            var_dump($e);
            // 解码失败，返回无效令牌错误
            return ApiResponse::error(401, ['error' => '无效的令牌'], '无效的令牌');
        }

        // 将解码后的用户信息存储到请求对象的 user 属性中
        // $request = $request->withAttribute('user', $decoded);
        $request->data = $decoded;
        // 继续处理请求，传递给下一个中间件或控制器，并返回响应
        return $handler($request);
    }
}
