//-----------------------------------------------------------------------------
// Copyright 2015-2024 RenderHeads Ltd.  All rights reserved.
//-----------------------------------------------------------------------------

using RenderHeads.Media.AVProVideo;
using UnityEngine;
using UnityEngine.UI;

public class OptionsMenu : MonoBehaviour
{
	[Header("Media Player")]
	[SerializeField] private MediaPlayer _MediaPlayer;

	[Header("Page Game Objects")]
	[SerializeField] private GameObject					_MainMenuGO;
	[SerializeField] private GameObject					_VideoTrackMenuGO;
	[SerializeField] private GameObject					_AudioTrackMenuGO;
	[SerializeField] private GameObject					_SubtitlesMenuGO;
	[SerializeField] private GameObject					_PlaybackSpeedMenuGO;
	[SerializeField] private GameObject					_QualityMenuGO;

	[Header("Buttons")]
	[SerializeField] private Button						_VideoTrackButton;
	[SerializeField] private Button						_AudioTrackButton;
	[SerializeField] private Button						_SubtitlesButton;
	[SerializeField] private Button						_PlaybackSpeedButton;
	[SerializeField] private Button						_QualityButton;

	[Header("Pages")]
	[SerializeField] private OptionsVideoTrackPage		_OptionsVideoTrackPage;
	[SerializeField] private OptionsAudioTrackPage		_OptionsAudioTrackPage;
	[SerializeField] private OptionsSubtitlesPage		_OptionsSubtitlesPage;
	[SerializeField] private OptionsPlaybackSpeedPage	_OptionsPlaybackSpeedPage;
	[SerializeField] private OptionsQualityPage			_OptionsQualityPage;

	[Header("Text")]
	[SerializeField] private Text						_VideoTrackValueText;
	[SerializeField] private Text						_AudioTrackValueText;
	[SerializeField] private Text						_SubtitlesValueText;
	[SerializeField] private Text						_PlaybackSpeedValueText;
	[SerializeField] private Text						_QualityValueText;

	private int m_iCachedVideoWidth			= -1;
	private int m_iCachedVideoHeight		= -1;
	private float m_fCachedVideoFramerate	= -1.0f;
	private int m_iCachedVariantId			= -1;

	void Start()
	{
		if( _VideoTrackButton )
		{
			_VideoTrackButton.onClick.AddListener( delegate
			{
				if( _MediaPlayer && _MediaPlayer.VideoTracks.GetVideoTracks().Count > 1 )
				{
					MainToVideoTrack();
				}
			} );
		}

		if( _AudioTrackButton )
		{
			_AudioTrackButton.onClick.AddListener( delegate
			{
				if( _MediaPlayer && _MediaPlayer.AudioTracks.GetAudioTracks().Count > 1 )
				{
					MainToAudioTrack();
				}
			} );
		}

		if( _SubtitlesButton )
		{
			_SubtitlesButton.onClick.AddListener( delegate
			{
				if( _MediaPlayer && _MediaPlayer.TextTracks.GetTextTracks().Count > 0 )
				{
					MainToSubtitles();
				}
			} );
		}

		if( _PlaybackSpeedButton )
		{
			_PlaybackSpeedButton.onClick.AddListener( delegate
			{
				MainToPlaybackSpeed();
			} );
		}

		if( _QualityButton )
		{
			_QualityButton.onClick.AddListener( delegate
			{
				if( _MediaPlayer.Variants != null && _MediaPlayer.Variants.Count > 0 )
				{
					MainToQuality();
				}
			} );
		}
	}

	void Update()
	{
		if( _MainMenuGO && _MainMenuGO.activeInHierarchy &&
			_QualityValueText &&
			_MediaPlayer )
		{
			int iWidth = _MediaPlayer.Info.GetVideoWidth();
			int iHeight = _MediaPlayer.Info.GetVideoHeight();
			float fFramerate = _MediaPlayer.Variants.Current.FrameRate;
			int iCurrentVariantId = _MediaPlayer.Variants.Current.Id;

			//Debug.Log($"OptionsMenu.Update() - iWidth: {iWidth}, iHeight: {iHeight}, fFramerate: {fFramerate}, iCurrentVariantId: {iCurrentVariantId}");

			if (iWidth != m_iCachedVideoWidth || iHeight != m_iCachedVideoHeight || m_fCachedVideoFramerate != fFramerate || m_iCachedVariantId != iCurrentVariantId )
			{
				if (_MediaPlayer.Variants.Count > 1)
				{
					if (iCurrentVariantId == Variant.Auto.Id)
					{
						if( fFramerate > 0.0f )
						{
							_QualityValueText.text = $"Auto ({iWidth}x{iHeight}@{fFramerate}) >";
						}
						else
						{
							_QualityValueText.text = $"Auto ({iWidth}x{iHeight}) >";
						}
					}
					else
					{
						if( fFramerate > 0.0f )
						{
							_QualityValueText.text = $"{iWidth}x{iHeight}@{fFramerate} >";
						}
						else
						{
							_QualityValueText.text = $"{iWidth}x{iHeight} >";
						}
					}
				}
				else
				{
					if( fFramerate > 0.0f )
					{
						_QualityValueText.text = $"{iWidth}x{iHeight}@{fFramerate} >";
					}
					else
					{
						_QualityValueText.text = $"{iWidth}x{iHeight}";
					}
				}

				m_iCachedVideoWidth = iWidth;
				m_iCachedVideoHeight = iHeight;
				m_fCachedVideoFramerate = fFramerate;
				m_iCachedVariantId = iCurrentVariantId;
			}
		}
	}

	public void SetActive( bool bShowOptions )
	{
		if( _MainMenuGO )
		{
			_MainMenuGO.SetActive( bShowOptions );
		}

		if( _VideoTrackMenuGO )
		{
			_VideoTrackMenuGO.SetActive( false );
		}

		if( _AudioTrackMenuGO )
		{
			_AudioTrackMenuGO.SetActive( false );
		}

		if ( _SubtitlesMenuGO )
		{
			_SubtitlesMenuGO.SetActive( false );
		}

		if( _PlaybackSpeedMenuGO )
		{
			_PlaybackSpeedMenuGO.SetActive( false );
		}

		if( _QualityMenuGO )
		{
			_QualityMenuGO.SetActive( false );
		}

		if( bShowOptions )
		{
			if( _MediaPlayer)
			{
				ChangeVideoTrack( _MediaPlayer.VideoTracks.GetVideoTracks().GetActiveTrackIndex(), false );
				ChangeAudioTrack( _MediaPlayer.AudioTracks.GetAudioTracks().GetActiveTrackIndex(), false );
				ChangeSubtitleTrack( _MediaPlayer.TextTracks.GetTextTracks().GetActiveTrackIndex(), false );
			}
		}
	}

	public void ChangeVideoTrack( int iTrackIndex, bool bSetTrack = true )
	{
		if( _OptionsVideoTrackPage )
		{
			_OptionsVideoTrackPage.ChangeVideoTrack( iTrackIndex, bSetTrack );
		}
		if( _VideoTrackValueText )
		{
			VideoTrack videoTrack = ( _MediaPlayer ) ? _MediaPlayer.VideoTracks.GetActiveVideoTrack() : null;
			if( videoTrack != null )
			{
				_VideoTrackValueText.text = "None";

				int iNumVideoTracks = _MediaPlayer.VideoTracks.GetVideoTracks().Count;
				if ( iNumVideoTracks > 0 )
				{
					_VideoTrackValueText.text = videoTrack.DisplayName + ( iNumVideoTracks > 1 ? "  >" : "" );
				}
			}
		}
	}

	public void ChangeAudioTrack( int iTrackIndex, bool bSetTrack = true )
	{
		if( _OptionsAudioTrackPage )
		{
			_OptionsAudioTrackPage.ChangeAudioTrack( iTrackIndex, bSetTrack );
		}
		if( _AudioTrackValueText )
		{
			AudioTrack audioTrack = ( _MediaPlayer ) ? _MediaPlayer.AudioTracks.GetActiveAudioTrack() : null;
			if( audioTrack != null )
			{
				_AudioTrackValueText.text = "None";

				int iNumAudioTracks = _MediaPlayer.AudioTracks.GetAudioTracks().Count;
				if( iNumAudioTracks > 0 )
				{
					_AudioTrackValueText.text = audioTrack.DisplayName + ( iNumAudioTracks > 1 ? "  >" : "" );
				}
			}
		}
	}

	public void ChangeSubtitleTrack( int iTrackUid, bool bSetTrack = true )
	{
		if( _OptionsSubtitlesPage )
		{
			_OptionsSubtitlesPage.ChangeSubtitleTrack( iTrackUid, bSetTrack );
		}
		if( _SubtitlesValueText )
		{
			TextTracks textTracks = ( _MediaPlayer ) ? _MediaPlayer.TextTracks.GetTextTracks() : null;
			if( textTracks != null )
			{
				_SubtitlesValueText.text = "None";

				if ( textTracks.Count > 0 )
				{
					int iTrackIndex = _MediaPlayer.TextTracks.GetTextTrackArrayIndexFromUid( iTrackUid );
					_SubtitlesValueText.text = ( ( iTrackIndex > -1 ) ? ( textTracks[ iTrackIndex ].DisplayName ) : "Off" ) + "  >";
				}
			}
		}
	}

	public void ChangePlaybackSpeed( int iIndex )
	{
		if( _OptionsPlaybackSpeedPage )
		{
			_OptionsPlaybackSpeedPage.ChangeVideoPlaybackSpeed(iIndex);

			if( _PlaybackSpeedValueText )
			{
				TextTracks textTracks = ( _MediaPlayer ) ? _MediaPlayer.TextTracks.GetTextTracks() : null;
				if( textTracks != null )
				{
					_PlaybackSpeedValueText.text = _OptionsPlaybackSpeedPage.GetDisplayNameForIndex( iIndex ) + "  >";
				}
			}
		}
	}

	public void ChangeVideoVariant( int iVariantIndex )
	{
		if( _OptionsQualityPage )
		{
			_OptionsQualityPage.ChangeVideoVariant( iVariantIndex );
		}
	}

	public void MainToVideoTrack()
	{
		if ( _MainMenuGO )
		{
			_MainMenuGO.SetActive( false );
		}

		if( _VideoTrackMenuGO )
		{
			_VideoTrackMenuGO.SetActive( true );
		}
	}

	public void VideoTrackToMain()
	{
		if( _MainMenuGO )
		{
			_MainMenuGO.SetActive( true );
		}

		if( _VideoTrackMenuGO )
		{
			_VideoTrackMenuGO.SetActive( false );
		}
	}

	public void MainToAudioTrack()
	{
		if ( _MainMenuGO )
		{
			_MainMenuGO.SetActive( false );
		}

		if( _AudioTrackMenuGO )
		{
			_AudioTrackMenuGO.SetActive( true );
		}
	}

	public void AudioTrackToMain()
	{
		if( _MainMenuGO )
		{
			_MainMenuGO.SetActive( true );
		}

		if( _AudioTrackMenuGO )
		{
			_AudioTrackMenuGO.SetActive( false );
		}
	}

	public void MainToSubtitles()
	{
		if( _MainMenuGO )
		{
			_MainMenuGO.SetActive( false );
		}

		if( _SubtitlesMenuGO )
		{
			_SubtitlesMenuGO.SetActive( true );
		}
	}

	public void SubtitlesToMain()
	{
		if ( _MainMenuGO )
		{
			_MainMenuGO.SetActive( true );
		}

		if ( _SubtitlesMenuGO )
		{
			_SubtitlesMenuGO.SetActive( false );
		}
	}

	public void MainToPlaybackSpeed()
	{
		if ( _MainMenuGO )
		{
			_MainMenuGO.SetActive( false );
		}

		if ( _PlaybackSpeedMenuGO )
		{
			_PlaybackSpeedMenuGO.SetActive( true );
		}
	}

	public void PlaybackSpeedToMain()
	{
		if ( _MainMenuGO )
		{
			_MainMenuGO.SetActive( true );
		}

		if ( _PlaybackSpeedMenuGO )
		{
			_PlaybackSpeedMenuGO.SetActive( false );
		}
	}

	public void MainToQuality()
	{
		if (_MediaPlayer.Variants == null || _MediaPlayer.Variants.Count < 2 )
		{
			return;
		}

		if ( _MainMenuGO )
		{
			_MainMenuGO.SetActive( false );
		}

		if ( _QualityMenuGO )
		{
			_QualityMenuGO.SetActive( true );
		}
	}

	public void QualityToMain()
	{
		if ( _MainMenuGO )
		{
			_MainMenuGO.SetActive( true );
		}

		if ( _QualityMenuGO )
		{
			_QualityMenuGO.SetActive( false );
		}
	}
}