using System;
using System.Collections.Generic;

using AIRuntime.Runtime.Agents;


namespace AIRuntime.Runtime.Agents.Runtime
{
    /// <summary>
    /// Runtime context for a single agent execution.
    /// Contains identity and execution restrictions.
    /// </summary>
    public sealed class AgentExecutionContext
    {
        private readonly IReadOnlyCollection<string> _allowedCapabilities;


        public AgentExecutionContext(
            AgentSession session)
        {
            if (session == null)
            {
                throw new ArgumentNullException(
                    nameof(session));
            }


            Session =
                session;


            Definition =
                session.Definition;


            _allowedCapabilities =
                Definition.Capabilities;
        }



        /// <summary>
        /// Active agent session.
        /// </summary>
        public AgentSession Session
        {
            get;
        }



        /// <summary>
        /// Agent configuration.
        /// </summary>
        public AgentDefinition Definition
        {
            get;
        }



        /// <summary>
        /// Agent identifier.
        /// </summary>
        public string AgentId
        {
            get
            {
                return Definition.Id;
            }
        }



        /// <summary>
        /// Unique execution session identifier.
        /// </summary>
        public string SessionId
        {
            get
            {
                return Session.SessionId;
            }
        }



        /// <summary>
        /// Capabilities this agent is allowed to use.
        /// </summary>
        public IReadOnlyCollection<string> AllowedCapabilities
        {
            get
            {
                return _allowedCapabilities;
            }
        }
    }
}
