using UnityEngine;
using UnityEngine.UI;
//-----------------------------------------------------------------------------
// Copyright 2015-2021 RenderHeads Ltd.  All rights reserved.
//-----------------------------------------------------------------------------
namespace RenderHeads.Media.AVProVideo
{
	/// 
	/// Update a standard uGUI Text element with subtitle text as it plays from the MediaPlayer
	/// 
	[AddComponentMenu("AVPro Video/Subtitles uGUI", 201)]
	[HelpURL("http://renderheads.com/products/avpro-video/")]
	public class SubtitlesUGUI : MonoBehaviour
	{
		[SerializeField] MediaPlayer _mediaPlayer = null;
		[SerializeField] Text _text = null;
		[SerializeField] Image _backgroundImage = null;
		[SerializeField] int _backgroundHorizontalPadding = 32;
		[SerializeField] int _backgroundVerticalPadding = 16;
		[SerializeField, Range(-1, 1024)] int _maxCharacters = 256;
		public MediaPlayer Player
		{
			set { ChangeMediaPlayer(value); } 
			get { return _mediaPlayer; }
		}
		public Text Text
		{
			set { _text = value; } 
			get { return _text; }
		}
		void Start()
		{
			ChangeMediaPlayer(_mediaPlayer);
		}
		void OnDestroy()
		{
			ChangeMediaPlayer(null);
		}
		void Update()
		{
			// TODO: Currently we need to call this each frame, as when it is called right after SetText() 
			// the ContentSizeFitter hasn't run yet, so effectively the box is a frame behind.
			UpdateBackgroundRect();
		}
		public void ChangeMediaPlayer(MediaPlayer newPlayer)
		{
			// When changing the media player, handle event subscriptions
			if (_mediaPlayer != null)
			{
				_mediaPlayer.Events.RemoveListener(OnMediaPlayerEvent);
				_mediaPlayer = null;
			}
			SetText(string.Empty);
			if (newPlayer != null)
			{
				newPlayer.Events.AddListener(OnMediaPlayerEvent);
				_mediaPlayer = newPlayer;
			}
		}
		private void SetText(string text)
		{
			_text.text = text;
			UpdateBackgroundRect();
		}
		private string PrepareText(string text)
		{
			// Crop text that is too long
			if (_maxCharacters >= 0 && text.Length > _maxCharacters)
			{
				text = text.Substring(0, _maxCharacters);
			}
			// Change RichText for Unity uGUI Text
			text = text.Replace("", "");
			text = text.Replace("", string.Empty);
			text = text.Replace("", string.Empty);
			return text;
		}
		private void UpdateBackgroundRect()
		{
			if (_backgroundImage)
			{
				if (string.IsNullOrEmpty(_text.text))
				{
					_backgroundImage.enabled = false;
				}
				else
				{
					_backgroundImage.enabled = true;
					_backgroundImage.rectTransform.sizeDelta = _text.rectTransform.sizeDelta;
					_backgroundImage.rectTransform.anchoredPosition = _text.rectTransform.anchoredPosition;
					_backgroundImage.rectTransform.offsetMin -= new Vector2(_backgroundHorizontalPadding, _backgroundVerticalPadding);
					_backgroundImage.rectTransform.offsetMax += new Vector2(_backgroundHorizontalPadding, _backgroundVerticalPadding);
				}
			}
		}
		// Callback function to handle events
		private void OnMediaPlayerEvent(MediaPlayer mp, MediaPlayerEvent.EventType et, ErrorCode errorCode)
		{
			switch (et)
			{
				case MediaPlayerEvent.EventType.Closing:
				{
					SetText(string.Empty);
					break;
				}
				case MediaPlayerEvent.EventType.SubtitleChange:
				{
					SetText(PrepareText(_mediaPlayer.Subtitles.GetSubtitleText()));
					break;
				}
			}
		}
	}
}