using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
using System;
using System.Text.RegularExpressions;
/// 
/// 服务端Setting配置,存储一些快捷设置,目前长度为100
/// 
public class QuickSetting : Singleton
{
    public QuickSetting()
    {
        //自动战斗 几倍消耗 几倍速度 是否高战力停止 是否开启自动战斗
        quickSettingDic.Add(QuickSettingType.AutoFight_Cost, new QuickSettingRange(QuickSettingType.AutoFight_Cost, 0, 1));
        quickSettingDic.Add(QuickSettingType.AutoFight_Speed, new QuickSettingRange(QuickSettingType.AutoFight_Speed, 1, 1));
        quickSettingDic.Add(QuickSettingType.AutoFight_FightPower, new QuickSettingRange(QuickSettingType.AutoFight_FightPower, 2, 1));
        quickSettingDic.Add(QuickSettingType.AutoFight_Open, new QuickSettingRange(QuickSettingType.AutoFight_Open, 3, 1));
        quickSettingDic.Add(QuickSettingType.AutoGoldRush, new QuickSettingRange(QuickSettingType.AutoGoldRush, 4, 10, 1));  //自动淘金,9个物品值,1个自动刷新开关
        quickSettingDic.Add(QuickSettingType.BattleSpeed, new QuickSettingRange(QuickSettingType.BattleSpeed, 14, 1));
        quickSettingDic.Add(QuickSettingType.HeroCountLock, new QuickSettingRange(QuickSettingType.HeroCountLock, 15, 2));
        setting = new string(UCharacter, 100);
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitializeEvent;
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
    }
    public Dictionary quickSettingDic = new Dictionary();
    public const char UCharacter = '*';
    private string setting;
    private string cacheSetting;
    private StringBuilder textBuilder = new StringBuilder();
    public event Action onQuickSettingUpdate;
    public void SetQuickSetting(QuickSettingType type, T value, int index = 0) where T : struct
    {
        SetQuickSetting(type, value.ToString(), index);
    }
    public void SetQuickSetting(QuickSettingType type, bool value, int index = 0)
    {
        SetQuickSetting(type, value ? 1 : 0, index);
    }
    public void SetQuickSetting(int type, string value, int index)
    {
        SetQuickSetting((QuickSettingType)type, value, index);
    }
    public void SetQuickSetting(QuickSettingType type, string value, int index)
    {
        var quickRange = quickSettingDic[type];
        if ((index - quickRange.index) * quickRange.single + value.Length > quickRange.length || value.Length > quickRange.single)
        {
            Debug.LogErrorFormat("存储的数据超过最大长度!{0}", type);
            return;
        }
        textBuilder.Length = 0;
        var start = quickRange.index + index * quickRange.single;
        var end = start + value.Length;
        if (quickRange.length == quickRange.single)
        {
            end = start + quickRange.length;
        }
        textBuilder.Append(setting, 0, start);
        textBuilder.Append(value);
        if (quickRange.length == quickRange.single
            && quickRange.length > value.Length)
        {
            textBuilder.Append('*', quickRange.length - value.Length);
        }
        textBuilder.Append(setting, end, setting.Length - end);
        setting = textBuilder.ToString();
        PlayerDatas.Instance.baseData.Setting = setting;
    }
    public void SetQuickSetting(string value)
    {
        value = UIHelper.ServerStringTrim(value);
        if (value != null && value.Length > 0)
        {
            setting = StringUtility.Contact(value, setting.Substring(value.Length, setting.Length - value.Length));
            cacheSetting = setting;
            PlayerDatas.Instance.baseData.Setting = setting;
        }
        if (onQuickSettingUpdate != null)
        {
            onQuickSettingUpdate();
        }
    }
    public T GetQuickSettingValue(QuickSettingType type, int index) where T : struct
    {
        string destinationStr = GetQuickSetting(type, index);
        if (string.IsNullOrEmpty(destinationStr))
        {
            return default(T);
        }
        return (T)Convert.ChangeType(destinationStr, typeof(T));
    }
    public string GetQuickSetting(QuickSettingType type, int index)
    {
        var quickRange = quickSettingDic[type];
        var start = quickRange.index + index * quickRange.single;
        var destinationStr = setting.Substring(start, quickRange.single);
        destinationStr = Regex.Replace(destinationStr, @"\*", string.Empty);
        return destinationStr;
    }
    public bool GetQuickSettingBool(QuickSettingType type, int index, bool _default = false)
    {
        string destinationStr = GetQuickSetting(type, index);
        if (string.IsNullOrEmpty(destinationStr))
        {
            return _default;
        }
        int _value = _default ? 1 : 0;
        int.TryParse(destinationStr, out _value);
        return _value == 1;
    }
    public string GetQuickSetting(int type, int index)
    {
        return GetQuickSetting((QuickSettingType)type, index);
    }
    public void SendPackage()
    {
        if (cacheSetting != setting)
        {
            cacheSetting = setting;
            C0303_tagCSetShutCutData vNetData = new C0303_tagCSetShutCutData();
            vNetData.Setting = setting;
            GameNetSystem.Instance.SendInfo(vNetData);
        }
    }
    private void BeforePlayerDataInitializeEvent()
    {
        setting = null;
        setting = new string(UCharacter, 100);
        PlayerDatas.Instance.baseData.Setting = setting;
    }
    private void OnPlayerLoginOk()
    {
        //初始设置
        if (PlayerDatas.Instance.baseData.LV == 1 && !AutoFightModel.Instance.isStopFightByBetterEquip)
        {
            AutoFightModel.Instance.isStopFightByBetterEquip = true;
            AutoFightModel.Instance.SaveAutoFightSetting();
        }
    }
}
public enum QuickSettingType
{
    AutoFight_Cost, //自动战斗 几倍消耗
    AutoFight_Speed,    //几倍速度
    AutoFight_FightPower,   //是否高战力停止
    AutoFight_Open,    //是否开启自动战斗
    AutoGoldRush,   //自动淘金
    BattleSpeed,    //战斗速度索引  非主线部分
    HeroCountLock,  //上阵人数条件锁定
}
public class QuickSettingRange
{
    public QuickSettingType type;
    public int index;
    public int length;
    public int single;  //其中的单个长度,默认和长度一样, 用于多个值合并1个类型中
    public QuickSettingRange(QuickSettingType type, int start, int length, int single = 0)
    {
        this.type = type;
        this.index = start;
        this.length = length;
        this.single = single == 0 ? length : single;
    }
}