using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class PassManager : MonoBehaviour
{
    public static PassManager Instance = null;

    [Header("动画事件")]
    public AniAction aniAction;
    [Header("相机点位")]
    public List<Transform> cameraPoints;
    [Header("操作步骤")]
    public List<GameObject> ctrlPartList;
    [Header("动画部件")]
    public Animator studentAni;
    public Animator[] npcAni;
    [Header("历史操作")]
    public Transform hisitoryInfoParent;
    [Header("关卡提示")]
    public TextWrite PartTipText;
    public List<string> PartTipTxtList;
    public Text errorTip;
    public Text npcStateTxt;
    public Text timeTipTxt;
    public GameObject timeOutTip;

    private float timer = 0f;
    public bool isTest = false;
    [HideInInspector]
    public bool isEnd = false;

    private AudioSource audioSource;

    private Dictionary<string, Action> AniActionDict = new Dictionary<string, Action>();


    private void Awake()
    {
        Instance = this;
    }
    private void Start()
    {
        StartTimeAction(6, () =>
        {
            ChangeCameraPoint(1);

            SetTip(1, () => { SetCtrlPart(1); });

        });
        audioSource = GetComponent<AudioSource>();
        InitAniAction();
    }

    private void Update()
    {
        if (isTest&&!isEnd)
        {
            timer += Time.deltaTime;
            timeTipTxt.text = (240-timer).ToString("0");
            if (timer >= (240))
            {
                //提示通关失败
                timeOutTip.gameObject.SetActive(true);
                isEnd = true;
            }
        }
    }

    /// <summary>
    /// 动画事件,每关单独做出来
    /// </summary>
    private void InitAniAction()
    {

        aniAction.InitAniAction();

    }


    #region 流程函数

    public void SetNpcSate(string str)
    {
        npcStateTxt.text = str;
    }

    /// <summary>
    /// 错误提示
    /// </summary>
    /// <param name="str"></param>
    public void AddTip(string str)
    {
        errorTip.text = str;
        errorTip.transform.parent.gameObject.SetActive(true);
        StartTimeAction(2f, () => { errorTip.transform.parent.gameObject.SetActive(false); });
    }
    public void ErrorTip()
    {
        errorTip.GetComponent<Text>().text = "操作有误,请重新考虑并选择";
        errorTip.transform.parent.gameObject.SetActive(true);
        StartTimeAction(2f, () => { errorTip.transform.parent.gameObject.SetActive(false); });
    }
    public void ErrorTip(string str)
    {
        errorTip.transform.parent.gameObject.SetActive(true);
        errorTip.GetComponent<Text>().text = str;
        StartTimeAction(2f, () => { errorTip.transform.parent.gameObject.SetActive(false); });
    }

    public void ChangeCameraPoint(int index)
    {
        if (cameraPoints.Count < index) return;
        Camera.main.transform.DOMove(cameraPoints[index - 1].position, 1f);
        Camera.main.transform.DORotate(cameraPoints[index - 1].eulerAngles, 1f);
    }

    //设置提示
    public void SetTip(int index)
    {

        PartTipText.ChangeText(PartTipTxtList[index - 1]);
    }
    public void SetTip(int index, Action action)
    {

        PartTipText.ChangeText(PartTipTxtList[index - 1], action);
    }
    public void SetTip(string str)
    {

        PartTipText.ChangeText(str);
    }
    /// <summary>
    /// 设置操作步骤部件
    /// </summary>
    /// <param name="index"></param>
    public void SetCtrlPart(int index)
    {
        for (int i = 0; i < ctrlPartList.Count; i++)
        {
            if (i == index - 1)
            {
                ctrlPartList[i].SetActive(true);
                continue;
            }
            ctrlPartList[i].SetActive(false);
        }
    }

    public void SetStudentAni(string aniName)
    {
        //播放动画
        studentAni.Play(aniName);
        Action action = aniAction.GetAction(aniName);
        if (action != null)
        {
            // 获取AnimatorController
            //var controller = studentAni.runtimeAnimatorController as AnimatorController;

            AnimationClip[] clips = studentAni.runtimeAnimatorController.animationClips;
            AnimationClip clip = null;
            for (int i = 0; i < clips.Length; i++)
            {
                if (clips[i].name == aniName)
                {
                    clip = clips[i];
                }
            }
            // 获取名为"Walk"的AnimationClip
           // AnimationClip clip = controller.animationClips.FirstOrDefault(x => x.name == aniName);
            //获取动画cilp的时间
            float time = clip.length;
            Debug.Log(time);
            StartTimeAction(time, () =>
            {
                action.Invoke();
            });
        }
    }

    public void SetNpcAni(string AniName)
    {
        for (int i = 0; i < npcAni.Length; i++)
        {
            npcAni[i].Play(AniName);
        }
        Debug.Log("NPC动画");
    }

    public void AddHisitoryInfo(string info)
    {
        GameObject go = GameObject.Instantiate(Resources.Load<GameObject>("Prefab/hisitoryText"), hisitoryInfoParent);
        Text txt = go.GetComponent<Text>();
        int index = go.transform.GetSiblingIndex() + 1;
        txt.text = index + "-" + info;
    }


    public void PassOver()
    {
        AddTip("恭喜通关");
        //向平台发送通关
        
    }

    public void LoadScene(string sceneName)
    {
        SceneManager.LoadScene(sceneName);
    }

    #endregion



    public void PlayAudio(AudioClip clip)
    {
        if (clip != null)
        {
            audioSource.clip = clip;
            audioSource.Play();
        }
    }


    public void StartTimeAction(float time, Action action)
    {
        StartCoroutine(TimeAction(time, action));
    }
    IEnumerator TimeAction(float time, Action action)
    {

        yield return new WaitForSeconds(time);
        action.Invoke();

    }


}