namespace BehaviorTreeSlayer
{
    public class Sequence : CompositeNode
    {
        private TreeNode last;

        public override void Enter(object args)
        {
            Index = 0;
        }
        public override void Add(TreeNode component)
        {
            base.Add(component);
            Index = 0;
            state = TaskResult.None;
        }
        public override TaskResult Tick(double dt, object args = null)
        {
            childs.Sort((a, b) => a.x < b.x ? -1 : 1);
            for (int i = Index; i < childs.Count; i++)
            {
                if (last != childs[i])
                {
                    childs[i].Enter(args);
                }
                TaskResult rst = childs[i].Tick(dt, args);
                childs[i].state = rst;
                last = childs[i];
                if (rst == TaskResult.OK || rst == TaskResult.None)
                {
                    childs[i].Exit(args);
                    Index = i + 1;
                }
                else if (rst == TaskResult.Running)
                {
                    bool cdt = true;
                    int cdtCount = 0;
                    for (int j = 0; j < i; j++)
                    {
                        if (childs[j] is ConditionalNode)
                        {
                            cdtCount++;
                            cdt &= (childs[j] as ConditionalNode).Check(dt, args);
                        }
                    }
                    if (cdt && cdtCount > 0)
                    {
                        for (int j = 0; j < i; j++)
                        {
                            if (childs[j] is ConditionalNode)
                            {
                                (childs[j] as ConditionalNode).IsConditionOK = false;
                            }
                        }
                        childs[i].Exit(args);
                        Index = i + 1;
                        return TaskResult.OK;
                    }
                    return TaskResult.Running;
                }
                else
                {
                    childs[i].Exit(args);
                    Index = i + 1;
                    return TaskResult.Fail;
                }
            }
            return TaskResult.OK;
        }
    }

}