using Common;
using Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Business.Util
{
   public static class LottryDataHandle
    {
        private static Dictionary<string, LotteryCode> MlotteryCode;
        static LottryDataHandle()
        {
            MlotteryCode = new Dictionary<string, LotteryCode>();
        }
        /// <summary>
        /// 东方6+1 转生肖
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        public static string GetSx(int num)
        {
            switch (num)
            {
                case 1:
                    return "鼠";
                case 2:
                    return "牛";
                case 3:
                    return "虎";
                case 4:
                    return "兔";
                case 5:
                    return "龙";
                case 6:
                    return "蛇";
                case 7:
                    return "马";
                case 8:
                    return "羊";
                case 9:
                    return "猴";
                case 10:
                    return "鸡";
                case 11:
                    return "狗";
                case 12:
                    return "猪";
                default:
                    return "";
            }
        }

        public static string GetJiJie(int num)
        {
            switch (num)
            {
                case 1: return "春";
                case 2: return "夏";
                case 3: return "秋";
                case 4: return "冬";
                default:
                    return "";
            }
        }
        public static string GetFangWei(int num)
        {
            switch (num)
            {
                case 1: return "东";
                case 2: return "南";
                case 3: return "西";
                case 4: return "北";
                default:
                    return "";
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="Typename">类型名</param>
        /// <param name="Term">期数</param>
        /// <param name="Opentime">开奖时间</param>
        /// <param name="OpenCode">开奖号</param>
        /// <param name="Detail">开奖详情没有传""或者null</param>
        /// <returns></returns>
        public static LotteryData GetLotteryData(string Typename, int Term, DateTime Opentime, string ID, IList<int> OpenCode, string Detail, string MenuName = "", string KaiJiHao = "", string ShiJiHao = "")
        {
            try
            {

                var lotteryCode = GetLotteryCode(Typename);
                OpenCode = OpenCode.Take(lotteryCode.BallCount).ToArray();
                LotteryData tmp = new LotteryData()
                {
                    Term = Term.ToString(),
                    OpenTime = Opentime.ToString(),
                    LotteryName = lotteryCode.LotteryName,
                    LotteryType = Typename,
                    MenuName = MenuName,
                    ID = ID,
                    KJTime=lotteryCode.KJTime,
                    StartHour=lotteryCode.StartHour,
                    StartMinute=lotteryCode.StartMinute,
                    Interval=lotteryCode.Interval,
                    SkipDate=lotteryCode.SkipDate,
                    KaiJiHao=KaiJiHao,
                    ShiJiHao=ShiJiHao,
                    DaXiaoZJZ=lotteryCode.DaXiaoZJZ,
                    LastTermOfLastYear=GetLastTermOfLastYear(lotteryCode.KJTime)

                };
                tmp.Details = new List<LotteryDetail>();
                //LotteryBallType datatype = EnumFunctionType.GetBallType(Typename);
                if (lotteryCode != null)
                {
                    if (Typename == SCCLottery.GP_KLPK3_ShanDong.ToString())//快乐扑克3单独处理
                    {
                        List<LotteryDetail> list = Getklpk3(OpenCode);
                        tmp.Details = list;
                    }
                    
                    else
                    {


                        tmp.BallCount = lotteryCode.BallCount;
                        tmp.RedBall = Array.ConvertAll<int, string>(OpenCode.Take(lotteryCode.RedCount).ToArray(), s => s.ToString());
                         if (lotteryCode.BlueCount > 0)
                        {
                            tmp.BlueBall = Array.ConvertAll<int, string>(OpenCode.Skip(lotteryCode.RedCount).ToArray(), s => s.ToString());
                        }

                        if (lotteryCode.BallCount > 1)
                        {
                            LotteryDetail hezhi = new LotteryDetail()
                            {
                                Label = "和值",
                                Value = LotteryUtils.GetSum(OpenCode.Take(lotteryCode.RedCount).ToList()).ToString()
                            };
                            tmp.Details.Add(hezhi);
                            LotteryDetail kuadu = new LotteryDetail()
                            {
                                Label = "跨度",
                                Value = LotteryUtils.GetSpan(OpenCode.Take(lotteryCode.RedCount).ToList()).ToString()
                            };
                            tmp.Details.Add(kuadu);
                            LotteryDetail jio = new LotteryDetail()
                            {
                                Label = "奇偶比",
                                Value = LotteryUtils.GetProportionOfJO(OpenCode.Take(lotteryCode.RedCount).ToList())
                            };
                            tmp.Details.Add(jio);
                            LotteryDetail zihebi = new LotteryDetail()
                            {
                                Label = "质合比",
                                Value = LotteryUtils.GetProportionOfZh(OpenCode)
                            };
                            tmp.Details.Add(zihebi);
                            LotteryDetail jioxt = new LotteryDetail()
                            {
                                Label = "奇偶形态",
                                Value = LotteryUtils.GetJOString(OpenCode)
                            };
                            tmp.Details.Add(jioxt);
                            LotteryDetail dxxt = new LotteryDetail()
                            {
                                Label = "大小形态",
                                Value = LotteryUtils.GetDXString(OpenCode, lotteryCode.DaXiaoZJZ)
                            };
                            tmp.Details.Add(dxxt);
                            LotteryDetail zotgsb = new LotteryDetail()
                            {
                                Label = "012路个数比",
                                Value = LotteryUtils.GetProportionOf012(OpenCode)
                            };
                            tmp.Details.Add(zotgsb);
                            LotteryDetail hzxt = new LotteryDetail()
                            {
                                Label = "和值特征",
                                //Value= LotteryUtils.ge()
                            };
                            if (Typename == SCCLottery.DF_DF6J1.ToString())//东方6+1篮球转生sw
                            {
                                int blueball = OpenCode.Skip(lotteryCode.RedCount).ToArray()[0];
                                tmp.BlueBall = new string[] { GetSx(blueball) };
                                // Array.ConvertAll<int, string>(OpenCode.Skip(datatype.RedCount).ToArray(), s => s.ToString());
                            }
                            if (Typename==SCCLottery.DF_HC1_GuangDong.ToString())
                            {

                                int shengxiao = OpenCode.Skip(lotteryCode.RedCount).ToArray()[0];
                                int jijie = OpenCode.Skip(lotteryCode.RedCount).ToArray()[1];
                                int fangxiang = OpenCode.Skip(lotteryCode.RedCount).ToArray()[2];
                                tmp.BlueBall = new string[] { GetSx(shengxiao),GetJiJie(jijie),GetFangWei(fangxiang) };
                            }
                        }

                    }
                }
                else
                {
                        tmp.BallCount = OpenCode.Count;
                        tmp.RedBall = Array.ConvertAll<int, string>(OpenCode.ToArray(), s => s.ToString());
                    // tmp.BlueBall = OpenCode.Skip(datatype.RedCount).ToArray();

                }
                //开奖号码补0
                if (OpenCode.Max()>=10&& Typename != SCCLottery.DF_HC1_GuangDong.ToString()&& Typename != SCCLottery.DF_DF6J1.ToString()&& Typename != SCCLottery.GP_KLPK3_ShanDong.ToString())
                {
                    if (tmp.RedBall!=null)
                    {
                        tmp.RedBall = tmp.RedBall.Select(w => w.PadLeft(2, '0')).ToArray();
                    }
                    if (tmp.BlueBall!=null)
                    {
                        tmp.BlueBall = tmp.BlueBall.Select(w => w.PadLeft(2, '0')).ToArray();
                    }
                   
                   
                }
                //要大小比的,要三区比的,要转生肖的,有开奖详情的,
                if (lotteryCode.SanQu>0)//EnumFunctionType.Sanqu.Contains(Typename)
                {
                    LotteryDetail sanqu = new LotteryDetail()
                    {
                        Label = "三区比",
                        Value = LotteryUtils.SsqSanQu(OpenCode.Take(6).ToList())//三区的目前只有双色球一个
                    };
                    tmp.Details.Add(sanqu);
                }
                //要大小比的
                if (lotteryCode.DataXiao>0)//EnumFunctionType.DaxiaoType.Contains(Typename)
                {
                    int takenum = lotteryCode.DaxiaoTake;//EnumFunctionType.GetDaXiaoTake(Typename);
                    if (takenum == 0)//无take
                    {
                        if (lotteryCode.DaXiaoCount==0)//EnumFunctionType.GetDaxiaoCount(Typename) == 0个数默认
                        {
                            LotteryDetail daxiao = new LotteryDetail()
                            {
                                Label = "大小比",
                                Value = LotteryUtils.GetProportionOfDX(OpenCode, lotteryCode.DaXiaoZJZ)
                            };
                            tmp.Details.Add(daxiao);
                        }
                        if (lotteryCode.DaXiaoCount> 0)//EnumFunctionType.GetDaxiaoCount(Typename) 指定个数
                        {
                            LotteryDetail daxiao = new LotteryDetail()
                            {
                                Label = "大小比",
                                Value = LotteryUtils.GetProportionOfDX(OpenCode, lotteryCode.DaXiaoZJZ,lotteryCode.DaXiaoCount)//EnumFunctionType.GetDaxiaoCount(Typename)EnumFunctionType.GetDaXiaoZJZ(Typename)
                            };
                            tmp.Details.Add(daxiao);
                        }
                    }
                    else //有take
                    {
                        if (lotteryCode.DaXiaoCount == 0)//EnumFunctionType.GetDaxiaoCount(Typename)个数默认
                        {
                            LotteryDetail daxiao = new LotteryDetail()
                            {
                                Label = "大小比",
                                Value = LotteryUtils.GetProportionOfDX(OpenCode.Take(takenum).ToList(),lotteryCode.DaXiaoZJZ )//EnumFunctionType.GetDaXiaoZJZ(Typename)
                            };
                            tmp.Details.Add(daxiao);
                        }
                        if ( lotteryCode.DaXiaoCount> 0)//EnumFunctionType.GetDaxiaoCount(Typename)指定个数
                        {
                            LotteryDetail daxiao = new LotteryDetail()
                            {
                                Label = "大小比",
                                Value = LotteryUtils.GetProportionOfDX(OpenCode.Take(takenum).ToList(),lotteryCode.DaXiaoZJZ,lotteryCode.DaXiaoCount )
                                //EnumFunctionType.GetDaXiaoZJZ(Typename), EnumFunctionType.GetDaxiaoCount(Typename)
                            };
                            tmp.Details.Add(daxiao);
                        }
                    }
                }
                if (!string.IsNullOrEmpty(Detail))//开奖详情内容
                {

                    var data = ToData<KaijiangDetailsEntity>(Detail);
                    if (data!=null)
                    {
                        if (!string.IsNullOrEmpty(data.Trje))
                        {
                            tmp.MoneyCount = data.Trje.Replace(",", "");
                        }
                        if (!string.IsNullOrEmpty(data.Gdje))
                        {
                            tmp.MoneyPond = data.Gdje.Replace(",", "");
                        }
                       // int takenum = EnumFunctionType.ContainDetailType.Contains(Typename) ? 1 : 2;
                        List < LotteryResults > list = new List<LotteryResults>();
                        if (data.KaiJiangItems!=null)
                        {
                            for (int i = 0; i < data.KaiJiangItems.Count; i++)
                            {
                                int couttotal = 0;
                                int.TryParse(data.KaiJiangItems[i].Total, out couttotal);
                                LotteryResults tmpresults = new LotteryResults() {
                                    LevelName=data.KaiJiangItems[i].Name,
                                    Count= couttotal,
                                    Money=data.KaiJiangItems[i].TotalMoney
                                };
                                list.Add(tmpresults);

                            }
                        }
                        tmp.ResultsList = list;

                        //List<LotteryResults> list = new List<LotteryResults>();
                        //if (Typename == "QGC_PL3" || Typename == "QGC_FC3D")
                        //{
                        //    list = EnumFunctionType.GetLotteryResultsP3(Detail);
                        //}
                        //else if (Typename == "QGC_PL5")
                        //{
                        //    list = EnumFunctionType.GetLotteryResultsP5(Detail);
                        //}
                        //else
                        //{

                        //    list = EnumFunctionType.GetLotteryResults(Detail, takenum);
                        //}
                    }
                     
                    //string[] results = Detail.Split(new char[] { '^', '|', ',' });

                    //tmp.MoneyCount = results[0];
                    //int moneyPond = 0;
                    //int.TryParse(results[1], out moneyPond);
                    //tmp.MoneyPond = moneyPond.ToString();

                }
                return tmp;
            }
            catch (Exception ee)
            {

                LogHelper.Error(typeof(LottryDataHandle), "GetLotteryData");
                return null;
            }
        }
        public static T ToData<T>(string obj)
        {
            try
            {
                return JsonConvert.DeserializeObject<T>(obj);
            }
            catch (Exception ee)
            {

                return default(T);
            }

        }

        /// <summary>
        /// 获取快乐扑克3
        /// </summary>
        /// <param name="OpenCode"></param>
        /// <returns></returns>
        public static List<LotteryDetail> Getklpk3(IList<int> OpenCode)
        {
            List<LotteryDetail> rtlist = new List<LotteryDetail>();
            string[] _pokerSuitName = new string[] { "", "fangpian", "meihua", "hongtao", "heitao" };
            foreach (var item in OpenCode)
            {
                LotteryDetail tmp = new LotteryDetail();

                var pkSuit = item / 100;
                var pknum = item % 100;
                var pkstr = pknum.ToString();
                if (pknum == 11) pkstr = "J";
                else if (pknum == 12) pkstr = "Q";
                else if (pknum == 13) pkstr = "K";
                else if (pknum == 1) pkstr = "A";
                tmp.Value = pkstr;
                tmp.Label = _pokerSuitName[pkSuit];
                rtlist.Add(tmp);
            }
            return rtlist;
        }

        public static List<LotteryDetail> GetHc1guangdong(IList<int> OpenCode)
        {
            List<LotteryDetail> rtlist = new List<LotteryDetail>();
           
            return rtlist;
        }
        public static LotteryCode GetLotteryCode(string lottertCode)
        {
            try
            {
                if (MlotteryCode.Keys.Count == 0)
                {
                    GetLotteryCodeList();
                }
                return MlotteryCode[lottertCode];
            }
            catch (Exception ee)
            {
                LogHelper.Error(typeof(LottryDataHandle), ee.Message + "GetLotteryCode");
                return null;
            }
        }
        public static  List<LotteryCode>  GetLotteryCode()
        {
            try
            {
                if (MlotteryCode.Keys.Count == 0)
                {
                    GetLotteryCodeList();
                }
                return MlotteryCode.Values.ToList();
            }
            catch (Exception ee)
            {
                LogHelper.Error(typeof(LottryDataHandle), ee.Message + "GetLotteryCodeoflist");
                return null;
            }
        }
        public static void GetLotteryCodeList()
        {
            try
            {
                string configFile = AppDomain.CurrentDomain.BaseDirectory + "/config/LotteryCode.xml";
                List<LotteryCode> configs = CommonHelper.ConvertXMLToObject<LotteryCode>(configFile, "CodeSettings");
                for (int i = 0; i < configs.Count; i++)
                {
                    MlotteryCode[configs[i].lotteryCode] = configs[i];
                }
            }
            catch (Exception ee)
            {
                LogHelper.Error(typeof(LottryDataHandle), ee.Message + "GetLotteryCodeList");
               

            }
            
        }



        /// <summary>
        /// 根据配置获取彩种去年的最后一期
        /// </summary>
        /// <param name="KJTime">配置中的KJTime项</param>
        /// <returns></returns>
        public static int GetLastTermOfLastYear(string KJTime)
        {
            try
            {
                var kjtime = KJTime.Split(',');
                DateTime time = DateTime.Now;
                int year = time.Year - 1;
                DateTime etime = new DateTime(year,12,31);
                DateTime stime = new DateTime(year, 1, 1);
                var tp = etime - stime;
                int caday = tp.Days;
                int  termcount = 0;
                for (int i = 0; i < caday; i++)
                {
                    stime = stime.AddDays(1);
                    if (kjtime.Contains(((int)stime.DayOfWeek).ToString()))
                    {
                        termcount += 1;
                    }
                }
                return termcount;
            }
            catch (Exception ee)
            {
                LogHelper.Error(typeof(LottryDataHandle), ee.Message + ":GetLastTermOfLastYear");
                return 0;
            }
        
        }
    }
}