using Cysharp.Threading.Tasks;
using ScenarioFlow;
using ScenarioFlow.Scripts.SFText;
using ScenarioFlow.Tasks;
using System;
using System.Threading;

namespace HowToChooseTokenCode
{
	public class ScenarioTaskConsumer : IReflectable
    {
        private readonly IScenarioTaskStorage scenarioTaskStorage;

        public ScenarioTaskConsumer(IScenarioTaskStorage scenarioTaskStorage)
        {
            this.scenarioTaskStorage = scenarioTaskStorage ?? throw new ArgumentException(nameof(scenarioTaskStorage));
        }

        [CommandMethod("accept task async")]
        [Category("Task")]
        [Description("Await scenario tasks with the specified token code.")]
        [Snippet("Accept {${1:token code}}")]
        public async UniTask AcceptScenarioTasksAsync(string tokenCode, CancellationToken cancellationToken)
        {
            await scenarioTaskStorage.AcceptAsync(tokenCode, cancellationToken);
        }

        [CommandMethod("cancel task")]
        [Category("Task")]
        [Description("Cancel scenario tasks with the specified token code.")]
		[Snippet("Cancel {${1:token code}}")]
		public void CancelTask(string tokenCode)
        {
            scenarioTaskStorage.Cancel(tokenCode);
        }
    }
}