<?php

namespace App\Support\Providers;

final class ProviderReasonCodes
{
    public const string ProviderConnectionMissing = 'provider_connection_missing';

    public const string ProviderConnectionInvalid = 'provider_connection_invalid';

    public const string ProviderCredentialMissing = 'provider_credential_missing';

    public const string ProviderCredentialInvalid = 'provider_credential_invalid';

    public const string ProviderConsentMissing = 'provider_consent_missing';

    public const string ProviderAuthFailed = 'provider_auth_failed';

    public const string ProviderPermissionMissing = 'provider_permission_missing';

    public const string ProviderPermissionDenied = 'provider_permission_denied';

    public const string ProviderPermissionRefreshFailed = 'provider_permission_refresh_failed';

    public const string IntuneRbacPermissionMissing = 'intune_rbac.permission_missing';

    public const string TenantTargetMismatch = 'tenant_target_mismatch';

    public const string NetworkUnreachable = 'network_unreachable';

    public const string RateLimited = 'rate_limited';

    public const string UnknownError = 'unknown_error';

    public const string IntuneRbacNotConfigured = 'intune_rbac.not_configured';

    public const string IntuneRbacUnhealthy = 'intune_rbac.unhealthy';

    public const string IntuneRbacStale = 'intune_rbac.stale';

    /**
     * @return array<int, string>
     */
    public static function all(): array
    {
        return [
            self::ProviderConnectionMissing,
            self::ProviderConnectionInvalid,
            self::ProviderCredentialMissing,
            self::ProviderCredentialInvalid,
            self::ProviderConsentMissing,
            self::ProviderAuthFailed,
            self::ProviderPermissionMissing,
            self::ProviderPermissionDenied,
            self::ProviderPermissionRefreshFailed,
            self::IntuneRbacPermissionMissing,
            self::TenantTargetMismatch,
            self::NetworkUnreachable,
            self::RateLimited,
            self::UnknownError,
            self::IntuneRbacNotConfigured,
            self::IntuneRbacUnhealthy,
            self::IntuneRbacStale,
        ];
    }

    public static function isKnown(string $reasonCode): bool
    {
        return in_array($reasonCode, self::all(), true) || str_starts_with($reasonCode, 'ext.');
    }
}
