using System;
using System.Collections.Generic;

namespace PolyTrader.Core.Agents
{
    /// <summary>Wird geworfen, wenn ein Agent ein nicht freigegebenes Tool aufruft.</summary>
    public sealed class ToolAccessDeniedException : Exception
    {
        public ToolAccessDeniedException(string toolName)
            : base($"Zugriff auf Tool '{toolName}' ist für diesen Agenten/dieses Profil nicht erlaubt.")
        {
        }
    }

    /// <summary>
    /// Erzwungene Tool-Allow-List (aus ClawdDotNet übernommen): Defense-in-Depth gegen Modell-Fehlgriffe.
    /// Eine <c>null</c>-Allow-List bedeutet „alle Tools erlaubt" (deckt sich mit einem Profil ohne Filter).
    /// Der Abgleich ist case-insensitiv.
    /// </summary>
    public sealed class PermissionGate
    {
        public bool IsAllowed(string toolName, IReadOnlyCollection<string>? allowedTools)
        {
            if (allowedTools == null) return true;
            foreach (var t in allowedTools)
                if (string.Equals(t, toolName, StringComparison.OrdinalIgnoreCase))
                    return true;
            return false;
        }

        public void Enforce(string toolName, IReadOnlyCollection<string>? allowedTools)
        {
            if (!IsAllowed(toolName, allowedTools))
                throw new ToolAccessDeniedException(toolName);
        }
    }
}
