<?php
namespace Misuzu\Routing;

use Index\Config\Config;
use Index\Http\HttpUri;
use Index\Http\Routing\HandlerContext;
use Index\Http\Routing\Routes\RouteInfo;
use Index\Http\Routing\AccessControl\{AccessControl,SimpleAccessControlHandler};

class RoutingAccessControlHandler extends SimpleAccessControlHandler {
    public function __construct(
        private Config $config,
    ) {}

    /** @param string[] $origins */
    public static function filterOrigin(array $origins, HttpUri $origin): ?string {
        $host = '.' . $origin->host;
        foreach($origins as $allowed)
            if(str_ends_with($host, '.' . $allowed))
                return (string)$origin;

        return null;
    }

    #[\Override]
    public function checkAccess(
        HandlerContext $context,
        AccessControl $accessControl,
        HttpUri $origin,
        ?RouteInfo $routeInfo = null,
    ): string|bool {
        if($accessControl->credentials) {
            $result = null;
            if($context->request->requestTarget === '/_sockchat'
                || str_starts_with($context->request->requestTarget, '/_sockchat/')) {
                $result = self::filterOrigin($this->config->getArray('sockChat.origins'), $origin);
            } elseif($context->request->requestTarget === '/storage'
                || str_starts_with($context->request->requestTarget, '/storage/')) {
                $result = self::filterOrigin($this->config->getArray('storage.origins'), $origin);
            }

            if($result !== null)
                return $result;
        }

        return true;
    }
}