using CommonAI.Zone.EventTrigger;
using CommonAI.Zone.ZoneEditor.EventTrigger;
using CommonLang.IO;
using CommonLang.IO.Attribute;
using CommonLang.Property;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CommonAI.Zone
{

    /// 事件动作触发器
    /// </summary>
    [MessageType(0x4502)]
    [TableClassAttribute("Name")]
    public class UnitEvent : ICloneable, IEventDataNode, IExternalizable
    {
        public string EventName { get { return this.Name; } set { this.Name = value; } }
        public string EventTreePath { get { return this.SavePath; } set { this.SavePath = value; } }
        public bool EventIsActive { get { return this.Active; } set { this.Active = value; } }
        public string EventComment { get { return this.Comment; } set { this.Comment = value; } }
        public int EventDelayTimeMS { get { return this.DelayTimeMS; } set { this.DelayTimeMS = value; } }
        public List<LocalVar> EventLocalVars { get { return this.LocalVars.Datas; } }
        public List<AbstractTrigger> EventTriggers { get { return this.Triggers.Datas; } }
        public List<AbstractCondition> EventConditions { get { return this.Conditions.Datas; } }
        public List<AbstractAction> EventActions { get { return this.Actions.Datas; } }

        /// <summary>
        /// 触发器名字
        /// </summary>
        public string Name = "Unnamed";
        /// <summary>
        /// 启用
        /// </summary>
        public bool Active = true;
        /// <summary>
        /// 注释
        /// </summary>
        public string Comment = "";
        /// <summary>
        /// 保存
        /// </summary>
        public string SavePath;
        /// <summary>
        /// 延迟执行
        /// </summary>
        public int DelayTimeMS;
        /// <summary>
        /// 临时变量
        /// </summary>
        public UnitLocalVars LocalVars = new UnitLocalVars();
        /// <summary>
        /// 事件触发
        /// </summary>
        public UnitTriggers Triggers = new UnitTriggers();
        /// <summary>
        /// 条件
        /// </summary>
        public UnitConditions Conditions = new UnitConditions();
        /// <summary>
        /// 动作
        /// </summary>
        public UnitActions Actions = new UnitActions();

        public UnitEvent()
        {
            Triggers.Datas.Add(new BindingUnitDamaged());
            Conditions.Datas.Add(new AlwaysTrue());
            Actions.Datas.Add(new UnitAddBuffAction());
        }

		public object Clone()
		{
			UnitEvent ret = new UnitEvent();
			ret.Name = this.Name;
			ret.Active = this.Active;
			ret.Comment = this.Comment;
			ret.SavePath = this.SavePath;
			ret.DelayTimeMS = this.DelayTimeMS;
			this.LocalVars.Clone(ret.LocalVars);
			this.Triggers.Clone(ret.Triggers);
			this.Conditions.Clone(ret.Conditions);
			this.Actions.Clone(ret.Actions);

			return ret;
			//return IOUtil.CloneIExternalizable<UnitEvent>(TemplateManager.MessageCodec, this);
		}

		public override string ToString()
        {
            return Name + "";
        }

        public string FunctionText()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(Triggers.ToString());
            sb.Append(",\n");
            sb.Append("满足条件:").Append(Conditions.ToString());
            sb.Append(",\n");
            sb.Append("执行动作:").Append(Actions.ToString());
            sb.Append("。");
            return sb.ToString();
        }

        public void WriteExternal(IOutputStream output)
        {
            output.PutUTF(this.Name);
            output.PutBool(this.Active);
            output.PutUTF(this.Comment);
            output.PutUTF(this.SavePath);
            output.PutS32(this.DelayTimeMS);
            output.PutObj2Xml(this.LocalVars);
            output.PutObj2Xml(this.Triggers);
            output.PutObj2Xml(this.Conditions);
            output.PutObj2Xml(this.Actions);
        }

        public void ReadExternal(IInputStream input)
        {
            this.Name = input.GetUTF();
            this.Active = input.GetBool();
            this.Comment = input.GetUTF();
            this.SavePath = input.GetUTF();
            this.DelayTimeMS = input.GetS32();
            this.LocalVars = input.GetXml2Obj<UnitLocalVars>();
            this.Triggers = input.GetXml2Obj<UnitTriggers>();
            this.Conditions = input.GetXml2Obj<UnitConditions>();
            this.Actions = input.GetXml2Obj<UnitActions>();
        }


        // ----------------------------------------------------------------------
        public class UnitLocalVars
        {
            public List<LocalVar> Datas = new List<LocalVar>();
            public override string ToString()
            {
                StringBuilder sb = new StringBuilder();
                if (Datas.Count > 0)
                {
                    for (int i = 0; i < Datas.Count; i++)
                    {
                        sb.AppendLine(Datas[i].ToString());
                    }
                }
                return sb.ToString();
            }

			public void Clone(UnitLocalVars data)
			{
				data.Datas.Clear();
				for (int i = 0; i < Datas.Count; i++)
				{
					data.Datas.Add(this.Datas[i]);
				}
			}

        }
        public class UnitTriggers
        {
            public List<AbstractTrigger> Datas = new List<AbstractTrigger>();

			public void Clone(UnitTriggers data)
			{
				data.Datas.Clear();
				for (int i = 0; i < Datas.Count; i++)
				{
					data.Datas.Add(this.Datas[i]);
				}
			}

			public override string ToString()
            {
                StringBuilder sb = new StringBuilder();
                if (Datas.Count > 0)
                {
                    for (int i = 0; i < Datas.Count; i++)
                    {
                        sb.Append(Datas[i]);
                        if (i < Datas.Count - 1)
                        {
                            sb.Append(" 或者 ");
                        }
                    }
                }
                else
                {
                    sb.Append("(无起因)");
                }
                return sb.ToString();
            }

        }
        public class UnitConditions
        {
            public List<AbstractCondition> Datas = new List<AbstractCondition>();

			public void Clone(UnitConditions data)
			{
				data.Datas.Clear();
				for (int i = 0; i < Datas.Count; i++)
				{
					data.Datas.Add(this.Datas[i]);
				}
			}

			public override string ToString()
            {
                StringBuilder sb = new StringBuilder();
                if (Datas.Count > 0)
                {
                    for (int i = 0; i < Datas.Count; i++)
                    {
                        sb.Append(Datas[i]);
                        if (i < Datas.Count - 1)
                        {
                            sb.Append(" 并且 ");
                        }
                    }
                }
                else
                {
                    sb.Append("(无条件)");
                }
                return sb.ToString();
            }
        }
        public class UnitActions
        {
            public List<AbstractAction> Datas = new List<AbstractAction>();

			public void Clone(UnitActions data)
			{
				data.Datas.Clear();
				for (int i = 0; i < Datas.Count; i++)
				{
					data.Datas.Add(this.Datas[i]);
				}
			}

			public override string ToString()
            {
                StringBuilder sb = new StringBuilder();
                if (Datas.Count > 0)
                {
                    for (int i = 0; i < Datas.Count; i++)
                    {
                        sb.Append(Datas[i]);
                        if (i < Datas.Count - 1)
                        {
                            sb.Append(" 并且 ");
                        }
                    }
                }
                else
                {
                    sb.Append("(无动作)");
                }
                return sb.ToString();
            }
        }

        // ----------------------------------------------------------------------

    }


}