using Apewer.Network;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Text;

namespace Apewer.Web
{

    /// <summary>API 上下文。</summary>
    public sealed class ApiContext
    {

        #region 构造参数

        private ApiInvoker _invoker = null;
        private ApiProvider _provider = null;
        private ApiEntries _entries = null;

        private DateTime _beginning = DateTime.Now;
        private ApiOptions _options = null;

        /// <summary>此上下文启动的时间。</summary>
        public DateTime Beginning { get => _beginning; }

        /// <summary>API 调用器。</summary>
        public ApiInvoker Invoker { get => _invoker; }

        /// <summary>API 提供程序。</summary>
        public ApiProvider Provider { get => _provider; }

        /// <summary>API 入口集。</summary>
        public ApiEntries Entries { get => _entries; }

        /// <summary>API 选项。</summary>
        public ApiOptions Options { get => _options; }

        #endregion

        #region 执行过程中产生的内容

        /// <summary>API 行为。</summary>
        public ApiAction ApiAction { get; internal set; }

        /// <summary>API 请求。</summary>
        public ApiRequest Request { get; internal set; }

        /// <summary>API 响应。</summary>
        public ApiResponse Response { get; internal set; }

        /// <summary>API 控制器实例。</summary>
        public ApiController Controller { get; internal set; }

        /// <summary>执行的方法。</summary>
        public MethodInfo MethodInfo { get; internal set; }

        #endregion

        internal ApiContext(ApiInvoker invoker, ApiProvider provider, ApiEntries entries)
        {
            if (invoker == null) throw new ArgumentNullException(nameof(invoker));
            if (provider == null) throw new ArgumentNullException(nameof(provider));
            if (entries == null) throw new ArgumentNullException(nameof(entries));

            _invoker = invoker;
            _provider = provider;
            _entries = entries;

            _options = invoker.Options ?? new ApiOptions();

        }

    }

}