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

namespace CommonAI.Zone.EventTrigger
{
    public interface IEditorValue
    {
        object GetEnvValue(IEditorValueAdapter api);
    }

    public interface IEventDataNode
    {
        /// <summary>
        /// 触发器名字
        /// </summary>
        string EventName { get; set; }
        /// <summary>
        /// 启用
        /// </summary>
        bool EventIsActive { get; set; }
        /// <summary>
        /// 注释
        /// </summary>
        string EventComment { get; set; }
        /// <summary>
        /// 保存
        /// </summary>
        string EventTreePath { get; set; }
        /// <summary>
        /// 延迟执行
        /// </summary>
        int EventDelayTimeMS { get; set; }

        /// <summary>
        /// 临时变量
        /// </summary>
        List<LocalVar> EventLocalVars { get; }
        /// <summary>
        /// 事件触发
        /// </summary>
        List<AbstractTrigger> EventTriggers { get; }
        /// <summary>
        /// 条件
        /// </summary>
        List<AbstractCondition> EventConditions { get; }
        /// <summary>
        /// 动作
        /// </summary>
        List<AbstractAction> EventActions { get; }

        /// <summary>
        /// 功能文本
        /// </summary>
        /// <returns></returns>
        string FunctionText();
    }


    [DescAttribute("临时变量")]
    [Expandable]
    public abstract class LocalVar
    {
        [DescAttribute("变量名")]
        public string Key = "LocalVarName";
        public abstract object GetValue(IEditorValueAdapter api, EventArguments args);
        public abstract object GetAbstractValue();
    }
    [DescAttribute("触发事件")]
    [Expandable]
    public abstract class AbstractTrigger : IDisposable
    {
        abstract public void Listen(EventTriggerAdapter api, EventArguments args);
        virtual public void Dispose() { }
    }
    [DescAttribute("条件")]
    [Expandable]
    public abstract class AbstractCondition : IDisposable
    {
        abstract public bool Test(EventTriggerAdapter api, EventArguments args);
        virtual public void Dispose() { }
    }
    [DescAttribute("动作")]
    [Expandable]
    public abstract class AbstractAction : IDisposable
    {
        abstract public void DoAction(EventTriggerAdapter api, EventArguments args);
        virtual public void Dispose() { }
    }
    [DescAttribute("抽象值")]
    [Expandable]
    public abstract class AbstractValue<T> : IEditorValue
    {
        abstract public T GetValue(IEditorValueAdapter api, EventArguments args);

        public object GetEnvValue(IEditorValueAdapter api)
        {
            return GetValue(api, new EventArguments());
        }
    }
}