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

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

public class OptionsQualityPage : 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		_QualityLinePrefab;


	private string	m_SetupForVideoPath;


	private class CVariantSet
	{
		public GameObject	m_LineGO	= null;
	}
	private List<CVariantSet>	m_lVariantSets		= new List<CVariantSet>();


    void Start()
    {
		// Add 'Auto'
		AddVariantSet( "Auto", true );
	}

    void Update()
    {
		UpdateSets();
	}

	private void AddVariantSet( string title, bool bEnabled )
	{
		GameObject newLineGO = GameObject.Instantiate( _QualityLinePrefab, _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_lVariantSets.Count;
					button.onClick.AddListener( delegate
					{
						_OptionsMenu.ChangeVideoVariant( iIndex );
					} );
				}
			}

			// Add it to the list
			CVariantSet cVariantSet = new CVariantSet();
			cVariantSet.m_LineGO = newLineGO;
			m_lVariantSets.Add( cVariantSet );
		}
	}

	public void UpdateSets()
	{
		if( _MediaPlayer != null && _MediaPlayer.Control.HasMetaData() )
		{
			if( m_SetupForVideoPath == null || !m_SetupForVideoPath.Equals( _MediaPlayer.MediaPath.Path ) )
			{
				m_SetupForVideoPath = _MediaPlayer.MediaPath.Path;

				foreach( CVariantSet VariantSet in m_lVariantSets )
				{
					GameObject.Destroy(VariantSet.m_LineGO );
					VariantSet.m_LineGO = null;
				}
				m_lVariantSets.Clear();

				// Add all variants sets
				int iNumVariants = _MediaPlayer.Variants.Count;
				for (int i = 0; i < iNumVariants; ++i)
				{
					Variant variant = _MediaPlayer.Variants[i];
					StringBuilder sb = new StringBuilder();
					sb.AppendFormat("{0}x{1}", variant.Width, variant.Height);
					if (variant.FrameRate > 0.0f)
					{
						sb.AppendFormat("@{0:G}fps", variant.FrameRate);
					}
					if (variant.VideoCodecType != CodecType.unknown)
					{
						sb.AppendFormat(" {0}", variant.VideoCodecName);
					}
					if (variant.AudioCodecType != CodecType.unknown)
					{
						sb.AppendFormat(" {0}", variant.AudioCodecName);
					}

					AddVariantSet(sb.ToString(), false);
				}

				if (iNumVariants > 0)
				{
					// Add 'Auto'
					AddVariantSet( "Auto", true );
				}

				if( m_lVariantSets.Count > 1 )
				{
					// Reposition everything
					float fLineHeight = 40.0f;
					float fTotalHeight = fLineHeight * m_lVariantSets.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( CVariantSet variantSet in m_lVariantSets )
					{
						RectTransform rectTransform = variantSet.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 ChangeVideoVariant( int iVariantIndex )
	{
		if (_MediaPlayer == null || _MediaPlayer.Variants == null)
		{
			return;
		}

		Variant variant;
		if (iVariantIndex >= 0 && iVariantIndex < _MediaPlayer.Variants.Count)
		{
			variant = _MediaPlayer.Variants[iVariantIndex];
		}
		else
		{
			variant = Variant.Auto;
		}

		_MediaPlayer.Variants.SelectVariant(variant);

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

			++iIndex;
		}
	}
}