using Cysharp.Threading.Tasks;
using Cysharp.Threading.Tasks.Linq;
using ScenarioFlow;
using ScenarioFlow.Scripts.SFText;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;

namespace OtherFeatures
{
	public class CharacterAnimator : MonoBehaviour, IReflectable
	{
		private readonly float ImageDuration = 0.5f;

		[SerializeField]
		private Image characterImage;

		[CommandMethod("change character image async")]
		[Category("Character")]
		[Description("Change the character icon.")]
		[Snippet("Change the icon to {${1:image}}")]
		public async UniTask ChangeCharacterImageAsync(Sprite sprite, CancellationToken cancellationToken)
		{
			var frontImage = Instantiate(characterImage, characterImage.transform, true);
			frontImage.transform.SetSiblingIndex(characterImage.transform.GetSiblingIndex());
			characterImage.sprite = sprite;
			try
			{
				await UniTaskAsyncEnumerable.EveryUpdate()
					.TakeWhile(_ => frontImage.color.a > 0)
					.ForEachAsync(_ =>
					{
						frontImage.color = frontImage.color - Color.black * Time.deltaTime / ImageDuration;
					}, cancellationToken: cancellationToken);
			}
			finally
			{
				Destroy(frontImage.gameObject);
			}
		}

		[CommandMethod("change character image")]
		[Category("Character")]
		[Description("Change the character icon immediately.")]
		[Snippet("Change the icon to {${1:image}} immediately")]
		public void ChangeCharacterImage(Sprite sprite)
		{
			characterImage.sprite = sprite;
		}
	}
}