using System;
using System.Collections.Generic;
namespace StellaOps.Auth.Abstractions;
/// 
/// Canonical scope names supported by StellaOps services.
/// 
public static class StellaOpsScopes
{
    /// 
    /// Scope required to trigger Concelier jobs.
    /// 
    public const string ConcelierJobsTrigger = "concelier.jobs.trigger";
    /// 
    /// Scope required to manage Concelier merge operations.
    /// 
    public const string ConcelierMerge = "concelier.merge";
    /// 
    /// Scope granting administrative access to Authority user management.
    /// 
    public const string AuthorityUsersManage = "authority.users.manage";
    /// 
    /// Scope granting administrative access to Authority client registrations.
    /// 
    public const string AuthorityClientsManage = "authority.clients.manage";
    /// 
    /// Scope granting read-only access to Authority audit logs.
    /// 
    public const string AuthorityAuditRead = "authority.audit.read";
    /// 
    /// Synthetic scope representing trusted network bypass.
    /// 
    public const string Bypass = "stellaops.bypass";
    /// 
    /// Scope granting read-only access to console UX features.
    /// 
    public const string UiRead = "ui.read";
    /// 
    /// Scope granting permission to approve exceptions.
    /// 
    public const string ExceptionsApprove = "exceptions:approve";
    /// 
    /// Scope granting read-only access to raw advisory ingestion data.
    /// 
    public const string AdvisoryRead = "advisory:read";
    /// 
    /// Scope granting write access for raw advisory ingestion.
    /// 
    public const string AdvisoryIngest = "advisory:ingest";
    /// 
    /// Scope granting read-only access to raw VEX ingestion data.
    /// 
    public const string VexRead = "vex:read";
    /// 
    /// Scope granting write access for raw VEX ingestion.
    /// 
    public const string VexIngest = "vex:ingest";
    /// 
    /// Scope granting permission to execute aggregation-only contract verification.
    /// 
    public const string AocVerify = "aoc:verify";
    /// 
    /// Scope granting read-only access to reachability signals.
    /// 
    public const string SignalsRead = "signals:read";
    /// 
    /// Scope granting permission to write reachability signals.
    /// 
    public const string SignalsWrite = "signals:write";
    /// 
    /// Scope granting administrative access to reachability signal ingestion.
    /// 
    public const string SignalsAdmin = "signals:admin";
    /// 
    /// Scope granting permission to create or edit policy drafts.
    /// 
    public const string PolicyWrite = "policy:write";
    /// 
    /// Scope granting permission to author Policy Studio workspaces.
    /// 
    public const string PolicyAuthor = "policy:author";
    /// 
    /// Scope granting permission to edit policy configurations.
    /// 
    public const string PolicyEdit = "policy:edit";
    /// 
    /// Scope granting read-only access to policy metadata.
    /// 
    public const string PolicyRead = "policy:read";
    /// 
    /// Scope granting permission to review Policy Studio drafts.
    /// 
    public const string PolicyReview = "policy:review";
    /// 
    /// Scope granting permission to submit drafts for review.
    /// 
    public const string PolicySubmit = "policy:submit";
    /// 
    /// Scope granting permission to approve or reject policies.
    /// 
    public const string PolicyApprove = "policy:approve";
    /// 
    /// Scope granting permission to operate Policy Studio promotions and runs.
    /// 
    public const string PolicyOperate = "policy:operate";
    /// 
    /// Scope granting permission to audit Policy Studio activity.
    /// 
    public const string PolicyAudit = "policy:audit";
    /// 
    /// Scope granting permission to trigger policy runs and activation workflows.
    /// 
    public const string PolicyRun = "policy:run";
    /// 
    /// Scope granting permission to activate policies.
    /// 
    public const string PolicyActivate = "policy:activate";
    /// 
    /// Scope granting read-only access to effective findings materialised by Policy Engine.
    /// 
    public const string FindingsRead = "findings:read";
    /// 
    /// Scope granting permission to run Policy Studio simulations.
    /// 
    public const string PolicySimulate = "policy:simulate";
    /// 
    /// Scope granted to Policy Engine service identity for writing effective findings.
    /// 
    public const string EffectiveWrite = "effective:write";
    /// 
    /// Scope granting read-only access to graph queries and overlays.
    /// 
    public const string GraphRead = "graph:read";
    /// 
    /// Scope granting read-only access to Vuln Explorer resources and permalinks.
    /// 
    public const string VulnRead = "vuln:read";
    /// 
    /// Scope granting read-only access to export center runs and bundles.
    /// 
    public const string ExportViewer = "export.viewer";
    /// 
    /// Scope granting permission to operate export center scheduling and run execution.
    /// 
    public const string ExportOperator = "export.operator";
    /// 
    /// Scope granting administrative control over export center retention, encryption keys, and scheduling policies.
    /// 
    public const string ExportAdmin = "export.admin";
    /// 
    /// Scope granting permission to enqueue or mutate graph build jobs.
    /// 
    public const string GraphWrite = "graph:write";
    /// 
    /// Scope granting permission to export graph artefacts (GraphML/JSONL/etc.).
    /// 
    public const string GraphExport = "graph:export";
    /// 
    /// Scope granting permission to trigger what-if simulations on graphs.
    /// 
    public const string GraphSimulate = "graph:simulate";
    /// 
    /// Scope granting read-only access to Orchestrator job state and telemetry.
    /// 
    public const string OrchRead = "orch:read";
    /// 
    /// Scope granting permission to execute Orchestrator control actions.
    /// 
    public const string OrchOperate = "orch:operate";
    /// 
    /// Scope granting read-only access to Authority tenant catalog APIs.
    /// 
    public const string AuthorityTenantsRead = "authority:tenants.read";
    private static readonly HashSet KnownScopes = new(StringComparer.OrdinalIgnoreCase)
    {
        ConcelierJobsTrigger,
        ConcelierMerge,
        AuthorityUsersManage,
        AuthorityClientsManage,
        AuthorityAuditRead,
        Bypass,
        UiRead,
        ExceptionsApprove,
        AdvisoryRead,
        AdvisoryIngest,
        VexRead,
        VexIngest,
        AocVerify,
        SignalsRead,
        SignalsWrite,
        SignalsAdmin,
        PolicyWrite,
        PolicyAuthor,
        PolicyEdit,
        PolicyRead,
        PolicyReview,
        PolicySubmit,
        PolicyApprove,
        PolicyOperate,
        PolicyAudit,
        PolicyRun,
        PolicyActivate,
        PolicySimulate,
        FindingsRead,
        EffectiveWrite,
        GraphRead,
        VulnRead,
        ExportViewer,
        ExportOperator,
        ExportAdmin,
        GraphWrite,
        GraphExport,
        GraphSimulate,
        OrchRead,
        OrchOperate,
        AuthorityTenantsRead
    };
    /// 
    /// Normalises a scope string (trim/convert to lower case).
    /// 
    /// Scope raw value.
    /// Normalised scope or null when the input is blank.
    public static string? Normalize(string? scope)
    {
        if (string.IsNullOrWhiteSpace(scope))
        {
            return null;
        }
        return scope.Trim().ToLowerInvariant();
    }
    /// 
    /// Checks whether the provided scope is registered as a built-in StellaOps scope.
    /// 
    public static bool IsKnown(string scope)
    {
        ArgumentNullException.ThrowIfNull(scope);
        return KnownScopes.Contains(scope);
    }
    /// 
    /// Returns the full set of built-in scopes.
    /// 
    public static IReadOnlyCollection All => KnownScopes;
}