using RenderHeads.Media.AVProVideo;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

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

	[Header("Options Menu")]
	[SerializeField] private OptionsMenu	_OptionsMenu;

	[Header("Content")]
	[SerializeField] private Transform		_Content;
	[SerializeField] private RectTransform	_ScrollViewRectTransform;
	[SerializeField] private RectTransform	_ViewportRectTransform;
	[SerializeField] private GameObject		_PlaybackSpeedLinePrefab;


	private string	m_SetupForVideoPath;


	private class CPlaybackSpeedSet
	{
		public GameObject	m_LineGO		= null;
		public string		m_DisplayName	= "";
		public float		m_fRate			= 1.0f;
	}
	private List<CPlaybackSpeedSet>	m_lPlaybackSpeedSets		= new List<CPlaybackSpeedSet>();

	private bool	m_bSetsDirty	= false;



	void Start()
    {
		// Add defaults
		AddPlaybackSpeedSet( "0.25", 0.25f, false );
		AddPlaybackSpeedSet( "0.5", 0.5f, false );
		AddPlaybackSpeedSet( "0.75", 0.75f, false );
		AddPlaybackSpeedSet( "Normal", 1.0f, true );
		AddPlaybackSpeedSet( "1.25", 1.25f, false );
		AddPlaybackSpeedSet( "1.5", 1.5f, false );
		AddPlaybackSpeedSet( "1.75", 1.75f, false );
	}

	void Update()
    {
		if( m_bSetsDirty )
		{
			UpdateSets();
			m_bSetsDirty = false;
		}
	}

	private void AddPlaybackSpeedSet( string title, float fRate, bool bEnabled )
	{
		GameObject newLineGO = GameObject.Instantiate( _PlaybackSpeedLinePrefab, _Content );
		if( newLineGO != null )
		{
			// Setup text
			Transform titleTransform = newLineGO.transform.Find( "TitleText" );
			Text titleText = ( titleTransform != null ) ? titleTransform.GetComponent<Text>() : null;
			if( titleText != null )
			{
				titleText.text = title;
			}

			// Tick icon
			if( bEnabled )
			{
				Transform tickIconTransform = newLineGO.transform.Find( "TickIcon" );
				Image tickIconImage = ( tickIconTransform != null ) ? tickIconTransform.GetComponent<Image>() : null;
				if( tickIconImage != null )
				{
					tickIconImage.enabled = true;
				}
			}

			// On click
			if( _OptionsMenu )
			{
				Button button = newLineGO.GetComponent<Button>();
				if( button )
				{
					int iIndex = m_lPlaybackSpeedSets.Count;
					button.onClick.AddListener( delegate
					{
						_OptionsMenu.ChangePlaybackSpeed( iIndex );
					} );
				}
			}

			// Add it to the list
			CPlaybackSpeedSet cPlaybackSpeedSet = new CPlaybackSpeedSet();
			cPlaybackSpeedSet.m_LineGO = newLineGO;
			cPlaybackSpeedSet.m_fRate = fRate;
			cPlaybackSpeedSet.m_DisplayName = title;
			m_lPlaybackSpeedSets.Add( cPlaybackSpeedSet );
		}

		m_bSetsDirty = true;
	}

	public string GetDisplayNameForIndex( int iIndex )
	{
		if( iIndex > -1 && iIndex < m_lPlaybackSpeedSets.Count )
		{
			return m_lPlaybackSpeedSets[ iIndex ].m_DisplayName;
		}
		return "Normal";
	}

	public void UpdateSets()
	{
		if( m_lPlaybackSpeedSets.Count > 1 )
		{
			// Reposition everything
			float fLineHeight = 40.0f;
			float fTotalHeight = fLineHeight * m_lPlaybackSpeedSets.Count;

			RectTransform contentRectTransform = ( _Content != null ) ? _Content.GetComponent<RectTransform>() : null;
			if( contentRectTransform != null )
			{
				contentRectTransform.sizeDelta = new Vector2( contentRectTransform.sizeDelta.x, fTotalHeight );
			}

			float fY = (fTotalHeight * 0.5f) - (fLineHeight * 0.5f);
			foreach( CPlaybackSpeedSet PlaybackSpeedSet in m_lPlaybackSpeedSets )
			{
				RectTransform rectTransform = PlaybackSpeedSet.m_LineGO.GetComponent<RectTransform>();
				if ( rectTransform )
				{
					rectTransform.anchoredPosition = new Vector2( 0.0f, fY );
					fY -= fLineHeight;
				}
			}

			if( _ViewportRectTransform && _ScrollViewRectTransform )
			{
				float fMaxHeight = 330.0f;

				float fNewHeight = Mathf.Clamp( fTotalHeight, fLineHeight, fMaxHeight );
				float fBottomPadding = 12.0f;

				RectTransform rectTransform = transform.GetComponent<RectTransform>();
				rectTransform.sizeDelta = new Vector2( rectTransform.sizeDelta.x, 60.0f + fNewHeight + fBottomPadding );

				_ScrollViewRectTransform.sizeDelta = new Vector2(_ScrollViewRectTransform.sizeDelta.x, fNewHeight );
				_ViewportRectTransform.sizeDelta = new Vector2( _ViewportRectTransform.sizeDelta.x, fNewHeight );
			}
		}
	}

	public void ChangeVideoPlaybackSpeed( int iPlaybackSpeedIndex )
	{
		VideoTrack currentVideoTrack = _MediaPlayer.VideoTracks.GetActiveVideoTrack();
		if( _MediaPlayer )
		{
			// Change current playback speed on the media player
			_MediaPlayer.Control.SetPlaybackRate( m_lPlaybackSpeedSets[ iPlaybackSpeedIndex ].m_fRate );

			// Sort out UI
			int iIndex = 0;
			foreach ( CPlaybackSpeedSet PlaybackSpeedSet in m_lPlaybackSpeedSets )
			{
				Transform tickIconTransform = PlaybackSpeedSet.m_LineGO.transform.Find( "TickIcon" );
				Image tickIconImage = ( tickIconTransform != null ) ? tickIconTransform.GetComponent<Image>() : null;
				if ( tickIconImage != null )
				{
					tickIconImage.enabled = ( iIndex == iPlaybackSpeedIndex );
				}

				++iIndex;
			}
		}
	}
}