using System;
using System.Collections.Generic;
using System.Text;
using CommonLang.Property;
using CommonAI.Zone.Attributes;
using CommonAI.Zone.ZoneEditor;
using CommonLang.Formula;

using CommonAI.Zone.Instance;
using CommonAI.RTS; using CommonLang.Vector;
using CommonLang;
using CommonAI.Zone.EventTrigger;

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{

    [DescAttribute("字符串")]
    public abstract class StringValue : AbstractValue<string>
    {
        [DescAttribute("空", "值")]
        public class NULL : StringValue
        {
            public NULL() { }

            public override string ToString()
            {
                return "NULL";
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return null;
            }
        }

        [DescAttribute("值", "值")]
        public class VALUE : StringValue
        {
            [LocalizationTextAttribute]
            [DescAttribute("值")]
            public string Value = "";

            public VALUE() { }
            public VALUE(string value) { this.Value = value; }

            public override string ToString()
            {
                return Value + "";
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return Value;
            }
        }

        //---------------------------------------------------------------------------------------------------------------------
        #region __游戏__

        [DescAttribute("场景用户自定义属性", "场景")]
        public class ZoneTextAttribute : StringValue
        {
            [DescAttribute("键值")]
            public string Key;
            public override string ToString()
            {
                return string.Format("场景键值[{0}]", Key);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.GetAttribute(Key) as string;
            }
        }

        [DescAttribute("最后接收到的消息(从服务器)", "场景")]
        public class ZoneLastRecvMessage : StringValue
        {
            public override string ToString()
            {
                return string.Format("最后从服务器接收到的消息");
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                if (api.ZoneAPI.LastRecvMessageR2B != null)
                {
                    return api.ZoneAPI.LastRecvMessageR2B.Message;
                }
                return null;
            }
        }

        [DescAttribute("最后发送到的消息(到服务器)", "场景")]
        public class ZoneLastSentMessage : StringValue
        {
            public override string ToString()
            {
                return string.Format("最后发送到服务器的消息");
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                if (api.ZoneAPI.LastSentMessageB2R != null)
                {
                    return api.ZoneAPI.LastSentMessageB2R.Message;
                }
                return null;
            }
        }


        [DescAttribute("单位用户自定义属性", "单位")]
        public class UnitTextAttribute : StringValue
        {
            [DescAttribute("单位")]
            public UnitValue Unit = new UnitValue.Trigging();
            [DescAttribute("键值")]
            public string Key;
            public override string ToString()
            {
                return string.Format("单位({0})键值[{1}]", Unit, Key);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                InstanceUnit unit = Unit.GetValue(api, args);
                if (unit != null)
                {
                    return unit.GetAttribute(Key) as string;
                }
                return null;
            }
        }

        [DescAttribute("单位名字", "单位")]
        public class UnitName : StringValue
        {
            [DescAttribute("单位")]
            public UnitValue Unit = new UnitValue.Trigging();
            public override string ToString()
            {
                return string.Format("单位({0})名字", Unit);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                InstanceUnit unit = Unit.GetValue(api, args);
                if (unit != null)
                {
                    return unit.Name;
                }
                return null;
            }
        }

        [DescAttribute("物品名字", "物品")]
        public class ItemName : StringValue
        {
            [DescAttribute("物品")]
            public ItemValue Item = new ItemValue.NA();
            public override string ToString()
            {
                return string.Format("物品({0})名字", Item);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                InstanceItem item = Item.GetValue(api, args);
                if (item != null)
                {
                    return item.Name;
                }
                return null;
            }
        }

        [DescAttribute("玩家UUID", "单位")]
        public class PlayerUUID : StringValue
        {
            [DescAttribute("玩家单位")]
            public UnitValue Unit = new UnitValue.Trigging();
            public override string ToString()
            {
                return string.Format("玩家单位({0})UUID", Unit);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                var unit = Unit.GetValue(api, args);
                InstancePlayer retUnit = null;
                if (unit is InstancePlayer)
                {
                    retUnit = unit as InstancePlayer;
                }
                else if (unit is InstancePet)
                {
                    retUnit = (unit as InstancePet).Master as InstancePlayer;
                }
                else if (unit is InstanceSummon)
                {
                    retUnit = (unit as InstanceSummon).SummonerUnit as InstancePlayer;
                }

                if (retUnit != null)
                {
                    return retUnit.PlayerUUID;
                }
                return null;
            }
        }


        [DescAttribute("单位模板ID", "单位")]
        public class UnitTemplateID : StringValue
        {
            [DescAttribute("单位")]
            public UnitValue Unit = new UnitValue.Trigging();
            public override string ToString()
            {
                return string.Format("单位({0})模板ID", Unit);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                InstanceUnit unit = Unit.GetValue(api, args);
                if (unit != null)
                {
                    return unit.Info.TemplateID.ToString();
                }
                return null;
            }
        }

        #endregion
        //---------------------------------------------------------------------------------------------------------------------
        #region __转换__

        [DescAttribute("整形转换为字符串", "转换")]
        public class IntegerToString : StringValue
        {
            [DescAttribute("值")]
            public IntegerValue Value = new IntegerValue.VALUE(1);
            public override string ToString()
            {
                return string.Format("({0})转换为字符串", Value);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                int value = Value.GetValue(api, args);
                return value.ToString();
            }
        }


        [DescAttribute("小数转换为字符串", "转换")]
        public class RealToString : StringValue
        {
            [DescAttribute("值")]
            public RealValue Value = new RealValue.VALUE(1);
            public override string ToString()
            {
                return string.Format("({0})转换为字符串", Value);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                float value = Value.GetValue(api, args);
                return value.ToString();
            }
        }

        #endregion
        //---------------------------------------------------------------------------------------------------------------------
        #region __字符串方法__

        [DescAttribute("字符串拼接", "字符串方法")]
        public class StringConcat : StringValue
        {
            [DescAttribute("串0")]
            public StringValue str0 = new StringValue.VALUE();
            [DescAttribute("串1")]
            public StringValue str1 = new StringValue.VALUE();
            [DescAttribute("串2")]
            public StringValue str2 = new StringValue.VALUE();
            [DescAttribute("串3")]
            public StringValue str3 = new StringValue.VALUE();
            public override string ToString()
            {
                return string.Format("{0}{1}{2}{3}", str0, str1, str2, str3);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                string[] array = new string[]
                {
                    str0.GetValue(api, args),
                    str1.GetValue(api, args),
                    str2.GetValue(api, args),
                    str3.GetValue(api, args),
                };
                StringBuilder sb = new StringBuilder();
                foreach (string c in array)
                {
                    if (c != null)
                        sb.Append(c);
                }
                return sb.ToString();
            }
        }

        [DescAttribute("字符串拼接(组)", "字符串方法")]
        public class StringConcatArray : StringValue
        {
            [DescAttribute("串0")]
            [ListAttribute(typeof(StringValue))]
            public List<StringValue> array = new List<StringValue>();
            public override string ToString()
            {
                StringBuilder sb = new StringBuilder();
                foreach (StringValue sv in array)
                {
                    sb.Append(sv.ToString());
                }
                return sb.ToString();
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                StringBuilder sb = new StringBuilder();
                foreach (StringValue sv in array)
                {
                    string c = sv.GetValue(api, args);
                    if (c != null)
                        sb.Append(c);
                }
                return sb.ToString();
            }
        }


        [DescAttribute("字符串格式化", "字符串方法")]
        public class StringFormat4 : StringValue
        {
            [DescAttribute("格式化文本(最多4个参数)")]
            [LocalizationTextAttribute]
            public string FormatString = "{0}{1}{2}{3}";

            [DescAttribute("串0")]
            public StringValue str0 = new StringValue.VALUE();
            [DescAttribute("串1")]
            public StringValue str1 = new StringValue.VALUE();
            [DescAttribute("串2")]
            public StringValue str2 = new StringValue.VALUE();
            [DescAttribute("串3")]
            public StringValue str3 = new StringValue.VALUE();
            public override string ToString()
            {
                return string.Format(FormatString, str0, str1, str2, str3);
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return string.Format(FormatString,
                    str0.GetValue(api, args),
                    str1.GetValue(api, args),
                    str2.GetValue(api, args),
                    str3.GetValue(api, args));
            }
        }

        [DescAttribute("字符串格式化(组)", "字符串方法")]
        public class StringFormatArray : StringValue
        {
            [DescAttribute("格式化文本")]
            [LocalizationTextAttribute]
            public string FormatString = "{0}";

            [DescAttribute("参数")]
            [ListAttribute(typeof(StringValue))]
            public List<StringValue> array = new List<StringValue>();
            public override string ToString()
            {
                return string.Format(FormatString, array.ToArray());
            }
            public override string GetValue(IEditorValueAdapter api, EventArguments args)
            {
                object[] param = new object[array.Count];
                for (int i = 0; i < param.Length;i++ )
                {
                    string c = array[i].GetValue(api, args);
                    param[i] = c;
                }
                return string.Format(FormatString, param);
            }
        }
        #endregion
        //---------------------------------------------------------------------------------------------------------------------
    }


}