using System.Threading.Tasks;
using UnityEngine;
using WS;

public class LoadSceneComponent : OperateComponent<LoadSceneData>
{
    private MapController mapPop;

    ///<summary>��Ƶʵ��</summary>
    private VoiceEntity Voice;

    public override void Init() { }

    public override void StartOperate()
    {
        //switch (GameManager.Instance.Data.Pattern)
        //{
        //    case PatternType.��ѧ:
        //        break;
        //    case PatternType.��ϰ:
        //        break;
        //    case PatternType.����:
        //        break;
        //}
        GameManager.Instance.Data.pos = Player.Inst.transform.position;
        GameManager.Instance.Data.rot = Player.Inst.transform.rotation;
        Voice = VoiceManager.Instance.Play(VoiceType.Voice, OperateData.AudioName);
        mapPop = FacadeComponent.Instance.CreateController<MapController>();
        mapPop.OpenView();
        mapPop.SetView(
            OperateData.endSceneName,
            () =>
            {
                if (Player.Inst.gameObject != null)
                {
                    Player.Inst.transform.position = OperateData.pos;
                    Player.Inst.transform.rotation = Quaternion.Euler(OperateData.rot);
                }
                IsComplete = true;
            }
        );
    }

    public override async Task StartState()
    {
        if (OperateData.startSceneName == SceneName.None)
        {
            return;
        }
        if (mapPop != null)
        {
            mapPop.CloseView();
        }
        Player.Inst.transform.position = GameManager.Instance.Data.pos;
        Player.Inst.transform.rotation = GameManager.Instance.Data.rot;
        if (OperateData.startSceneName.ToString() != SceneComponent.Instance.ThisScene)
        {
            if (OperateData.startSceneName == SceneName.������ͨ��)
            {
                await SceneComponent.Instance.LoadSceneAsync(SceneName.�������.ToString());
            }
            else
            {
                await SceneComponent.Instance.LoadSceneAsync(OperateData.startSceneName.ToString());
            }
            SceneDataSaveComponent.Instance.LoadScene(OperateData.startSceneName.ToString());
        }
        else
        {
            return;
        }
    }

    public override async Task EndState()
    {
        if (OperateData.endSceneName == SceneName.None)
        {
            return;
        }
        GameManager.Instance.Data.pos = Player.Inst.transform.position;
        GameManager.Instance.Data.rot = Player.Inst.transform.rotation;
        if (mapPop != null)
        {
            mapPop.CloseView();
        }
        if (Player.Inst.gameObject != null)
        {
            Player.Inst.transform.position = OperateData.pos;
            Player.Inst.transform.rotation = Quaternion.Euler(OperateData.rot);
        }
        await SceneComponent.Instance.LoadSceneAsync(OperateData.endSceneName.ToString());

        SceneDataSaveComponent.Instance.LoadScene(OperateData.endSceneName.ToString());
    }

    public override void Update() { }
}

public class LoadSceneData
{
    /// <summary> ��ʼ���� </summary>
    public SceneName startSceneName;

    /// <summary> Ŀ�곡�� </summary>
    public SceneName endSceneName;

    /// <summary> λ�õ� </summary>
    public string transferPoint;

    /// <summary> � </summary>
    public Vector3 pos;

    /// <summary> ��ת </summary>
    public Vector3 rot;

    ///<summary>��Ƶ����</summary>
    public string AudioName;
}