<?php

namespace MintyPHP\Service\Directory;

use MintyPHP\Service\Tenant\TenantScopeService;
use MintyPHP\Service\Tenant\TenantServicesFactory;

class DirectoryScopeGateway
{
    public function __construct(private readonly ?TenantScopeService $tenantScopeService = null)
    {
    }

    public function hasGlobalAccess(int $userId): bool
    {
        return $this->tenantScopeService()->hasGlobalAccess($userId);
    }

    public function getUserTenantIds(int $userId): array
    {
        return $this->tenantScopeService()->getUserTenantIds($userId);
    }

    public function isStrict(): bool
    {
        return $this->tenantScopeService()->isStrict();
    }

    public function canAccess(string $resourceType, int $resourceId, int $userId): bool
    {
        return $this->tenantScopeService()->canAccess($resourceType, $resourceId, $userId);
    }

    public function resourceBelongsToTenant(string $resourceType, int $resourceId, int $tenantId): bool
    {
        return $this->tenantScopeService()->resourceBelongsToTenant($resourceType, $resourceId, $tenantId);
    }

    public function filterTenantIdsForUser(array $tenantIds, int $userId): array
    {
        return $this->tenantScopeService()->filterTenantIdsForUser($tenantIds, $userId);
    }

    public function mergeTenantIdsPreservingOutOfScope(
        array $requestedTenantIds,
        array $existingTenantIds,
        array $allowedTenantIds
    ): array {
        return $this->tenantScopeService()->mergeTenantIdsPreservingOutOfScope(
            $requestedTenantIds,
            $existingTenantIds,
            $allowedTenantIds
        );
    }

    private function tenantScopeService(): TenantScopeService
    {
        if ($this->tenantScopeService instanceof TenantScopeService) {
            return $this->tenantScopeService;
        }

        return (new TenantServicesFactory())->createTenantScopeService();
    }
}
