using System.Threading;
using Yarn.Unity;

namespace AC.Downloads.YarnIntegration
{

	public class ACYarnSpeaker : DialoguePresenterBase
	{

		#region Variables

		private AC.Char speaker;
		public string isTalkingParameter = "IsTalking";

		#endregion


		#region PublicFunctions

		public override async YarnTask OnDialogueStartedAsync() {}


		public override async YarnTask OnDialogueCompleteAsync() {}


		public override async YarnTask RunLineAsync(LocalizedLine line, LineCancellationToken token)
		{
			string characterName = line.CharacterName;
			speaker = !string.IsNullOrEmpty(characterName) ? FindCharacter(characterName) : null;
			if (speaker) speaker.GetAnimator().SetBool(isTalkingParameter, true);

			await YarnTask.WaitUntilCanceled(token.NextLineToken).SuppressCancellationThrow();

			if (speaker) speaker.GetAnimator().SetBool(isTalkingParameter, false);
		}


		public override async YarnTask<Yarn.Unity.DialogueOption> RunOptionsAsync(Yarn.Unity.DialogueOption[] dialogueOptions, CancellationToken cancellationToken)
		{
			return null;
		}

		#endregion


		#region PrivateFunctions

		AC.Char FindCharacter(string searchName)
		{
			foreach (var character in KickStarter.stateHandler.Characters)
			{
				if (character.speechLabel == searchName || character.gameObject.name == searchName)
				{
					return character;
				}
			}

			ACDebug.LogWarning("Couldn't find a YarnCharacter named " + searchName);
			return null;
		}

		#endregion

	}

}