<?php

namespace App\Middleware;

use Psr\Container\ContainerInterface;

class TokenAuthentication
{
    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    /**
     * Token middleware invokable class
     *
     * @param  \Psr\Http\Message\ServerRequestInterface $request  PSR7 request
     * @param  \Psr\Http\Message\ResponseInterface      $response PSR7 response
     * @param  callable                                 $next     Next middleware
     *
     * @return \Psr\Http\Message\ResponseInterface
     */
    public function __invoke($request, $response, $next)
    {
        if (!$request->hasHeader('Authorization')) {
            return $response->withJson([
                'status' => 'error',
                'message' => "Token not found.",
            ], 401);
        }

        $header = $request->getHeader('Authorization')[0];
        if (!preg_match('/Bearer\s+(.*)$/i', $header, $matches)) {
            return $response->withJson([
                'status' => 'error',
                'message' => "Invalid token format. Please ensure you prefix your token with `Bearer `.",
                'token' => $token,
            ], 401);
        }

        $token = $matches[1];
        $users = $this->container->get('users');

        $user = $users->where('token', $token)
                ->first();

        if (!$user) {
            return $response->withJson([
                'status' => 'error',
                'message' => "Invalid token.",
                'token' => $token,
            ], 401);
        }

        $newRequest = $request->withAttribute('user', $user);
        $response = $next($newRequest, $response);

        return $response;
    }
}