<?php

namespace App\Services\Providers;

use App\Models\ProviderConnection;
use App\Models\ManagedEnvironment;
use App\Support\Providers\ProviderReasonCodes;

final class MicrosoftGraphOptionsResolver
{
    public function __construct(
        private readonly ProviderConnectionResolver $connections,
        private readonly ProviderGateway $gateway,
    ) {}

    /**
     * @return array<string, mixed>
     */
    public function resolveForTenant(ManagedEnvironment $tenant, array $overrides = []): array
    {
        $resolution = $this->connections->resolveDefault($tenant, 'microsoft');

        if (! $resolution->resolved || $resolution->connection === null) {
            throw ProviderConfigurationRequiredException::forTenant(
                $tenant,
                provider: 'microsoft',
                resolution: $resolution,
            );
        }

        return $this->gateway->graphOptions($resolution->connection, $overrides);
    }

    /**
     * @return array<string, mixed>
     */
    public function resolveForConnection(ManagedEnvironment $tenant, int|ProviderConnection $connection, array $overrides = []): array
    {
        $providerConnection = $connection instanceof ProviderConnection
            ? $connection
            : ProviderConnection::query()->find($connection);

        if (! $providerConnection instanceof ProviderConnection) {
            throw ProviderConfigurationRequiredException::forTenant(
                tenant: $tenant,
                provider: 'microsoft',
                resolution: ProviderConnectionResolution::blocked(
                    ProviderReasonCodes::ProviderConnectionInvalid,
                    'The selected provider connection could not be found.',
                ),
            );
        }

        $resolution = $this->connections->validateConnection($tenant, 'microsoft', $providerConnection);

        if (! $resolution->resolved || $resolution->connection === null) {
            throw ProviderConfigurationRequiredException::forTenant(
                tenant: $tenant,
                provider: 'microsoft',
                resolution: $resolution,
            );
        }

        return $this->gateway->graphOptions($resolution->connection, $overrides);
    }
}
