using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using ChuPiao.AutoPrint.Machine.Models;
using ChuPiao.Common.Core.Utils;
using ChuPiao.Common.Enums;
using ChuPiao.Common.Models;

namespace ChuPiao.AutoPrint.Machine.TjJingCaiV1.MacLotPlayMode
{
    /// <summary>
    /// 竞彩足球混合过关
    /// </summary>
    public class MacLotPlayModeJzHhggService : MacLotPlayModeService
    {
        public MacLotPlayModeJzHhggService()
        {
            PlayFullName = "竞彩足球混合过关";
        }

        #region Overrides of MacLotPlayModeService

        /// <summary>
        /// 机器投注模式配置信息
        /// </summary>
        /// <summary>
        /// 获得投注需要发送的键码列表
        /// </summary>
        /// <param name="ticketEntity"></param>
        /// <param name="machineEntity"></param>
        /// <returns></returns>
        public override List<KeycodeInfo> GetSendKeycodeList(L_LotTicketEntity ticketEntity, M_MachineEntity machineEntity)
        {
            List<KeycodeInfo> keycodeList = new List<KeycodeInfo>();
            M_MachineModeConfigEntity machineModeConfig = machineEntity.MachineModeConfigs[ticketEntity.MacModeId];

            //初始化,每次都需要进入玩法的投注内容输入界面
            keycodeList.AddRange(GetInitKeycodeList(machineModeConfig));

            //投注号码
            List<JcCodeEntity> codeList = DealPrintCode(ticketEntity.L_Code);
            foreach (JcCodeEntity jcCodeEntity in codeList)
            {
                //进入场次选择界面
                //keycodeList.Add(new KeycodeInfo(WeekInitKey, machineModeConfig.C_SendKeyInterval));
                //选择场次
                for (int i = 0; i < jcCodeEntity.ChangCi.Length; i++)
                {
                    keycodeList.Add(new KeycodeInfo(jcCodeEntity.ChangCi.Substring(i, 1), machineModeConfig.C_SendKeyInterval));
                }
                //选择场次的玩法
                switch (jcCodeEntity.PlayId)
                {
                    case 91101:
                        //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval));
                        keycodeList.Add(new KeycodeInfo("6", machineModeConfig.C_SendKeyInterval));
                        break;
                    case 91102:
                        //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval));
                        keycodeList.Add(new KeycodeInfo("2", machineModeConfig.C_SendKeyInterval));
                        break;
                    case 91103:
                        //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval));
                        keycodeList.Add(new KeycodeInfo("3", machineModeConfig.C_SendKeyInterval));
                        break;
                    case 91104:
                        //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval));
                        keycodeList.Add(new KeycodeInfo("4", machineModeConfig.C_SendKeyInterval));
                        break;
                    case 91106:
                        //keycodeList.Add(new KeycodeInfo("5", machineModeConfig.C_SendKeyInterval));
                        keycodeList.Add(new KeycodeInfo("1", machineModeConfig.C_SendKeyInterval));
                        break;
                }


                //选择投注号码
                foreach (string s in jcCodeEntity.OneCodeList)
                {
                    keycodeList.Add(new KeycodeInfo(s, machineModeConfig.C_SendKeyInterval));
                }
                //投注号码确认
                keycodeList.Add(new KeycodeInfo(ResultEnterKey, machineModeConfig.C_SendKeyInterval));
            }

            //倍投
            if (ticketEntity.L_Mutiple > 1)
            {
                keycodeList.AddRange(GetMultipleKeycodeList(ticketEntity.L_Mutiple, machineModeConfig));
            }

            //过关方式
            keycodeList.AddRange(GetGuoGuanKeycodeList(ticketEntity.L_CodeType, machineModeConfig));

            //打印确认
            keycodeList.Add(new KeycodeInfo(machineModeConfig.C_PrintConfirmKey, machineModeConfig.C_PrintConfirmKeyInterval));

            //是否输入密码
            keycodeList.AddRange(GetPasswordKeycodeList(ticketEntity, machineEntity, machineModeConfig));

            return keycodeList;
        }

        /// <summary>
        /// 拆分投注号码
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        protected List<JcCodeEntity> DealPrintCode(string code)
        {
            List<JcCodeEntity> codeList = new List<JcCodeEntity>();
            string[] changCiCodeArr = code.Split(CodeSplitStr.ToCharArray()); //表示有多少场
            foreach (string changCiCode in changCiCodeArr)
            {
                JcCodeEntity jcCodeEntity = new JcCodeEntity();

                string[] arr = changCiCode.Split(MatchCodeSplitStr.ToCharArray());

                jcCodeEntity.ChangCi = arr[0];
                string[] arrPlayAndCode = arr[1].Split('[');
                jcCodeEntity.PlayId = int.Parse(arrPlayAndCode[0]);
                string s = arrPlayAndCode[1].Replace("]", "");

                string[] oneMatchCodeArr;
                switch (jcCodeEntity.PlayId)
                {
                    case 91106:
                    case 91101:
                        oneMatchCodeArr = s.Split(SplitStr.ToCharArray());
                        jcCodeEntity.OneCodeList.AddRange(oneMatchCodeArr);
                        break;
                    case 91102:
                        s = s.Replace("-", SplitStr);
                        oneMatchCodeArr = s.Split(SplitStr.ToCharArray());
                        foreach (string TmpStr_1 in oneMatchCodeArr)
                        {
                            switch (TmpStr_1)
                            {
                                case "胜其它":
                                    jcCodeEntity.OneCodeList.Add("9");
                                    jcCodeEntity.OneCodeList.Add("0");
                                    break;
                                case "平其它":
                                    jcCodeEntity.OneCodeList.Add("9");
                                    jcCodeEntity.OneCodeList.Add("9");
                                    break;
                                case "负其它":
                                    jcCodeEntity.OneCodeList.Add("0");
                                    jcCodeEntity.OneCodeList.Add("9");
                                    break;
                                default:
                                    jcCodeEntity.OneCodeList.AddRange(TmpStr_1.Split(':')); //去掉分号
                                    break;
                            }

                        }
                        break;
                    case 91103:
                        oneMatchCodeArr = s.Split(SplitStr.ToCharArray());
                        jcCodeEntity.OneCodeList.AddRange(oneMatchCodeArr);
                        break;
                    case 91104:
                        s = s.Replace("-", SplitStr);
                        oneMatchCodeArr = s.Split(SplitStr.ToCharArray());
                        jcCodeEntity.OneCodeList.AddRange(oneMatchCodeArr);
                        break;
                }

                codeList.Add(jcCodeEntity);
            }
            return codeList;

        }

        /// <summary>
        /// 电子票解析
        /// </summary>
        /// <param name="machineEntity"></param>
        /// <param name="decodePrintData"></param>
        /// <param name="ticketEntity"></param>
        public override void DecodeData(L_LotTicketEntity ticketEntity, M_MachineEntity machineEntity, DecodePrintData decodePrintData)
        {
            //M_MachineModeConfigEntity machineModeConfig = machineEntity.MachineModeConfigs[ticketEntity.MacModeId];

            //抓取的返回
            decodePrintData.L_PrintTicketEntity.P_PrnText = TicketTextUtil.CompressAndEncrypt(decodePrintData.InputData.CaptureDataBytes);
            //decodePrintData.L_PrintTicketEntity.P_SucTime = DateTime.Now;

            string input = decodePrintData.InputData.CaptureDataString;
            string strTemp;
            //票号、密码、期号解析
            bool suc = DecodeHeadJc(ticketEntity, machineEntity, decodePrintData);
            if (!suc)
            {
                decodePrintData.ErrorMessage = string.Format("头部解析错误:{0}", decodePrintData.ErrorMessage);
                decodePrintData.DecodeSuccess = false;
                return;
            }

            Regex regex;
            Match match;

            #region 投注号码及赔率
            List<string> dCodeList = new List<string>();
            List<string> dRateList = new List<string>();
            List<string> codeReferenceList = new List<string>(); //参考赔率
            //金额
            int startposition = input.IndexOf(decodePrintData.L_PrintTicketEntity.P_TicketCode) + 60;
            int endposition = input.IndexOf("本票最高可能固定奖金", startposition);
            strTemp = input.Substring(startposition, endposition - startposition);//包含投注内容的字符串

            string[] tmpArr = strTemp.Split('\n');//投注内容临时数组
            regex = new Regex(@"周(一|二|三|四|五|六|日)\d{3}\s{1,}(胜平负|让球胜平负|比分|总进球数|半全场胜平负)");
            string line;
            Regex regexRq = new Regex(@"让球:主[\+-]\d{1,}");
            Match matchRq;
            for (int i = 0; i < tmpArr.Length; i++)
            {
                line = tmpArr[i].Trim();
                match = regex.Match(line);
                if (match.Success)
                {
                    //解析让分,保存到参考赔率栏位  第3关  周六071 让球:主+1
                    string strRq = "主-0";
                    matchRq = regexRq.Match(line);
                    if (matchRq.Success)
                    {
                        strRq = matchRq.Value.Trim().Replace("让球:", "");
                    }

                    strTemp = match.Value;
                    strTemp = Regex.Replace(strTemp, @"\s{1,}", " ");
                    string[] arrChangCi = strTemp.Split(' ');
                    if (arrChangCi.Length != 2)
                    {
                        decodePrintData.ErrorMessage += string.Concat("解析赔率场次失败:", match.Value);
                        decodePrintData.DecodeSuccess = false;
                        return;
                    }
                    string strChangCi = DealChangChi(arrChangCi[0]);//场次字符串 如:第1关  周四002
                    int playIdOfRate = 0;
                    switch (arrChangCi[1])
                    {
                        case "胜平负":
                            playIdOfRate = 91106;
                            break;
                        case "让球胜平负":
                            playIdOfRate = 91101;
                            break;
                        case "比分":
                            playIdOfRate = 91102;
                            break;
                        case "总进球数":
                            playIdOfRate = 91103;
                            break;
                        case "半全场胜平负":
                            playIdOfRate = 91104;
                            break;
                    }

                    codeReferenceList.Add(string.Format("{0}{1}{2}[{3}]", strChangCi, MatchCodeSplitStr, playIdOfRate, strRq));//某一场次的让球数据

                    i++;//场次的下一行为球队名称 如:主队:莫斯科火车头 Vs 客队:毕尔巴鄂竞技

                    i++;//球队名称的下一行为投注内容与赔率 如:胜@2.540元
                    string tmpCodeStr = "";

                    //while (!new Regex(@"M\0!\0a\0").IsMatch(tmpArr[i]) && !new Regex(@"选项固定奖金额").IsMatch(tmpArr[i]))
                    //while (!new Regex(@"第\d{1,}关").IsMatch(tmpArr[i]) && !new Regex(@"选项固定奖金额").IsMatch(tmpArr[i]))   //2017-05-27 关改成场了
                    while (!new Regex(@"第\d{1,}(关|场)").IsMatch(tmpArr[i]) && !new Regex(@"选项固定奖金额").IsMatch(tmpArr[i]))
                    {
                        //投注内容可能有多行
                        if (tmpArr[i].IndexOf("@") > 0 || new Regex(@"\d{0,}.\d{1,}元").IsMatch(tmpArr[i]))     //有单独行   3.650元    .50元
                        {
                            tmpCodeStr += tmpArr[i].Trim();
                        }
                        i++;

                        if (i >= tmpArr.Length)
                        {
                            break;
                        }
                    }
                    i--;
                    //if (ticketEntity.L_RateType == (int)JcRateType.Fixed)
                    //{
                    dRateList.Add(string.Format("{0}{1}{2}[{3}]", strChangCi, MatchCodeSplitStr, playIdOfRate, DealRateCode(playIdOfRate, tmpCodeStr.Trim())));
                    //}
                    //else
                    //{
                    //    dCodeList.Add(string.Format("{0}{1}{2}[{3}]", strChangCi, MatchCodeSplitStr, playIdOfRate, DealResultCode(playIdOfRate,tmpCodeStr.Trim())));
                    //}
                }
            }
            decodePrintData.L_PrintTicketEntity.L_CodeReference = string.Join(CodeSplitStr, codeReferenceList.ToArray());//让球
            //解析组合过关的赔率
            decodePrintData.L_PrintTicketEntity.L_CodeRate = string.Join(CodeSplitStr, dRateList.ToArray());

            //投注内容
            decodePrintData.L_PrintTicketEntity.P_Code = SplitRateDetailToCode(decodePrintData.L_PrintTicketEntity.L_CodeRate);
            #endregion

            decodePrintData.DecodeSuccess = true;
        }

        /// <summary>
        /// 处理赔率明细
        /// </summary>
        /// <param name="Istr"></param>
        /// <returns></returns>
        private string DealRateCode(int playIdOfRate, string Istr)
        {
            string result = "";
            switch (playIdOfRate)
            {
                case 91106:
                case 91101:
                    result = DealRateCodeSpf(Istr);
                    break;
                case 91102:
                    result = DealRateCodeBf(Istr);
                    break;
                case 91103:
                    result = DealRateCodeZjq(Istr);
                    break;
                case 91104:
                    result = DealRateCodeBqc(Istr);
                    break;
            }
            return result;
        }
        /// <summary>
        /// 处理赔率明细
        /// </summary>
        /// <param name="Istr"></param>
        /// <returns></returns>
        private string DealRateCodeSpf(string Istr)
        {
            Istr = Regex.Replace(Istr, @"[^胜平负元@.+\d]{1}", "");

            string tmpstr = "";
            string OneStr = "";
            for (int i = 0; i < Istr.Length; i++)
            {
                OneStr = Istr.Substring(i, 1);
                switch (OneStr)
                {
                    case "+":
                        tmpstr += SplitStr;
                        break;
                    case "@":
                        tmpstr += "#";
                        break;
                    case "胜":
                        tmpstr += "3";
                        break;
                    case "平":
                        tmpstr += "1";
                        break;
                    case "负":
                        tmpstr += "0";
                        break;
                    case "元":
                        break;
                    default:
                        tmpstr += OneStr;
                        break;
                }
            }
            //电子票上的赔率明细字符串 如:2#4.700,1#1.080 排序输出为 1#1.080,2#4.700  使其与用户投注号码的排序相同
            tmpstr = SortRateText(CODE_SORT_DIECTIONRY_SPF, tmpstr);
            return tmpstr;
        }
        /// <summary>
        /// 处理赔率明细
        /// </summary>
        /// <param name="Istr"></param>
        /// <returns></returns>
        private string DealRateCodeBf(string Istr)
        {
            Istr = Regex.Replace(Istr, @"[^():胜平负其它元@.+\d]{1}", "");

            string tmpstr = "";
            string OneStr = "";
            for (int i = 0; i < Istr.Length; i++)
            {
                OneStr = Istr.Substring(i, 1);
                switch (OneStr)
                {
                    case "+":
                        tmpstr += SplitStr;
                        break;
                    case "@":
                        tmpstr += "#";
                        break;
                    case "(":
                    case ")":
                    case "元":
                        break;
                    default:
                        tmpstr += OneStr;
                        break;
                }
            }
            //电子票上的赔率明细字符串 如:2#4.700,1#1.080 排序输出为 1#1.080,2#4.700  使其与用户投注号码的排序相同
            tmpstr = SortRateText(CODE_SORT_DIECTIONRY_BF, tmpstr);
            return tmpstr;
        }


        /// <summary>
        /// 处理赔率明细
        /// </summary>
        /// <param name="Istr"></param>
        /// <returns></returns>
        private string DealRateCodeZjq(string Istr)
        {
            Istr = Regex.Replace(Istr, @"[^()元@.+\d]{1}", "");

            string tmpstr = "";
            string OneStr = "";
            Istr = Istr.Replace("7+", "7");
            for (int i = 0; i < Istr.Length; i++)
            {
                OneStr = Istr.Substring(i, 1);
                switch (OneStr)
                {
                    case "+":
                        tmpstr += SplitStr;
                        break;
                    case "@":
                        tmpstr += "#";
                        break;
                    case "(":
                    case ")":
                    case "元":
                        break;
                    default:
                        tmpstr += OneStr;
                        break;
                }
            }
            //电子票上的赔率明细字符串 如:2#4.700,1#1.080 排序输出为 1#1.080,2#4.700  使其与用户投注号码的排序相同
            tmpstr = SortRateText(CODE_SORT_DIECTIONRY_ZJQ, tmpstr);
            return tmpstr;
        }

        /// <summary>
        /// 处理赔率明细
        /// </summary>
        /// <param name="Istr"></param>
        /// <returns></returns>
        private string DealRateCodeBqc(string Istr)
        {
            Istr = Regex.Replace(Istr, @"[^()胜平负元@.+\d]{1}", "");

            string tmpstr = "";
            string OneStr = "";
            Istr = Istr.Replace("7+", "7");
            for (int i = 0; i < Istr.Length; i++)
            {
                OneStr = Istr.Substring(i, 1);
                switch (OneStr)
                {
                    case "+":
                        tmpstr += SplitStr;
                        break;
                    case "@":
                        tmpstr += "#";
                        break;
                    case "(":
                    case ")":
                    case "元":
                        break;
                    case "胜":
                        tmpstr += "3-";
                        break;
                    case "平":
                        tmpstr += "1-";
                        break;
                    case "负":
                        tmpstr += "0-";
                        break;
                    default:
                        tmpstr += OneStr;
                        break;
                }
            }

            tmpstr = tmpstr.Replace("-#", "#");


            //电子票上的赔率明细字符串 如:2#4.700,1#1.080 排序输出为 1#1.080,2#4.700  使其与用户投注号码的排序相同
            tmpstr = SortRateText(CODE_SORT_DIECTIONRY_BQC, tmpstr);
            return tmpstr;
        }


        //号码排序字典 3 表示胜  1 表示平 0 表示负
        private const string CODE_SORT_DIECTIONRY_SPF = "3,1,0";
        //号码排序字典 
        private const string CODE_SORT_DIECTIONRY_BF = "1:0,2:0,2:1,3:0,3:1,3:2,4:0,4:1,4:2,5:0,5:1,5:2,胜其它,0:0,1:1,2:2,3:3,平其它,0:1,0:2,1:2,0:3,1:3,2:3,0:4,1:4,2:4,0:5,1:5,2:5,负其它";

        //号码排序字典 1 表示胜  2 表示负
        private const string CODE_SORT_DIECTIONRY_ZJQ = "0,1,2,3,4,5,6,7";

        //号码排序字典 1 表示胜  2 表示负
        private const string CODE_SORT_DIECTIONRY_BQC = "3-3,3-1,3-0,1-3,1-1,1-0,0-3,0-1,0-0";

        #endregion
    }
}