using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

using CommonLang.Property;
using CommonAI.Zone.Instance;
using CommonAI.Zone.ZoneEditor.EventTrigger;
using CommonLang.IO.Attribute;
using CommonLang.IO;
using CommonLang.Xml;
using System.Xml;
using CommonAI.Zone.EventTrigger;

namespace CommonAI.Zone.ZoneEditor
{
   

    /// <summary>
    /// 事件动作触发器
    /// </summary>
    [MessageType(0x4501)]
    [TableClassAttribute("Name")]
    public class ZoneEvent : 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 EventLocalVars LocalVars = new EventLocalVars();
        /// <summary>
        /// 事件触发
        /// </summary>
        public EventTriggers Triggers = new EventTriggers();
        /// <summary>
        /// 条件
        /// </summary>
        public EventConditions Conditions = new EventConditions();
        /// <summary>
        /// 动作
        /// </summary>
        public EventActions Actions = new EventActions();

        public ZoneEvent()
        {
            Triggers.Datas.Add(new SceneInitialized());
            Conditions.Datas.Add(new AlwaysTrue());
            Actions.Datas.Add(new DoNoting());
        }

        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 object Clone()
        {
            return IOUtil.CloneIExternalizable<ZoneEvent>(TemplateManager.MessageCodec, this);
        }
        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<EventLocalVars>();
            this.Triggers = input.GetXml2Obj<EventTriggers>();
            this.Conditions = input.GetXml2Obj<EventConditions>();
            this.Actions = input.GetXml2Obj<EventActions>();
        }
    }


    // ----------------------------------------------------------------------
    public class EventLocalVars
    {
        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 class EventTriggers
    {
        public List<AbstractTrigger> Datas = new List<AbstractTrigger>();

        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 EventConditions 
    {
        public List<AbstractCondition> Datas = new List<AbstractCondition>();

        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 EventActions
    {
        public List<AbstractAction> Datas = new List<AbstractAction>();

        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();
        }
    }

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

}