using Apewer.Network;
using System;
using System.Collections.Generic;
using System.Net;
using System.Reflection;

namespace Apewer.Web
{

    /// <summary>API 调用器。</summary>
    public class ApiInvoker
    {

        #region

        private static ApiInvoker _default = new ApiInvoker();

        /// <summary>默认调用器实例。</summary>
        public static ApiInvoker Default { get => _default; }

        #endregion

        object _locker = new object();
        bool _initialized = false;

        /// <summary>获取或设置要使用的 API 入口。</summary>
        public virtual ApiEntries Entries { get; set; }

        /// <summary>获取或设置 Logger。</summary>
        public virtual Logger Logger { get; set; }

        /// <summary>获取或设置选项。</summary>
        public virtual ApiOptions Options { get; set; }

        /// <summary>执行初始化程序,每个 ApiInvoker 实例仅执行一次初始化。</summary>
        public virtual void Initialize(Action action)
        {
            if (action == null) return;
            lock (_locker)
            {
                if (_initialized) return;
                action.Invoke();
                _initialized = true;
            }
        }

        /// <summary>发起调用。</summary>
        public virtual string Invoke(ApiProvider provider)
        {
            var entries = Entries;
            if (entries == null) entries = ApiEntries.AppDomain();
            Entries = entries;
            return Invoke(provider, entries);
        }

        /// <summary>发起调用。</summary>
        public string Invoke(ApiProvider provider, ApiEntries entries)
        {
            if (provider == null) return "未指定有效的服务程序。";
            if (entries == null) return "未指定有效的入口。";

            var processor = new ApiProcessor();
            processor.Invoker = this;
            processor.Entries = entries;
            processor.Provider = provider;
            return processor.Run();
        }

    }

}