using Apewer.Network;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Apewer.Web
{

    /// <summary></summary>
    public sealed class MiniProvider : ApiProvider<MiniContext>
    {

        MiniConnection connection;
        MiniContext context;
        MiniRequest request;
        MiniResponse response;

        /// <summary>HttpContext</summary>
        public override MiniContext Context { get => context; }

        /// <summary>创建服务程序实例。</summary>
        /// <exception cref="ArgumentNullException"></exception>
        public MiniProvider(MiniContext context)
        {
            if (context == null) throw new ArgumentNullException(nameof(context));
            this.context = context;
            connection = context.Connection;
            request = context.Request;
            response = context.Response;
        }

        /// <summary>发送完毕后执行。</summary>
        public override void Sent() => connection.Close();

        /// <summary>结束本次请求和响应。</summary>
        public override void End() => connection.Close(true);

        /// <summary>释放非托管资源。</summary>
        public override void Dispose() => connection.Close(true);

        #region request

        /// <summary></summary>
        public override string GetClientIP() => connection.RemoteEndPoint.Address.ToString();

        /// <summary></summary>
        public override long GetContentLength() => request.ContentLength;

        /// <summary></summary>
        public override string GetContentType() => request.Headers.GetValue("Content-Type");

        /// <summary></summary>
        public override HttpHeaders GetHeaders() => request.Headers;

        /// <summary></summary>
        public override HttpMethod GetMethod() => NetworkUtility.ParseHttpMethod(request.Method);

        /// <summary></summary>
        public override string GetReferrer() => request.Headers.GetValue("Referrer");

        /// <summary></summary>
        public override Uri GetUrl() => request.Url;

        /// <summary></summary>
        public override Stream RequestBody() => request.Body;

        #endregion

        #region response

        /// <summary></summary>
        public override void SetCache(int seconds)
        {
            if (seconds > 0)
            {
                SetHeader("Cache-Control", $"public, max-age={seconds}, s-maxage={seconds}");
                return;
            }

            SetHeader("Cache-Control", "no-cache, no-store, must-revalidate");
            SetHeader("Pragma", "no-cache");
        }

        /// <summary></summary>
        public override void SetContentLength(long value) => response.ContentLength = value;

        /// <summary></summary>
        public override void SetContentType(string value) => response.ContentType = value;

        /// <summary></summary>
        public override string SetHeader(string name, string value) => response.Headers[name] = value;

        /// <summary></summary>
        public override void SetRedirect(string location)
        {
            if (string.IsNullOrEmpty(location)) location = "/";
            response.Status = 302;
            response.Location = location;
            response.Close();
        }

        /// <summary></summary>
        public override void SetStatus(int status, int subStatus = 0) => response.Status = status;

        /// <summary></summary>
        public override Stream ResponseBody() => response.Body;

        #endregion

    }

}