using UnityEngine;
using UnityEngine.UI;
using RememorySDK.API;

namespace RememorySDK.Sample
{
    public class SamplePlayer : MonoBehaviour
    {

        [SerializeField] RememoryPlayer rem_player;
        [SerializeField] private Button playButton;
        [SerializeField] private Button pauseButton;
        [SerializeField] private Button stopButton;
        [SerializeField] private Toggle audioMuteToggle;
        [SerializeField] private Toggle loopToggle;
        [SerializeField] private Toggle followCameraToggle;
        [SerializeField] private Dropdown meshTypeDD;
        [SerializeField] private Slider farClip;
        [SerializeField] private Slider nearClip;
        [SerializeField] private Slider depthEdgeSlider;
        [SerializeField] private Text farText;
        [SerializeField] private Text nearText;
        [SerializeField] private Text depthEdgeText;
        
        void OnEnable()
        {
            rem_player.OnCreated += OnCreatedPlayer;
        }

        void OnDisable()
        {
            rem_player.OnCreated -= OnCreatedPlayer;
        }

        void Start()
        {
            rem_player.CreatePlayer();

            loopToggle.onValueChanged.AddListener(isOn =>
            {
                rem_player.IsLoop = isOn;
            });

            audioMuteToggle.onValueChanged.AddListener(isOn =>
            {
                rem_player.IsAudioMute = isOn;
            });

            followCameraToggle.onValueChanged.AddListener(isOn =>
            {
                rem_player.IsFollowCamera = isOn;
            });

            meshTypeDD.onValueChanged.AddListener(value =>
            {
                switch (value)
                {
                    case 0:
                        rem_player.MeshModeType = MeshMode.Fatest;
                        break;
                    case 1:
                        rem_player.MeshModeType = MeshMode.Medium;
                        break;
                    case 2:
                        rem_player.MeshModeType = MeshMode.Best;
                        break;
                    default:
                        rem_player.MeshModeType = MeshMode.Medium;
                        Debug.LogWarning("An unexpected value has been specified.");
                        break;
                }
            });

            farClip.onValueChanged.AddListener(value =>
            {
                rem_player.FarClip = value;
                farText.text = $"FarClip : {value}";
            });

            nearClip.onValueChanged.AddListener(value =>
            {
                rem_player.NearClip = value;
                nearText.text = $"NearClip : {value}";
            });

            depthEdgeSlider.onValueChanged.AddListener(value =>
            {
                rem_player.DepthEdgeSensitivity = value;
                depthEdgeText.text = $"Depth Edge Sensitivity : {value}";
            });
        }

        public void OnCreatedPlayer()
        {
            AddListenerBotton();
            SetInitUIValue();

            rem_player.Speed = 1.0f;
            // Setting DepthEdgeSensitivity : 0.2
            rem_player.DepthEdgeSensitivity = 0.2f;

            OnClickPlay();
        }

        void SetInitUIValue()
        {
            audioMuteToggle.isOn = rem_player.IsAudioMute;
            loopToggle.isOn = rem_player.IsLoop;
            followCameraToggle.isOn = rem_player.IsFollowCamera;
            meshTypeDD.value = (int)rem_player.MeshModeType;
            farClip.value = rem_player.FarClip;
            nearClip.value = rem_player.NearClip;
            depthEdgeSlider.value = rem_player.DepthEdgeSensitivity;

            farText.text = $"FarClip : {farClip.value}";
            nearText.text = $"NearClip : {nearClip.value}";
            depthEdgeText.text = $"Depth Edge Sensitivity : {depthEdgeSlider.value}";
        }

        void AddListenerBotton()
        {
            playButton.onClick.AddListener(OnClickPlay);
            pauseButton.onClick.AddListener(OnClickPause);
            stopButton.onClick.AddListener(OnClickStop);
        }

        void OnClickPlay()
        {
            Debug.Log("OnClickPlay");
            rem_player.Play();
        }

        void OnClickPause()
        {
            Debug.Log("OnClickPause");
            rem_player.Pause();
        }

        void OnClickStop()
        {
            Debug.Log("OnClickStop");
            rem_player.Stop();
        }

    }
}