using System;
using System.Text;
using UnityEngine;
using System.Linq;
using System.Xml.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using System.Text.RegularExpressions;
using System.IO;
using LitJson;
/// 
/// UI辅助类
/// 
public static class UIHelper
{
    public static readonly string no_breaking_space = "\u00A0"; //Text文本框输入空格自动换行问题 替换编码
    //不需要提取翻译的文本
    private static readonly string[] numbers = new string[] { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
    private static readonly string[] units = new string[] { "十", "百", "千", "万" };
    //数字转中文(只做小数字),海外版本调用改函数切换版本请直接返回数字
    public static string ChineseNumber(int number)
    {
        if (number == 0)
            return numbers[0];
        string result = "";
        int unitPlace = 1; // 位数,1 表示十位,2 表示百位,3 表示千位,4 表示万位
        bool needZero = false; // 是否需要添加 '零'
        while (number > 0)
        {
            int part = number % 10;
            if (part != 0)
            {
                if (needZero)
                    result = StringUtility.Contact(numbers[0] + result);
                result = numbers[part] + (unitPlace == 1 ? "" : units[unitPlace - 2]) + result; // 单位只在十、百、千、万内部使用
                needZero = false;
            }
            else
            {
                needZero = true;
            }
            number /= 10;
            unitPlace++;
        }
        if (result.StartsWith("一十"))
        {
            result = result.Substring(1);
        }
        if (result.EndsWith("零"))
        {
            result = result.Replace("零", "");
        }
        return result;
    }
    #region UI通用
    public static void SetIconWithMoneyType(this Image _image, int moneyType)
    {
        if (_image == null) return;
        string iconKey = StringUtility.Contact("Money_Type_", moneyType);
        _image.SetSprite(iconKey);
    }
    public static void SetSmallIconWithMoneyType(this Image _image, int moneyType)
    {
        if (_image == null) return;
        string iconKey = StringUtility.Contact("SmallMoney", moneyType);
        _image.SetSprite(iconKey);
    }
    /// 
    /// 分离字符串插入空格
    /// 
    public static string GetSuitNameByName(string attrName)
    {
        string suitStr = "";
        for (int i = 0; i < attrName.Length; i++)
        {
            if (i != attrName.Length - 1)
            {
                if (attrName.Length == 2)
                {
                    suitStr = StringUtility.Contact(suitStr, attrName[i], "        ");
                }
                else if (attrName.Length == 3)
                {
                    suitStr = StringUtility.Contact(suitStr, attrName[i], "  ");
                }
                else
                {
                    suitStr = StringUtility.Contact(suitStr, attrName[i]);
                }
            }
            else
            {
                suitStr = StringUtility.Contact(suitStr, attrName[i]);
            }
        }
        return suitStr;
    }
    // 基于itemColor 下,ColorEx做二级区分
    public static void SetItemBackGround(this Image _image, int itemColor, int ColorEx = 0)
    {
        if (_image == null)
        {
            return;
        }
        _image.SetSprite(string.Format("Common_Public_ItemColor{0}{1}", itemColor, ColorEx));
    }
    /// 
    /// 剩余时间
    /// 
    /// 格式 年-月-日 小时:分钟:秒
    /// 毫秒
    /// 
    private static Regex TimeRegex = new Regex(@"([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+):([0-9]+)", RegexOptions.Singleline);
    public static int GetSurplusSeconds(string startTime, int seconds)
    {
        string start = GetTime(startTime);
        if (start.Equals(string.Empty))
        {
            return 0;
        }
        DateTime s = Convert.ToDateTime(start);
        DateTime t = s.AddTicks(seconds * TimeSpan.TicksPerSecond);
        DateTime n = TimeUtility.ServerNow;
        TimeSpan span = t - n;
        return Mathf.Max(0, (int)span.TotalSeconds);
    }
    public static string GetTime(string startTime)
    {
        if (!TimeRegex.IsMatch(startTime))
        {
            return string.Empty;
        }
        Match match = TimeRegex.Match(startTime);
        int year = int.Parse(match.Groups[1].Value);
        int month = int.Parse(match.Groups[2].Value);
        int day = int.Parse(match.Groups[3].Value);
        int h = int.Parse(match.Groups[4].Value);
        int mi = int.Parse(match.Groups[5].Value);
        int sc = int.Parse(match.Groups[6].Value);
        return string.Format("{0}-{1}-{2} {3}:{4}:{5}", year, month, day, h, mi, sc);
    }
    /// 
    /// 获取消逝的时间
    /// 
    /// 
    /// 
    public static string GetFadeTime(uint lastTime)
    {
        DateTime n = TimeUtility.ServerNow;
        TimeSpan span = n - TimeUtility.GetTime(lastTime);
        if (span.TotalDays > 1) return Math.Floor(span.TotalDays) + Language.Get("L1074");
        else if (span.TotalHours > 1) return Math.Floor(span.TotalHours) + Language.Get("L1072");
        else if (span.TotalMinutes > 1) return Math.Floor(span.TotalMinutes) + Language.Get("L1073");
        else return 1 + Language.Get("L1073");
    }
    /// 
    /// 根据属性获取玩家数据
    /// 
    /// 
    /// 
    public static ulong GetPropertyValue(PropertyType type)
    {
        switch (type)
        {
            case PropertyType.LV:
                return PlayerDatas.Instance.baseData.LV;
            case PropertyType.POWER:
                return (ulong)PlayerDatas.Instance.baseData.STR;
            case PropertyType.AGILITY:
                return (ulong)PlayerDatas.Instance.baseData.PHY;
            case PropertyType.PHYSIQUE:
                return (ulong)PlayerDatas.Instance.baseData.CON;
            case PropertyType.MENTALITY:
                return (ulong)PlayerDatas.Instance.baseData.PNE;
            case PropertyType.HP:
                return PlayerDatas.Instance.extersion.MaxHP;
            case PropertyType.ATK:
                return (ulong)PlayerDatas.Instance.extersion.MAXATK;
            case PropertyType.DEF:
                return (ulong)PlayerDatas.Instance.extersion.DEF;
            case PropertyType.HIT:
                return (ulong)PlayerDatas.Instance.extersion.HIT;
            case PropertyType.MISS:
                return (ulong)PlayerDatas.Instance.extersion.Miss;
            case PropertyType.ATKSPEED:
                return (ulong)PlayerDatas.Instance.extersion.battleValEx1;
            case PropertyType.CritChance:
                return (ulong)PlayerDatas.Instance.extersion.SuperHitRate;
            case PropertyType.CritHurt:
                return (ulong)PlayerDatas.Instance.extersion.SuperHit;
            case PropertyType.CritResis:
                return (ulong)PlayerDatas.Instance.extersion.SuperHitReduce;
            case PropertyType.HeartHit:
                return (ulong)PlayerDatas.Instance.extersion.luckHitRate;
            case PropertyType.HeartHurt:
                return (ulong)PlayerDatas.Instance.extersion.luckHitVal;
            case PropertyType.HeartResis:
                return (ulong)PlayerDatas.Instance.extersion.LuckyHitRateReduce;
            case PropertyType.SkillHurt:
                return (ulong)PlayerDatas.Instance.extersion.SkillAtkRate;
            case PropertyType.PVPAddHurt:
                return (ulong)PlayerDatas.Instance.extersion.DamagePVP;
            case PropertyType.PVPReduceHurt:
                return PlayerDatas.Instance.GetPlayerDataByType((PlayerDataType)191);
            case PropertyType.LifeReply:
                return (ulong)PlayerDatas.Instance.extersion.HPRestorePer;
            case PropertyType.HurtReflect:
                return (ulong)PlayerDatas.Instance.extersion.DamageBackRate;
            case PropertyType.MoveSpeed:
                return (ulong)PlayerDatas.Instance.extersion.SpeedValue;
            case PropertyType.PetAddHurt:
                return (ulong)PlayerDatas.Instance.extersion.PetDamPer;
            case PropertyType.RealHurt:
                return (ulong)PlayerDatas.Instance.extersion.realATK;
            case PropertyType.RealResis:
                return (ulong)PlayerDatas.Instance.extersion.realDEF;
            case PropertyType.DefyDef:
                return (ulong)PlayerDatas.Instance.extersion.IgnoreDefRate;
            case PropertyType.DefyDefResis:
                return (ulong)PlayerDatas.Instance.extersion.IgnoreDefRateReduce;
            case PropertyType.DefChance:
                return (ulong)PlayerDatas.Instance.extersion.DamChanceDef;
            case PropertyType.BloodHurt:
                return (ulong)PlayerDatas.Instance.extersion.BleedDamage;
            case PropertyType.AktReplyBlood:
                return (ulong)PlayerDatas.Instance.extersion.BattleValEx2;
            case PropertyType.Stun:
                return (ulong)PlayerDatas.Instance.extersion.FaintRate;
            case PropertyType.CtrlResis:
                return (ulong)PlayerDatas.Instance.extersion.FaintDefRate;
            case PropertyType.AddFinalHurt:
                return (ulong)PlayerDatas.Instance.extersion.FinalHurt;
            case PropertyType.ReduceFinalHurt:
                return (ulong)PlayerDatas.Instance.extersion.FinalHurtReduce;
            case PropertyType.PVPAddHurtPer:
                return (ulong)PlayerDatas.Instance.extersion.DamagePerPVP;
            case PropertyType.PVPReduceHurtPer:
                return (ulong)PlayerDatas.Instance.extersion.DamagePerPVPReduce;
            case PropertyType.DleHitChance:
                return (ulong)PlayerDatas.Instance.extersion.ComboDamPerRate;
            case PropertyType.DleHurt:
                return (ulong)PlayerDatas.Instance.extersion.ComboDamPer;
            case PropertyType.ReduceSkillHurtPercent:
                return (ulong)PlayerDatas.Instance.extersion.skillAtkRateReduce;
            case PropertyType.NpcHurtAddPer:
                return (ulong)PlayerDatas.Instance.extersion.NpcHurtAddPer;
            case PropertyType.Luck:
                return (ulong)PlayerDatas.Instance.extersion.luckValue;
            case PropertyType.Mater:
                return (ulong)PlayerDatas.Instance.baseData.mater;
            case PropertyType.Wood:
                return (ulong)PlayerDatas.Instance.baseData.wood;
            case PropertyType.Water:
                return (ulong)PlayerDatas.Instance.baseData.water;
            case PropertyType.Fire:
                return (ulong)PlayerDatas.Instance.baseData.fire;
            case PropertyType.Earth:
                return (ulong)PlayerDatas.Instance.baseData.earth;
            case PropertyType.ReduceCrit:
                return (ulong)PlayerDatas.Instance.baseData.reduceCrit;
            case PropertyType.ReduceHeartHurtPer:
                return (ulong)PlayerDatas.Instance.baseData.reduceHeartHurt;
            case PropertyType.ReduceFinalHurtPer:
                return (ulong)PlayerDatas.Instance.baseData.reduceFinalHurt;
            case PropertyType.AtkPercent:
            case PropertyType.CritHurtPercent:
            case PropertyType.DodgePercent:
                // return (ulong)ModelCenter.Instance.GetModel().GetReikiPropertyValue((int)type);
                // TODO YYL
                return 0ul;
            case PropertyType.SkillAddPerA:
                return (ulong)PlayerDatas.Instance.baseData.skillAddPerA;
            case PropertyType.SkillAddPerB:
                return (ulong)PlayerDatas.Instance.baseData.skillAddPerB;
            case PropertyType.SkillAddPerC:
                return (ulong)PlayerDatas.Instance.baseData.skillAddPerC;
            case PropertyType.SkillAddPerD:
                return (ulong)PlayerDatas.Instance.baseData.skillAddPerD;
            case PropertyType.SkillAddPerE:
                return (ulong)PlayerDatas.Instance.baseData.skillAddPerE;
            case PropertyType.SkillAddPerF:
                return (ulong)PlayerDatas.Instance.baseData.skillAddPerF;
            case PropertyType.SkillAddPerG:
                return (ulong)PlayerDatas.Instance.baseData.skillAddPerG;
            case PropertyType.SkillReducePerA:
                return (ulong)PlayerDatas.Instance.baseData.skillReducePerA;
            case PropertyType.SkillReducePerB:
                return (ulong)PlayerDatas.Instance.baseData.skillReducePerB;
            case PropertyType.SkillReducePerC:
                return (ulong)PlayerDatas.Instance.baseData.skillReducePerC;
            case PropertyType.SkillReducePerD:
                return (ulong)PlayerDatas.Instance.baseData.skillReducePerD;
            case PropertyType.SkillReducePerE:
                return (ulong)PlayerDatas.Instance.baseData.skillReducePerE;
            case PropertyType.SkillReducePerF:
                return (ulong)PlayerDatas.Instance.baseData.skillReducePerF;
            case PropertyType.SkillReducePerG:
                return (ulong)PlayerDatas.Instance.baseData.skillReducePerG;
            case PropertyType.ReduceSkillCDPer:
                return (ulong)PlayerDatas.Instance.extersion.battleValEx3;
            case PropertyType.AddFinalHurtPer:
                return (ulong)PlayerDatas.Instance.extersion.FunalHurtPer;
            case PropertyType.AddNormalHurt:
                return (ulong)PlayerDatas.Instance.baseData.NormalHurt;
            case PropertyType.AddNormalHurtPer:
                return (ulong)PlayerDatas.Instance.baseData.NormalHurtPer;
            case PropertyType.AddSkillHurt:
                return (ulong)PlayerDatas.Instance.baseData.FabaoHurt;
            case PropertyType.AddSkillHurtPer:
                return (ulong)PlayerDatas.Instance.baseData.FabaoHurtPer;
            case PropertyType.AddPVEHurt:
                return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.DamagePVE);
        }
        return 0;
    }
    /// 
    /// 换行
    /// 
    /// 
    /// 
    private static Regex NewLineRegex = new Regex(@"", RegexOptions.Singleline);
    public static string ReplaceNewLine(string val)
    {
        return val.Replace(@"", "\n");
    }
    public static double numto2Decimals(double value)
    {
        //为什么要value * 1000/10 这么写,特殊的数字会有问题,比如36.80000,会(int)(value * 100)被计算为3679
        //测试下只有30几点8000的才会这样
        return (int)(value * 1000 / 10) / 100.00;
    }
    /// 
    /// 大数值转化 格式 最多两个小数
    /// K -千,M -百萬,B-十億,T -萬億
    /// 不四舍五入,不用Math.Round,因为当玩家只有23.3456,但是Math.Round会显示23.35, 当购买价格为23.35时无法购买的
    /// 
    public static string ReplaceLargeNum(double num)
    {
        const long K = 10000;    //国内为万,海外为千
        const long M = K * 10000;
        const long B = M * 10000;
        const long T = B * 10000;
        if (num >= T)
        {
            return  StringUtility.Contact(numto2Decimals(num / T).ToString("0.##"), Language.Get("L1070_0"));
        }
        else if (num >= B)
        {
            return StringUtility.Contact(numto2Decimals(num / B).ToString("0.##"), Language.Get("L1070_1"));
        }
        else if (num >= M)
        {
            return StringUtility.Contact(numto2Decimals(num / M).ToString("0.##"), Language.Get("L1070"));
        }
        else if (num >= K)
        {
            return StringUtility.Contact(numto2Decimals(num / K).ToString("0.##"), Language.Get("L1071"));
        }
        else
        {
            return numto2Decimals(num).ToString("0.##");
        }
    }
    //用于美术字 统一用字母KMBT代表使用,小数点用.
    public static string ReplaceLargeArtNum(double num)
    {
        const long K = 10000;    //国内为万,海外为千
        const long M = K * 10000;
        const long B = M * 10000;
        const long T = B * 10000;
        if (num >= T)
        {
            return StringUtility.Contact(numto2Decimals(num / T).ToString("0.##"), "t");
        }
        else if (num >= B)
        {
            return StringUtility.Contact(numto2Decimals(num / B).ToString("0.##"), "b");
        }
        else if (num >= M)
        {
            return StringUtility.Contact(numto2Decimals(num / M).ToString("0.##"),"m");
        }
        else if (num >= K)
        {
            return StringUtility.Contact(numto2Decimals(num / K).ToString("0.##"), "k");
        }
        else
        {
            return numto2Decimals(num).ToString("0.##");
        }
    }
    // 转化大数值带单位的显示,如果小于200000则显示原值,否则显示大数值
    public static string ReplaceLargeNumEx(double num)
    {
        if (num < 200000)
        {
            //根据界面的显示假定值 200000,可根据实际情况调整
            return GetNumFormat(num);
        }
        else
        {
            return ReplaceLargeNum(num);
        }
    }
    //显示最多两位小数,并按地区显示格式
    // 如中文用F2 显示 1111.34,英文用N2 显示 1,111.34(带逗号)
    public static string GetNumFormat(double num)
    {
        if (num == (int)num)
        {
            return num.ToString("F0");
        }
        return num.ToString("F2").TrimEnd('0').TrimEnd('.');
    }
    public static float ReplacePercentage(float num, int isPer, int decimals = 1)
    {
        if (isPer == 1 || isPer == 2)
        {
            return (float)Math.Round(num / 100, decimals);
        }
        else
        {
            return (int)num;
        }
    }
    static Regex s_SpecialCharacterRegex = new Regex("[()()@!#$%^&*[]|_]");
    static Regex s_AsciiCharacterRegex = new Regex("[\x00-\x1F]|[\x21-\x2F]|[\x3A-\x40]|[\x5B-\x60]|[\x7B-\x7E]");
    public static bool HasSpecialCharac(string str)
    {
        if (s_SpecialCharacterRegex.IsMatch(str))
        {
            return true;
        }
        if (s_AsciiCharacterRegex.IsMatch(str))
        {
            return true;
        }
        return false;
    }
    public static string GetColorNameByItemColor(int itemColor)
    {
        switch (itemColor)
        {
            case 1:
                return Language.Get("Market_Text_42");
            case 2:
                return Language.Get("Market_Text_43");
            case 3:
                return Language.Get("Market_Text_44");
            case 4:
                return Language.Get("Market_Text_45");
            case 5:
                return Language.Get("Market_Text_46");
            case 6:
            case 7:
            case 8:
                return Language.Get("Market_Text_47");
            case 9:
                return Language.Get("Market_Text_471");
        }
        return "";
    }
    #endregion
    #region 文字色值
    public static readonly Color s_BrightPinkColor = new Color32(246, 64, 141, 255);
    public static readonly Color s_BrightRedColor = new Color32(255, 3, 3, 255);
    public static readonly Color s_BrightPurpleColor = new Color32(218, 72, 213, 255);
    public static readonly Color s_BrightBlueColor = new Color32(0, 107, 227, 255); //006BE3FF
    public static readonly Color s_BrightOrangeColor = new Color32(255, 103, 1, 255); //FF6701FF
    public static readonly Color s_BrightWhiteColor = new Color32(104, 104, 104, 255); //686868
    public static readonly Color s_BrightGreenColor = new Color32(16, 157, 6, 255); //109d06
    public static readonly Color s_DarkPinkColor = new Color32(255, 124, 124, 255);
    public static readonly Color s_DarkRedColor = new Color32(250, 1, 1, 255);
    public static readonly Color s_DarkPurpleColor = new Color32(236, 75, 246, 255);
    public static readonly Color s_DarkBlueColor = new Color32(49, 206, 251, 255);//31cefb
    public static readonly Color s_DarkOrangeColor = new Color32(248, 152, 59, 255);
    public static readonly Color s_DarkWhiteColor = new Color32(247, 247, 247, 255);
    public static readonly Color s_DarkGreenColor = new Color32(53, 225, 34, 255); //35e122
    public static readonly Color s_NavyBrown = new Color32(64, 28, 6, 255);//401c06
    public static readonly Color s_Black = new Color32(0, 0, 0, 255);
    public static readonly Color s_NavyYellow = new Color32(255, 239, 71, 255);
    public static readonly Color s_LightGreen = new Color32(141, 220, 17, 255);//8ddc11
    public static readonly Color s_LightYellow = new Color32(255, 244, 205, 255); //fff4cd
    public static readonly Color s_Gray = new Color32(204, 204, 204, 255);
    public static readonly Color s_Gold = new Color32(255, 239, 71, 255);//ffef47
    public static readonly Color s_EarthYellow = new Color32(248, 152, 59, 255);//f8983b
    public static readonly Color s_BrightDanLV0 = new Color32(102, 102, 102, 255); //666666
    public static readonly Color s_BrightDanLV1 = new Color32(148, 96, 255, 255); //9460ff
    public static readonly Color s_BrightDanLV2 = new Color32(0, 102, 255, 255); //0066ff
    public static readonly Color s_BrightDanLV3 = new Color32(0, 179, 55, 255); //00b337
    public static readonly Color s_BrightDanLV4 = new Color32(255, 102, 0, 255); //ff6600
    public static readonly Color s_BrightDanLV5 = new Color32(255, 0, 0, 255); //ff0000
    public static readonly Color s_BrightDanLV6 = new Color32(255, 0, 246, 255); //ff00f6
    public static readonly Color s_GrayDanLV0 = new Color32(221, 221, 221, 255); //dddddd
    public static readonly Color s_GrayDanLV1 = new Color32(121, 153, 255, 255); //7999ff
    public static readonly Color s_GrayDanLV2 = new Color32(0, 198, 255, 255); //00c6ff
    public static readonly Color s_GrayDanLV3 = new Color32(102, 255, 0, 255); //66ff00
    public static readonly Color s_GrayDanLV4 = new Color32(255, 144, 0, 255); //ff9000
    public static readonly Color s_GrayDanLV5 = new Color32(255, 0, 0, 255); //ff0000
    public static readonly Color s_GrayDanLV6 = new Color32(240, 0, 255, 255); //f000ff
    // public static Color GetDanLVColor(int danLv, bool bright = false)
    // {
    //     var crossDanLVConfig = CrossServerArenaConfig.Get(danLv);
    //     if (crossDanLVConfig != null)
    //     {
    //         switch (crossDanLVConfig.DanType)
    //         {
    //             case 0:
    //                 return bright ? s_BrightDanLV0 : s_GrayDanLV0;
    //             case 1:
    //                 return bright ? s_BrightDanLV1 : s_GrayDanLV1;
    //             case 2:
    //                 return bright ? s_BrightDanLV2 : s_GrayDanLV2;
    //             case 3:
    //                 return bright ? s_BrightDanLV3 : s_GrayDanLV3;
    //             case 4:
    //                 return bright ? s_BrightDanLV4 : s_GrayDanLV4;
    //             case 5:
    //                 return bright ? s_BrightDanLV5 : s_GrayDanLV5;
    //             case 6:
    //                 return bright ? s_BrightDanLV6 : s_GrayDanLV6;
    //         }
    //     }
    //     return Color.white;
    // }
    // public static string AppendDanLVNameColor(int danLv, bool bright = false)
    // {
    //     var crossDanLVConfig = CrossServerArenaConfig.Get(danLv);
    //     if (crossDanLVConfig == null)
    //     {
    //         return string.Empty;
    //     }
    //     var name = crossDanLVConfig.Name;
    //     switch (crossDanLVConfig.DanType)
    //     {
    //         case 0:
    //             return StringUtility.Contact("", name, "");
    //         case 1:
    //             return StringUtility.Contact("", name, "");
    //         case 2:
    //             return StringUtility.Contact("", name, "");
    //         case 3:
    //             return StringUtility.Contact("", name, "");
    //         case 4:
    //             return StringUtility.Contact("", name, "");
    //         case 5:
    //             return StringUtility.Contact("", name, "");
    //         case 6:
    //             return StringUtility.Contact("", name, "");
    //     }
    //     return name;
    // }
    public static Color GetUIColor(int itemColor, bool bright = false)
    {
        switch (itemColor)
        {
            case 0:
                return GetUIColor(TextColType.White, bright);
            case 1:
                return GetUIColor(TextColType.White, bright);
            case 2:
                return GetUIColor(TextColType.Blue, bright);
            case 3:
                return GetUIColor(TextColType.Purple, bright);
            case 4:
                return GetUIColor(TextColType.Orange, bright);
            case 5:
                return GetUIColor(TextColType.Red, bright);
            case 6:
            case 7:
            case 8:
                return GetUIColor(TextColType.Pink, bright);
            case 9:
                return GetUIColor(TextColType.Green, bright);
        }
        return GetUIColor(TextColType.White, bright);
    }
    public static Color GetUIColor(TextColType type, bool bright = false)
    {
        switch (type)
        {
            case TextColType.None:
            case TextColType.White:
                return bright ? s_BrightWhiteColor : s_DarkWhiteColor;  // s_BrightWhiteColor 是亮底灰色
            case TextColType.Blue:
                return bright ? s_BrightBlueColor : s_DarkBlueColor;
            case TextColType.Purple:
                return bright ? s_BrightPurpleColor : s_DarkPurpleColor;
            case TextColType.Orange:
                return bright ? s_BrightOrangeColor : s_DarkOrangeColor;
            case TextColType.Red:
                return bright ? s_BrightRedColor : s_DarkRedColor;
            case TextColType.Pink:
                return bright ? s_BrightPinkColor : s_DarkPinkColor;
            case TextColType.Green:
                return bright ? s_BrightGreenColor : s_DarkGreenColor;
            case TextColType.NavyBrown:
                return s_NavyBrown;
            case TextColType.DarkGreen:
                return s_BrightGreenColor;
            case TextColType.Black:
                return s_Black;
            case TextColType.NavyYellow:
                return s_NavyYellow;
            case TextColType.LightGreen:
                return s_LightGreen;
            case TextColType.LightYellow:
                return s_LightYellow;
            case TextColType.Gray:
                return s_Gray;
        }
        return bright ? s_BrightWhiteColor : s_DarkWhiteColor;
    }
    private static Regex m_TextColorRegex = new Regex("(.*)", RegexOptions.Singleline);
    public static string AppendColor(TextColType type, string msg, bool bright = false)
    {
        if (m_TextColorRegex.IsMatch(msg) && msg.ToLower().StartsWith(""))
        {
            Match match = m_TextColorRegex.Match(msg);
            msg = match.Groups[1].Value;
        }
        switch (type)
        {
            case TextColType.None:
            case TextColType.White:
                return StringUtility.Contact("", msg, "");
            case TextColType.Blue:
                return StringUtility.Contact("", msg, "");
            case TextColType.Purple:
                return StringUtility.Contact("", msg, "");
            case TextColType.Orange:
                return StringUtility.Contact("", msg, "");
            case TextColType.Red:
                return StringUtility.Contact("", msg, "");
            case TextColType.Pink:
                return StringUtility.Contact("", msg, "");
            case TextColType.Green:
                return StringUtility.Contact("", msg, "");
            case TextColType.NavyBrown:
                return StringUtility.Contact("", msg, "");
            case TextColType.DarkGreen:
                return StringUtility.Contact("", msg, "");
            case TextColType.Black:
                return StringUtility.Contact("", msg, "");
            case TextColType.LightYellow:
                return StringUtility.Contact("", msg, "");
            case TextColType.LightGreen:
                return StringUtility.Contact("", msg, "");
            case TextColType.Gray:
                return StringUtility.Contact("", msg, "");
        }
        return msg;
    }
    //needName 指境界0是否需要名称
    // public static string GetRealmName(int realmLv, bool bright = false, bool needName = false)
    // {
    //     if (realmLv <= 0 && !needName)
    //     {
    //         return string.Empty;
    //     }
    //     var config = RealmConfig.Get(realmLv);
    //     if (config == null)
    //     {
    //         return string.Empty;
    //     }
    //     return GetRealmColorByLv(realmLv, config.Name, bright);
    // }
    //strFormat附加 境界名以外的文字
    //needName 指境界0是否需要名称
    // public static string GetRealmNameEx(int realmLv, string strFormat, bool bright = false, bool needName = false)
    // {
    //     if (realmLv <= 0 && !needName)
    //     {
    //         return string.Empty;
    //     }
    //     var config = RealmConfig.Get(realmLv);
    //     if (config == null)
    //     {
    //         return string.Empty;
    //     }
    //     return GetRealmColorByLv(realmLv, string.Format(strFormat, config.Name), bright);
    // }
    // public static string GetRealmColorByLv(int realmLv, string msg, bool bright = false)
    // {
    //     var config = RealmConfig.Get(realmLv);
    //     if (config == null)
    //     {
    //         return string.Empty;
    //     }
    //     switch (config.Quality)
    //     {
    //         case 1:
    //             return StringUtility.Contact("", msg, "");
    //         case 2:
    //             return StringUtility.Contact("", msg, "");
    //         case 3:
    //             return StringUtility.Contact("", msg, "");
    //         case 4:
    //             return StringUtility.Contact("", msg, "");
    //         case 5:
    //             return StringUtility.Contact("", msg, "");
    //         case 6:
    //             return StringUtility.Contact("", msg, "");
    //         default:
    //             return msg;
    //     }
    // }
    public static string AppendColor(int itemColor, string msg, bool bright = false)
    {
        switch (itemColor)
        {
            case 0:
            case 1:
                return AppendColor(TextColType.White, msg, bright);
            case 2:
                return AppendColor(TextColType.Blue, msg, bright);
            case 3:
                return AppendColor(TextColType.Purple, msg, bright);
            case 4:
                return AppendColor(TextColType.Orange, msg, bright);
            case 5:
                return AppendColor(TextColType.Red, msg, bright);
            case 6:
            case 7:
            case 8:
                return AppendColor(TextColType.Pink, msg, bright);
            case 9:
                return AppendColor(TextColType.Green, msg, bright);
        }
        return msg;
    }
    // public static int GetItemColor(int _id, Dictionary> _dict = null)
    // {
    //     int _itemColor = 0;
    //     var _itemCfg = ItemConfig.Get(_id);
    //     if (_itemCfg != null)
    //     {
    //         _itemColor = _itemCfg.ItemColor;
    //         if (_itemCfg.Type == 113 && _dict != null)
    //         {
    //             _itemColor = ItemLogicUtility.Instance.GetItemQuality(_itemCfg.ID, _dict);
    //         }
    //     }
    //     return _itemColor;
    // }
    public static Color GetPropertyColor(int property)
    {
        switch ((PropertyType)property)
        {
            case PropertyType.Mater:
                return s_Gold;
            case PropertyType.Wood:
                return s_LightGreen;
            case PropertyType.Water:
                return s_DarkBlueColor;
            case PropertyType.Fire:
                return s_GrayDanLV5;
            case PropertyType.Earth:
                return s_EarthYellow;
        }
        return s_NavyBrown;
    }
    #endregion
    #region 计算战斗力
    public static readonly string FightPowerFormula = "FightpowerFormula";
    // public static int GetFightPower(Dictionary _propertyDict)
    // {
    //     Equation.Instance.Clear();
    //     if (_propertyDict == null || _propertyDict.Count == 0)
    //     {
    //         return 0;
    //     }
    //     foreach (var _key in _propertyDict.Keys)
    //     {
    //         PlayerPropertyConfig cfg = PlayerPropertyConfig.Get(_key);
    //         if (cfg != null)
    //         {
    //             if (_key == 7)
    //             {
    //                 Equation.Instance.AddKeyValue("MinAtk", _propertyDict[_key]);
    //                 Equation.Instance.AddKeyValue("MaxAtk", _propertyDict[_key]);
    //             }
    //             else if (_key == 24)
    //             {
    //                 Equation.Instance.AddKeyValue("PetMinAtk", _propertyDict[_key]);
    //                 Equation.Instance.AddKeyValue("PetMaxAtk", _propertyDict[_key]);
    //             }
    //             else
    //             {
    //                 ulong attrValue = (ulong)_propertyDict[_key];
    //                 var fightParm = GetFightPowerParmByAttrId(_key);
    //                 if (_key == 11)
    //                 {
    //                     var playerLv = PlayerDatas.Instance.baseData.LV;
    //                     var paramConfig = FightPowerParamConfig.Get(playerLv);
    //                     Equation.Instance.AddKeyValue("AtkSpeedParameter", paramConfig.AtkSpeedParameter);
    //                 }
    //                 else
    //                 {
    //                     if (fightParm != 0)
    //                     {
    //                         attrValue = attrValue * (ulong)fightParm;
    //                     }
    //                 }
    //                 Equation.Instance.AddKeyValue(cfg.Parameter, attrValue);
    //             }
    //         }
    //     }
    //     FuncConfigConfig funcCfg = FuncConfigConfig.Get(FightPowerFormula);
    //     return Equation.Instance.Eval(funcCfg.Numerical1);
    // }
    // public static int GetFightPowerParmByAttrId(int attrId)
    // {
    //     int playerLv = PlayerDatas.Instance.baseData.LV;
    //     FightPowerParamConfig paramConfig = FightPowerParamConfig.Get(playerLv);
    //     PlayerPropertyConfig cfg = PlayerPropertyConfig.Get(attrId);
    //     if (paramConfig == null || cfg == null) return 0;
    //     switch (cfg.Parameter)
    //     {
    //         case "Hit":
    //             return paramConfig.Hit;
    //         case "Miss":
    //             return paramConfig.Miss;
    //         case "IgnoreDefRate":
    //             return paramConfig.IgnoreDefRate;
    //         case "DamChanceDef":
    //             return paramConfig.DamChanceDef;
    //         case "FaintRate":
    //             return paramConfig.FaintRate;
    //         case "LuckyHitRateReduce":
    //             return paramConfig.LuckyHitRateReduce;
    //         case "SkillAtkRate":
    //             return paramConfig.SkillAtkRate;
    //         case "SkillAtkRateReduce":
    //             return paramConfig.SkillAtkRateReduce;
    //         case "DamagePerPVP":
    //             return paramConfig.DamagePerPVP;
    //         case "DamagePerPVPReduce":
    //             return paramConfig.DamagePerPVPReduce;
    //         case "DamBackPer":
    //             return paramConfig.DamBackPer;
    //         case "IgnoreDefRateReduce":
    //             return paramConfig.IgnoreDefRateReduce;
    //         case "FaintDefRate":
    //             return paramConfig.FaintDefRate;
    //         case "AtkSpeedParameter":
    //             return paramConfig.AtkSpeedParameter;
    //         case "JobAHurtAddPer":
    //             return paramConfig.JobAHurtAddPer;
    //         case "JobBHurtAddPer":
    //             return paramConfig.JobBHurtAddPer;
    //         case "JobCHurtAddPer":
    //             return paramConfig.JobCHurtAddPer;
    //         case "JobAAtkReducePer":
    //             return paramConfig.JobAAtkReducePer;
    //         case "JobBAtkReducePer":
    //             return paramConfig.JobBAtkReducePer;
    //         case "JobCAtkReducePer":
    //             return paramConfig.JobCAtkReducePer;
    //         case "SuperHitRate":
    //             return paramConfig.SuperHitRate;
    //         case "LuckyHitRate":
    //             return paramConfig.LuckyHitRate;
    //         case "SuperHitRateReduce":
    //             return paramConfig.SuperHitRateReduce;
    //         case "FinalHurtPer":
    //             return paramConfig.FinalHurtPer;
    //         case "FinalHurtReducePer":
    //             return paramConfig.FinalHurtReducePer;
    //         case "NPCHurtAddPer":
    //             return paramConfig.NPCHurtAddPer;
    //         case "NormalHurtPer":
    //             return paramConfig.NormalHurtPer;
    //         case "FabaoHurtPer":
    //             return paramConfig.FabaoHurtPer;
    //         case "AffairSpeedPer":
    //             return paramConfig.AffairSpeedPer;
    //         case "FamilyBossHurtPer":
    //             return paramConfig.FamilyBossHurtPer;
    //         case "FamilyWarHPPer":
    //             return paramConfig.FamilyWarHPPer;
    //         case "FamilyWarAtkPer":
    //             return paramConfig.FamilyWarAtkPer;
    //         case "FamilySitExpPer":
    //             return paramConfig.FamilySitExpPer;
    //         case "BossFinalHurtPer":
    //             return paramConfig.BossFinalHurtPer;
    //     }
    //     return 0;
    // }
    #endregion
    #region 得到金钱数量根据金钱类型
    //货币单位的显示,海外显示逗号, 国内不加逗号
    public static string GetMoneyFormat(double money)
    {
        if (money == (int)money)
        {
            return money.ToString("F0");
        }
        return money.ToString("F2").TrimEnd('0').TrimEnd('.');
        //return money.ToString();
    }
    //仅用于显示 仙玉和灵石的特殊处理,存在负数情况,如GM惩罚扣除货币
    public static int GetMoneyCntEx(int moneyType)
    {
        switch (moneyType)
        {
            case 1:
                {
                    return (int)(PlayerDatas.Instance.baseData.diamond - PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default5));
                }
            case 2:
                {
                    return (int)(PlayerDatas.Instance.baseData.bindDiamond - PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default6));
                }
        }
        return 0;
    }
    public static ulong GetMoneyCnt(int moneyType)
    {
        switch (moneyType)
        {
            case 1:
                {
                    return PlayerDatas.Instance.baseData.diamond;
                }
            case 2:
                {
                    return PlayerDatas.Instance.baseData.bindDiamond;
                }
            case 3:
                {
                    return PlayerDatas.Instance.baseData.allCopper;
                }
            case 18:
                {
                    return (ulong)PlayerDatas.Instance.extersion.honorValue;
                }
            case 25:
                {
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.CDBPlayerRefresh_TreasureScore);
                    //return (ulong)ModelCenter.Instance.GetModel().GetTCBPlayerData(PlayerDataType.CDBPlayerRefresh_TreasureScore);
                }
            case 24:
                {
                    return (ulong)PlayerDatas.Instance.extersion.runeChip;
                }
            case 15:
                {
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.UnionLiven);
                    //return (ulong)ModelCenter.Instance.GetModel().GetTCBPlayerData(PlayerDataType.UnionLiven);
                }
            case 17:
                {
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.FBHelpPoint);
                    //return (ulong)ModelCenter.Instance.GetModel().GetTCBPlayerData(PlayerDataType.FBHelpPoint);
                }
            case 27:
                {
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.CDBPlayerRefresh_Danjing);
                    //return (ulong)ModelCenter.Instance.GetModel().GetTCBPlayerData(PlayerDataType.CDBPlayerRefresh_Danjing);
                }
            case 28:
                {
                    return PlayerDatas.Instance.extersion.soulDust; //废弃了用44
                }
            case 29:
                {
                    return PlayerDatas.Instance.extersion.soulSplinters;
                }
            case 30:
                {
                    return PlayerDatas.Instance.extersion.soulCore;
                }
            case 32:
                {
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default4);
                }
            case 34:
                {
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default13);
                }
            case 35:
                {
                    //功德点
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default14);
                }
            case 37:
                {
                    //机缘点
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default17);
                }
            case 39:
                {
                    //成就积分
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default19);
                }
            case 40:
                {
                    //万界积分
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default20);
                }
            case 41:
                {
                    //符印精华
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.RuneSplinters);
                }
            case 43:
                {
                    //凭证积分
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default34);
                }
            case 44:
                {
                    //聚魂精华
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default35);
                }
            case 45:
                {
                    //骑宠积分
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default37);
                }
            case 46:
                {
                    //古宝养成货币
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default38);
                }
            case 47:
                {
                    //天道币
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default39);
                }
            case 49:
                {
                    //仙缘积分
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default42);
                }
            case 50:
                {
                    //幻境阁积分
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default43);
                }
            case 98:
                {
                    //过期型代金券
                    return PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default41);
                }
            case 99:
                {
                    //代金券
                    return PlayerDatas.Instance.baseData.ExAttr11;
                }
        }
        return 0;
    }
    public static int GetAllVourcher()
    {
        return (int)GetMoneyCnt(98) + (int)GetMoneyCnt(99);
    }
    #endregion
    #region 得到装备位对应的部位名称
    public static string GetEquipPlaceName(int place)
    {
        if (GeneralDefine.equipPlaceNameDict.ContainsKey(place))
        {
            return GeneralDefine.equipPlaceNameDict[place];
        }
        return "";
    }
    #endregion
    #region 服务端发过来文字显示不出来问题
    public static string ServerStringTrim(string str)
    {
        if (!string.IsNullOrEmpty(str))
        {
            str = str.Replace("\0", "");
            str = str.Replace("\x00", "");
            return str;
        }
        else
        {
            return string.Empty;
        }
    }
    #endregion
    //账号:706907@1@hyyngame@s30,服务器ID:30
    public static int GetServerIDByAccount(string account)
    {
        string[] strArray = account.Split('@');
        if (strArray.Length < 2)
        {
            //判断长度2不是一个实际长度,一般都是大于2
            return 0;
        }
        if (strArray[strArray.Length - 1].Length < 2)
            return 0;
        int id = 0;
        int.TryParse(strArray[strArray.Length - 1].Substring(1), out id);
        return id;
    }
    #region 获取间隔奖励
    public static int GetIntervalAward(ICollection _keys, int _present)
    {
        foreach (var _key in _keys)
        {
            if (_present <= _key)
            {
                return _key;
            }
        }
        return _keys.Last();
    }
    #endregion
    public static string GetGrade(int _star)
    {
        switch (_star)
        {
            case 5:
                return "S";
            case 4:
                return "A";
            case 3:
                return "B";
            case 2:
                return "C";
            case 1:
                return "D";
        }
        return "D";
    }
    public static string TrimContentToServer(string content)
    {
        content = WordAnalysis.Color_Start_Regex.Replace(content, string.Empty);
        content = WordAnalysis.Color_End_Regex.Replace(content, string.Empty);
        content = content.Replace("=", string.Empty);
        content = content.Replace(" ", string.Empty);
        return content;
    }
    public static bool SatisfyNameLength(string name, out int error)
    {
        error = 0;
        //bool pureChinese = Regex.IsMatch(name, "^[\u4e00-\u9fa5]+$");
        //var chsCount = GetChsCount(name);
        int length = Encoding.Default.GetBytes(name).Length;
        var maxlength = 20;
        var minlength = 3;
        if (length > maxlength)
        {
            error = 1;
        }
        else if (length < minlength)
        {
            error = 2;
        }
        return error == 0;
    }
    public static int GetChsCount(string name)
    {
        var count = 0;
        for (int i = 0; i < name.Length; i++)
        {
            if (Regex.IsMatch(name[i].ToString(), "[\u4e00-\u9fa5]"))
            {
                count++;
            }
        }
        return count;
    }
    // public static string GetEquipSuitName(int itemId, bool bright = false)
    // {
    //     if (ItemLogicUtility.Instance.IsSuitEquip(itemId))
    //     {
    //         var itemConfig = ItemConfig.Get(itemId);
    //         return AppendColor(TextColType.Green, EquipModel.GetSuitName(itemConfig.LV), bright);
    //     }
    //     return string.Empty;
    // }
    // public static string GetItemName(int itmeId, bool bright = false)
    // {
    //     var itemConfig = ItemConfig.Get(itmeId);
    //     if (itemConfig == null)
    //     {
    //         return string.Empty;
    //     }
    //     return StringUtility.Contact(GetEquipSuitName(itmeId, bright), itemConfig.ItemName);
    // }
    public static string GetStar(int star)
    {
        switch (star)
        {
            case 5:
                return "S";
            case 4:
                return "A";
            case 3:
                return "B";
            case 2:
                return "C";
            case 1:
                return "D";
        }
        return string.Empty;
    }
    //转为s1,s2,s3格式
    public static string GetServers(string serverIDRangeInfo)
    {
        var serverList = new List();
        if (string.IsNullOrEmpty(serverIDRangeInfo) || serverIDRangeInfo == "[]")
        {
            return "all";
        }
        var serverArray = JsonMapper.ToObject(serverIDRangeInfo);
        for (int i = 0; i < serverArray.Length; i++)
        {
            int startID = serverArray[i][0];
            int endID = serverArray[i][1];
            for (int j = startID; j <= endID; j++)
            {
                var serverName = ServerListCenter.Instance.GetServerName(j);
                serverList.Add(serverName);
                //太长会导致界面顶点数超过65000
                if (serverList.Count > 1000)
                    return string.Join(", ", serverList.ToArray());
            }
        }
        return string.Join(", ", serverList.ToArray());
    }
    //不同版本现金的单位不一样,比如越南盾是整数,下发是原值;美元和RMB是小数,下发是原值的100
    public static float GetRealCoin(int money, float scale = 100.0f)
    {
        return money / scale;
    }
}