using ScenarioFlow;
using ScenarioFlow.Scripts;
using ScenarioFlow.Tasks;
using UnityEngine;

namespace HowToWriteSFText
{
	public class ScenarioManager : MonoBehaviour
	{
		[SerializeField]
		private ScenarioScript scenarioScript;

		[SerializeField]
		private ButtonNotifier buttonNotifier;
		[SerializeField]
		private CharacterAnimator characterAnimator;
		[SerializeField]
		private DialogueWriter dialogueWriter;
		[SerializeField]
		private ScenarioBranchMaker scenarioBranchMaker;
		[SerializeField]
		private SpriteProvider spriteProvider;

		private async void Start()
		{
			// Build ScenarioBookReader
			ScenarioTaskExecutor scenarioTaskExecutor = new(buttonNotifier, buttonNotifier);
			ScenarioBookReader scenarioBookReader = new(scenarioTaskExecutor);
			// Build ScenarioBookPublisher
			scenarioBranchMaker.LabelOpener = scenarioBookReader;
			ScenarioBookPublisher scenarioBookPublisher = new(
				new IReflectable[]
				{
					// Commands
					characterAnimator,
					dialogueWriter,
					scenarioBranchMaker,
					// Decoders
					new CancellationTokenDecoder(scenarioTaskExecutor),
					new PrimitiveDecoders(),
					spriteProvider,
				});

			try
			{
				ScenarioBook scenarioBook = scenarioBookPublisher.Publish(scenarioScript);
				await scenarioBookReader.ReadAsync(scenarioBook, destroyCancellationToken);
			}
			finally
			{
				scenarioTaskExecutor?.Dispose();
				UnityEditor.EditorApplication.isPlaying = false;
			}
		}
	}
}