﻿using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace System.Web.Mvc
{
    /// <summary>
    /// 表示一个基于 JSON 的请求。
    /// </summary>
    public class MvcRequest : RequestBase
    {
        internal static readonly Type Type = typeof(MvcRequest);

        /*
         * Web 程序中，同一个地址下的所有Cookie均共用。
         * 包括以下两种情形：
         * 相同IP，不同虚拟目录（localhost:1234/abc的 Cookie 和 localhost:1234/efg 共用）
         * 相同IP，不同端口（localhost:1234/abc的 Cookie 和 localhost:4321/efg 共用）
         */

        private static string _MvcVerifyCodeHeaderName;
        /// <summary>
        /// 设置或获取唯一验证码的名称。
        /// </summary>
        public static string MvcVerifyCodeHeaderName
        {
            set
            {
                if(string.IsNullOrEmpty(_MvcVerifyCodeHeaderName)) return;
                _MvcVerifyCodeHeaderName = value;
            }
            get
            {
                if(_MvcVerifyCodeHeaderName == null) lock(Type) if(_MvcVerifyCodeHeaderName == null)
                            _MvcVerifyCodeHeaderName = "###VERIFYCODE###" + MvcClient.MapUrl("~/") + HttpContext.Current.Request.Url.Port;

                return _MvcVerifyCodeHeaderName;
            }
        }

        /// <summary>
        /// 获取请求的唯一验证码。
        /// </summary>
        public override string VerifyCode
        {
            get
            {
                return base[MvcVerifyCodeHeaderName];
            }
        }

        /// <summary>
        /// 客户端请求操作时发生。
        /// </summary>
        public static event MvcExecutingEventHandler Executing;

        internal static ActionResult OnExecuting(ActionExecutingContext filterContext, MvcRequest mvcRequest, bool allowAnonymous)
        {
            MvcClient.Request = mvcRequest;
            var handler = Executing;
            if(handler != null)
            {
                var e = new MvcExecutingEventArgs(mvcRequest, allowAnonymous);
                handler(filterContext, e);
                return e.Result;
            }
            return null;
        }

        /// <summary>
        /// 初始化 <see cref="System.Web.Mvc.MvcRequest"/> 类的新实例。
        /// </summary>
        public MvcRequest() { }
    }
}
