using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

namespace WS
{
    public class InteractObjsComponent : OperateComponent<InteractObjsData>
    {
        ///<summary>音频实例</summary>
        private VoiceEntity Voice;

        ///<summary>音效实例</summary>
        private VoiceEntity EffectVoice;

        ///<summary>交互的父物体</summary>
        private GameObject InteractObjParent;

        ///<summary>可交互物体</summary>
        private List<GameObject> InteractObjs = new List<GameObject>();

        ///<summary>动画组件</summary>
        private Animator anim;

        ///<summary>流程管理器</summary>
        private ProcessManager processManager;

        ///<summary>动画组件</summary>
        private AnimatorComponent animatorComponent;

        public override void Init()
        {
            processManager = GameManager.Instance.ProcessManager;
            InteractObjParent = GameObject.Find(OperateData.InteractName);
            if (!string.IsNullOrEmpty(OperateData.AnimationName))
            {
                anim = InteractObjParent.transform.GetComponent<Animator>();
            }
            for (int i = 0; i < InteractObjParent.transform.childCount; i++)
            {
                InteractObjs.Add(InteractObjParent.transform.GetChild(i).gameObject);
            }
        }

        public override void StartOperate()
        {
            SetInteractObjStatus(true);
            animatorComponent = AddComponent<AnimatorComponent>();
            if (!string.IsNullOrEmpty(OperateData.AnimationName))
            {
                animatorComponent.InitInteractAnim(
                    OperateData.InteractName,
                    OperateData.AnimationName
                );
            }
            if (OperateData.AnswerObjDataList.Count > 0)
            {
                animatorComponent.InitAnswerAnim(OperateData.AnswerObjDataList);
            }

            HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 7);
            switch (GameManager.Instance.Data.Pattern)
            {
                case PatternType.教学:
                    Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName);
                    HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 7);
                    break;
                case PatternType.练习:
                    Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName);
                    break;
                case PatternType.考核:
                    break;
            }
        }

        public override async void Update()
        {
            //if (VRInputComponent.Instance.OperateObject != null)
            //{
            //    GameObject Obj = InteractObjs.Find((x) => { return x == VRInputComponent.Instance.OperateObject; });
            //    if (VRInputComponent.Instance.OperateObject == Obj)
            //    {
            //        if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand))
            //        {
            //            VoiceManager.Instance.Play(VoiceType.Effects, OperateData.AudioEffect);
            //            HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 6);
            //            AnimatorComponent component = GetComponent<AnimatorComponent>();
            //            await component.PlayAnimSerial(() =>
            //            {
            //                IsComplete = true;
            //            });
            //            SetInteractObjStatus(false);
            //        }
            //    }
            //    else
            //    {
            //        if (VRInputComponent.Instance.GetKeyDown(VRKey.扳机, VRInputComponent.Instance.GetSelectPointer.Hand))
            //        {
            //            processManager.GetVTaskRecord(processManager.GetCurrentModule().VTaskId).IsError = true;
            //        }
            //    }
            //}
        }

        public override void Prompt() { }

        public override Task StartState()
        {
            InteractObjParent = GameObject.Find(OperateData.InteractName);
            HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 6);
            if (!string.IsNullOrEmpty(OperateData.AnimationName))
            {
                anim = InteractObjParent.transform.GetComponent<Animator>();
                anim.Play(OperateData.AnimationName, -1, 0f);
                anim.speed = 0f;
                SceneDataSaveComponent.Instance.RemoveSceneData(
                    SceneComponent.Instance.ThisScene,
                    OperateData.InteractName,
                    OperateData.AnimationName
                );
            }

            for (int i = 0; i < OperateData.AnswerObjDataList.Count; i++)
            {
                GameObject answerObj = GameObject.Find(OperateData.AnswerObjDataList[i].AnswerName);
                string animName = OperateData.AnswerObjDataList[i].AnswerAnimName;
                if (!string.IsNullOrEmpty(animName))
                {
                    Animator answerAnim = answerObj.transform.GetComponent<Animator>();
                    answerAnim.Play(animName, -1, 0f);
                    answerAnim.speed = 0f;
                    SceneDataSaveComponent.Instance.RemoveSceneData(
                        SceneComponent.Instance.ThisScene,
                        OperateData.AnswerObjDataList[i].AnswerName,
                        OperateData.AnswerObjDataList[i].AnswerAnimName
                    );
                }
            }
            SetInteractObjStatus(false);
            IsComplete = false;
            return Task.CompletedTask;
        }

        public override Task EndState()
        {
            HighlightComponent.Instance.SetOperateObjLayer(InteractObjParent.transform, 6);
            if (!string.IsNullOrEmpty(OperateData.AnimationName))
            {
                anim.Play(OperateData.AnimationName, -1, 1);
                SceneDataSaveComponent.Instance.AddSceneData(
                    SceneComponent.Instance.ThisScene,
                    OperateData.InteractName,
                    OperateData.AnimationName
                );
            }

            for (int i = 0; i < OperateData.AnswerObjDataList.Count; i++)
            {
                GameObject answerObj = GameObject.Find(OperateData.AnswerObjDataList[i].AnswerName);
                string animName = OperateData.AnswerObjDataList[i].AnswerAnimName;
                if (!string.IsNullOrEmpty(animName))
                {
                    Animator answerAnim = answerObj.transform.GetComponent<Animator>();
                    answerAnim.Play(animName, -1, 1f);
                    SceneDataSaveComponent.Instance.RemoveSceneData(
                        SceneComponent.Instance.ThisScene,
                        OperateData.AnswerObjDataList[i].AnswerName,
                        OperateData.AnswerObjDataList[i].AnswerAnimName
                    );
                }
            }
            SetInteractObjStatus(false);

            IsComplete = true;
            return Task.CompletedTask;
        }

        /// <summary>
        /// 设置交互物体的交互和显示状态
        /// </summary>
        /// <param name="enabled"></param>
        private void SetInteractObjStatus(bool enabled)
        {
            if (OperateData.BeforeEnable)
            {
                Renderer[] renderers = InteractObjParent.GetComponentsInChildren<Renderer>();
                for (int i = 0; i < renderers.Length; i++)
                {
                    renderers[i].enabled = enabled;
                }
            }
            if (OperateData.InteractInside)
            {
                Collider[] colliders = InteractObjParent.GetComponentsInChildren<Collider>();
                for (int i = 0; i < colliders.Length; i++)
                {
                    colliders[i].enabled = enabled;
                }
            }
        }

        public override void Dispose()
        {
            base.Dispose();
            if (Voice != null)
            {
                if (!Voice.IsDisposed)
                    VoiceManager.Instance.Stop(Voice);
                Voice = null;
            }
            if (EffectVoice != null)
            {
                if (!EffectVoice.IsDisposed)
                    VoiceManager.Instance.Stop(EffectVoice);
                EffectVoice = null;
            }
            InteractObjParent = null;
        }
    }

    public class InteractObjsData
    {
        ///<summary>交互物体</summary>
        public string InteractName;

        ///<summary>动画名称</summary>
        public string AnimationName;

        ///<summary> 是否为临时物体 </summary>
        public bool BeforeEnable;

        ///<summary>响应物体列表</summary>
        public List<AnswerObjData> AnswerObjDataList = new List<AnswerObjData>();

        ///<summary>音频名称</summary>
        public string AudioName;

        ///<summary>交互音效</summary>
        public string AudioEffect;

        ///<summary> 是否有内部交互物体 </summary>
        public bool InteractInside;

        ///<summary> 同时播放动画 </summary>
        public bool IsSimulAni;
    }
}