using CommonAI.Zone.Attributes;
using CommonAI.Zone.Instance;
using CommonLang.Property;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommonAI.Zone.EventTrigger;
using CommonAI.Zone.Helper;

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{

    [DescAttribute("触发的任务ID", "任务")]
    public class TriggingQuestIdentify : StringValue
    {
        public override string ToString()
        {
            return string.Format("触发的任务");
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            return args.TriggingQuestID;
        }
    }

    [DescAttribute("单位任务子状态查询", "任务")]
    public class GetQuestField : StringValue
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("任务ID")]
        public StringValue QuestID = new TriggingQuestIdentify();
        [DescAttribute("任务子状态字段")]
        public StringValue Key = new StringValue.VALUE("key");

        public override string ToString()
        {
            return string.Format("单位[{0}]任务[{1}]子状态[{2}]", Unit, QuestID, Key);
        }
        public override string GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstancePlayer p = Unit.GetValue(api, args) as InstancePlayer;
            if (p != null)
            {
                string quest_id = QuestID.GetValue(api, args);
                string key = Key.GetValue(api, args);
                if (!string.IsNullOrEmpty(quest_id) && !string.IsNullOrEmpty(key))
                {
                    QuestData qd = p.GetQuest(quest_id);
                    if (qd != null)
                    {
                        return qd.Attributes.Get(key);
                    }
                }
            }
            return null;
        }
    }


    [DescAttribute("单位任务主状态判断", "任务")]
    public class GetQuestState : BooleanValue
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("任务ID")]
        public StringValue QuestID = new TriggingQuestIdentify();
        [DescAttribute("预期任务状态")]
        public QuestState ExpectState = QuestState.Accepted;

        public override string ToString()
        {
            return string.Format("单位[{0}]任务[{1}]状态是否为{2}", Unit, QuestID, ExpectState);
        }
        public override Boolean GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstancePlayer p = Unit.GetValue(api, args) as InstancePlayer;
            if (p != null)
            {
                string quest_id = QuestID.GetValue(api, args);
                if (!string.IsNullOrEmpty(quest_id))
                {
                    QuestData qd = p.GetQuest(quest_id);
                    if (qd != null)
                    {
                        return qd.State == ExpectState;
                    }
                }
            }
            return false;
        }
    }



    [DescAttribute("任务是否已接受", "任务")]
    public class QuestAccepted : BooleanValue
    {
        [DescAttribute("单位 - 某个单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [QuestIDAttribute]
        [DescAttribute("任务ID")]
        public string Quest;
        public override string ToString()
        {
            return string.Format("任务[{0}]是否已接受", Quest);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstancePlayer p = Unit.GetValue(api, args) as InstancePlayer;
            if (p != null)
            {
                return p.IsQuestAccepted(Quest);
            }
            return false;
        }
    }

    [DescAttribute("任务是否已接受(变量)", "任务")]
    public class QuestAcceptedSV : BooleanValue
    {
        [DescAttribute("单位 - 某个单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("任务ID")]
        public StringValue QuestID = new TriggingQuestIdentify();
        public override string ToString()
        {
            return string.Format("任务[{0}]是否已接受", QuestID);
        }
        public override bool GetValue(IEditorValueAdapter api, EventArguments args)
        {
            InstancePlayer p = Unit.GetValue(api, args) as InstancePlayer;
            string questID = QuestID.GetValue(api, args);
            if (p != null)
            {
                return p.IsQuestAccepted(questID);
            }
            return false;
        }
    }

}