/* 
 * 程序功能:
 * 举臂移动    MoveTo(移动目标点,速度)
 * 举臂复位    ActionReset()
 */
using System;
using System.Collections.Generic;
using System.Linq;
using AX.InputSystem;
using AX.MessageSystem;
using UnityEngine;
/// <summary>
/// 手臂动作
/// </summary>
public class ArmAction : MonoBehaviour
{
    /// <summary>
    /// 可伸缩的起始点
    /// </summary>
    public Transform StartTrans;
    /// <summary>
    /// 可伸缩的结束点
    /// </summary>
    public Transform EndTrans;
    private List<ArmActionFrame> list;
    Queue<ArmActionFrame> actions = new Queue<ArmActionFrame>();
    [HideInInspector]
    public Vector3 targetPosition;
    public bool IsArm;
    private void Awake()
    {
        list = GetComponentsInChildren<ArmActionFrame>().ToList();
    }
    private void OnEnable()
    {
        if (list == null)
        {
            list = GetComponentsInChildren<ArmActionFrame>().ToList();
        }
    }
    private void Start()
    {
        MessageDispatcher.AddListener("AUTO_LIFT_TRUCK_ARM_COMMAND", AutoArm);
    }

    private void AutoArm(IMessage message)
    {
        var gameObjID = (long)message.Sender;
        if (gameObjID == GetComponent<BaseGameObjInfo>().GameObjID)
        {
            //var targetPosition = ((TargetCmdArgs)message.Data).targetPosition;
            //MoveTo(targetPosition, 20f);
            IsArm = true;
        }
    }

    private void OnDestroy()
    {
        MessageDispatcher.RemoveListener("AUTO_LIFT_TRUCK_ARM_COMMAND", AutoArm);
    }
    /// <summary>
    /// 举臂移动
    /// </summary>
    /// <param name="position"></param>
    /// <param name="speed"></param>
    public void MoveTo(Vector3 position, float speed)
    {
        targetPosition = position;
        //根据帧索引升序排列
        actions.Clear();
        list = list.OrderBy(o => o.FrameIndex).ToList();
        //向队列中添加动作
        foreach (var item in list)
        {
            item.Speed = speed;
            item.OnFinished = MoveNext;
            actions.Enqueue(item);
        }
        //移动前停止
        Stop();
        //下一次移动
        MoveNext();
    }
    /// <summary>
    /// 停止所有帧动画
    /// </summary>
    private void Stop()
    {
        //先停止所有帧动作
        foreach (var item in actions)
        {
            item.Stop();
        }
    }
    /// <summary>
    /// 复位
    /// </summary>
    public void ActionReset()
    {
        IsArm = false;
        //根据帧索引倒序排列
        actions.Clear();
        list = list.OrderByDescending(o => o.FrameIndex).ToList();
        //向队列中添加动作
        foreach (var item in list)
        {
            item.OnFinished = ResetNext;
            actions.Enqueue(item);
        }
        //移动前停止
        Stop();
        //下一次移动
        ResetNext();
    }
    /// <summary>
    /// 下一次移动
    /// </summary>
    private void MoveNext()
    {
        //如果动画队列中还有动作,继续播放
        if (actions.Count > 0)
        {
            //从队列中取出动作
            ArmActionFrame action = actions.Dequeue();
            action.Play();
            //action.OnFinished = MoveNext;
        }
        //else
        //{
        //    //检查高度是否合适
        //    float temp = Vector3.Distance(targetPosition,EndTrans.position);
        //    //如果temp<16抬高手臂
        //    if (temp<16)
        //    {
        //        ArmActionFrame action = list[1];
        //        action.MoveUp();
        //    }
        //    else
        //    {
        //        ArmActionFrame action = actions.Dequeue();
        //        action.Play();
        //    }
        //}
    }
    /// <summary>
    /// 下一次复位
    /// </summary>
    private void ResetNext()
    {
        //如果动画队列中还有动作,继续播放
        if (actions.Count > 0)
        {
            //从队列中取出动作
            ArmActionFrame action = actions.Dequeue();
            action.ResetArm();
            //action.OnFinished = ResetNext;
        }
    }
}