using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;
using System.Xml;
using CB.Common;
using CB.Data;
using CB.Entity;
using CB.TrendChart.FrequencyTrendChart;
using CB.TVUCenter.Config;
using CB.TVUCenter.Data;
using CB.TVUCenter.Entity;

namespace CB.TVTrendChartData
{
    /// <summary>
    /// 获取电视走势图数据API
    /// </summary>
    public class GetTrendChartAPI : IHttpHandler
    {

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        public void ProcessRequest(HttpContext context)
        {
            /**API请求必须包含data和sign两个参数。
            数据源格式:Uid="",Mac="",LotteryId="",ChartId="",Direction=""  
            排序后的数据:
            将数据源转换为字典(键值对,键和值都是字符串类型)形势存在,将字典排序,排序方式按字典(键)升序排序得到排序后的字典,再将排序后的字典转换成对应字符串,得到排序后的字符串如(LotteryId="",ChartId="",Direction="",Uid="",Mac="")
            data参数:将排序后的数据通过Key对字符串进行AES(AES加密算法与中心服务器一致)后再通过UrlEncode编码得到
            sign参数:将排序后的数据通过MD5加密算法得到**/

            string sign, data;

            string key;
            if (TVConfigs.GetConfig().Debug)
            {
                key = "E03F49114203ABCD"; //从config 获取
            }
            else
            {
                key = TVConfigs.GetConfig().DecryptKey;
            }

            sign = WRequest.GetString("sign");
            data = WRequest.GetString("data");  //data在前端通过UrlDecode编码

            string RealData = string.Empty;
            var DicData = new Dictionary<string, string>();  //Uid="",Mac="",LotteryId="",ChartId="",Direction=""


            //根据Key解密data
            try
            {
                RealData = TVUCenter.Encrypt.AES.Decrypt(data, key);

                if (!string.IsNullOrEmpty(RealData))
                {
                    foreach (var item in RealData.Split(','))
                    {
                        DicData.Add(item.Split(':')[0], item.Split(':')[1]);
                    }
                }
            }
            catch (Exception ex)
            {
                IsDebug(context, ex.Message);
                return;
            }

            //排序完成之后APP对应真实参数
            //var DicRealData = from realdata in DicData orderby realdata.Key  select realdata;

            string realUserName = DicData["Mac"];
            int LotteryId = DicData["LotteryId"].ToInt();
            int ChartId = DicData["ChartId"].ToInt();
            int Direction = DicData["Direction"].ToInt();

            if (CheckSign(sign, RealData, data, realUserName))
            {
                //验证成功显示走势图相关数据
                string resultData = GetTrendChartData(LotteryId, ChartId, Direction);
                if (!string.IsNullOrEmpty(resultData))
                {
                    context.Response.ContentType = "text/html";
                    context.Response.Write(resultData);
                }
                else
                {
                    IsDebug(context, "验证通过,走势图读取错误!");
                }
            }
            else
            {
                IsDebug(context, "验证失败,用户不合法!!");
            }
        }

        #region 常用方法及验证
        /// <summary>
        /// 验证
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="data"></param>
        /// <param name="sign"></param>
        /// <param name="realUserName"></param>
        /// <returns></returns>
        private static bool CheckSign(string sign, string RealData, string data, string realUserName)
        {
            if (sign == Utils.MD5(RealData))//根据Key解密
            {
                return !OnlineUsers.CheckUserLock(new OnlineUserInfo()
                {
                    UserName = realUserName,
                    Sign = data,
                    RequestTime = DateTime.Now
                });
            }
            return false;
        }
        #endregion

        #region 生成走势图数据和遗漏数据

        private string GetTrendChartData(int lotteryid, int chartid, int drection)
        {
            var chartInfo = CB.Data.Caches.GetTrendChartInfo(chartid);
            if (null == chartInfo)
                return "";

            var chartData = GetTrendChartData(chartInfo.Id);
            if(null==chartData)
                return "";

            var sp = new StringBuilder(10240);
            sp.Append("<tr class=\"miss\">");
            sp.Append("<td colspan=\"6\">出现次数</td>");
            foreach (var item in chartData.AllTimes)
            {
                if (item == "-1")
                    continue;
                foreach (var missvalue in item.Split(','))
                {
                    sp.Append(string.Format("<td>{0}</td>", missvalue));
                }
            }
            sp.Append("<td> </td><td> </td><td> </td><td> </td><td> </td></tr>");

            sp.Append("<tr class=\"miss\">");
            sp.Append("<td colspan=\"6\">平均遗漏</td>");
            foreach (var item in chartData.AllMaxMiss)
            {
                if (item == "-1")
                    continue;
                foreach (var missvalue in item.Split(','))
                {
                    sp.Append(string.Format("<td>{0}</td>", missvalue));
                }
            }
            sp.Append("<td> </td><td> </td><td> </td><td> </td><td> </td></tr>");

            sp.Append("<tr class=\"miss\">");
            sp.Append("<td colspan=\"6\">最大遗漏</td>");
            foreach (var item in chartData.AllMaxMiss)
            {
                if (item == "-1")
                    continue;
                foreach (var missvalue in item.Split(','))
                {
                    sp.Append(string.Format("<td>{0}</td>", missvalue));
                }
            }
            sp.Append("<td> </td><td> </td><td> </td><td> </td><td> </td></tr>");

            sp.Append("<tr class=\"miss\">");
            sp.Append("<td colspan=\"6\">当前遗漏</td>");
            foreach (var item in chartData.LocalMiss)
            {
                if (item == "-1")
                    continue;
                foreach (var missvalue in item.Split(','))
                {
                    sp.Append(string.Format("<td>{0}</td>", missvalue));
                }
            }
            sp.Append("<td> </td><td> </td><td> </td><td> </td><td> </td></tr>");

            var tags = new Dictionary<string, string>();
            tags.Add("<!--@@chartData-->", chartData.HtmlData);
            tags.Add("<!--@@missData-->", sp.ToString());

            return CB.Framework.WebPage.BuildTemplateData(chartInfo.TemplateId, tags);

            #region 已注释
            //string template;
            //TrendChartData resultData = GetWhiceTrendChart(chartid);

            //if (string.IsNullOrEmpty(template))
            //    return "";
            //if (resultData == null)
            //    return "";

            //#region 走势图数据
            //if (string.IsNullOrEmpty(resultData.HtmlData))
            //    return "";
            //string result = template.Replace("@@TrendChartData", resultData.HtmlData);
            //#endregion

            //#region 遗漏数据
            //StringBuilder sbAllTimes = new StringBuilder();
            //foreach (var item in resultData.AllTimes)
            //{
            //    if (item == "-1")
            //        continue;
            //    foreach (var missvalue in item.Split(','))
            //    {
            //        sbAllTimes.Append(string.Format("<td>{0}</td>", missvalue));
            //    }
            //}
            //result = result.Replace("@@TrendChartMissDataAllTimes", sbAllTimes.ToString());
            //StringBuilder sbAllAvgMiss = new StringBuilder();
            //foreach (var item in resultData.AllAvgMiss)
            //{
            //    if (item == "-1")
            //        continue;
            //    foreach (var missvalue in item.Split(','))
            //    {
            //        sbAllAvgMiss.Append(string.Format("<td>{0}</td>", missvalue));
            //    }
            //}
            //result = result.Replace("@@TrendChartMissDataAllAvgMiss", sbAllAvgMiss.ToString());
            //StringBuilder sbAllMaxMiss = new StringBuilder();
            //foreach (var item in resultData.AllMaxMiss)
            //{
            //    if (item == "-1")
            //        continue;
            //    foreach (var missvalue in item.Split(','))
            //    {
            //        sbAllMaxMiss.Append(string.Format("<td>{0}</td>", missvalue));
            //    }
            //}
            //result = result.Replace("@@TrendChartMissDataAllMaxMiss", sbAllMaxMiss.ToString());
            //StringBuilder sbLocalMiss = new StringBuilder();
            //foreach (var item in resultData.LocalMiss)
            //{
            //    if (item == "-1")
            //        continue;
            //    foreach (var missvalue in item.Split(','))
            //    {
            //        sbLocalMiss.Append(string.Format("<td>{0}</td>", missvalue));
            //    }
            //}
            //result = result.Replace("@@TrendChartMissDataLocalMiss", sbLocalMiss.ToString());
            //#endregion

            //return result;
            #endregion
        }

        /// <summary>
        /// 获取哪个走势图
        /// </summary>
        /// <param name="chartid"></param>
        /// <param name="chartType"></param>
        /// <param name="fields"></param>
        /// <returns></returns>
        private TrendChartData GetTrendChartData(int chartid, TrendChartType chartType = TrendChartType.TV, LotterySearchField fields = null)
        {
            switch (chartid)
            {
                case 342:     //四川快乐12
                    return KL12SiChuanTrend.PreViewTrendChart(chartid, chartType, null);
                default:
                    return null;
            }
        }

        #endregion

        #region 是否走Debug模式
        public void IsDebug(HttpContext context, string msg)
        {
            context.Response.ContentType = "text/plain";
            if (TVConfigs.GetConfig().Debug)
            {
                context.Response.StatusCode = 404;
                context.Response.Write("错误信息:" + msg);
            }
        }
        #endregion
    }
}