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

namespace Apewer.Web
{

    /// <summary>API 服务程序。</summary>
    public abstract class ApiProvider : IDisposable
    {

        /// <summary>在调用 API 前,接收选项实例。</summary>
        public ApiOptions Options { get; set; }

        #region Implement

        /// <summary>调用前的检查,可返回错误信息以终止调用。</summary>
        public virtual string PreInvoke() { return null; }

        /// <summary>读取请求前的检查,可返回错误信息以忽略 POST 内容。</summary>
        public virtual string PreRead() { return null; }

        /// <summary>写入响应前的检查,可返回错误信息以终止输出。</summary>
        public virtual string PreWrite() { return null; }

        /// <summary>结束本次请求和响应。</summary>
        public virtual void End() { }

        /// <summary>释放非托管资源。</summary>
        public virtual void Dispose() { }

        #endregion

        #region Request

        /// <summary>获取 HTTP 方法。</summary>
        public abstract HttpMethod GetMethod();

        /// <summary>获取客户端的 IP 地址。</summary>
        public abstract string GetClientIP();

        /// <summary>获取请求的 URL。</summary>
        public abstract Uri GetUrl();

        /// <summary>获取请求的 Referrer。</summary>
        public abstract string GetReferrer();

        /// <summary>获取请求的头。</summary>
        public abstract StringPairs GetHeaders();

        /// <summary>获取请求的内容类型。</summary>
        public abstract string GetContentType();

        /// <summary>获取请求的内容长度。</summary>
        public abstract long GetContentLength();

        /// <summary>获取请求的内容。</summary>
        public abstract Stream RequestBody();

        #endregion

        #region Response

        /// <summary>设置 HTTP 状态。</summary>
        public abstract void SetStatus(string status);

        /// <summary>设置响应的头。</summary>
        public abstract string SetHeader(string name, string value);

        /// <summary>设置响应的缓存秒数,设置为 0 即不允许缓存。</summary>
        public abstract void SetCache(int seconds);

        /// <summary>设置响应的缓存秒数。</summary>
        public abstract void SetContentType(string value);

        /// <summary>设置响应的内容长度。</summary>
        public abstract void SetContentLength(long value);

        /// <summary>设置响应重定向。</summary>
        public abstract void SetRedirect(string location);

        /// <summary>获取 Response 流。</summary>
        public abstract Stream ResponseBody();

        #endregion

    }

}