using Cysharp.Threading.Tasks;
using Cysharp.Threading.Tasks.Linq;
using ScenarioFlow.Tasks;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

namespace OtherFeatures
{
	public class SkipActivator : MonoBehaviour
    {
        [SerializeField]
        private Button skipButton;
        [SerializeField]
        private TextMeshProUGUI skipButtonText;
        [SerializeField]
        private Slider waitTimeSlider;
        [SerializeField]
        private TextMeshProUGUI waitTimeText;

        private readonly float InitialWaitTime = 0.01f;
        private readonly float MinWaitTime = 0.0f;
        private readonly float MaxWaitTime = 0.5f;

        public void ActivateSkipButton(ISkipActivator skipActivator)
        {
            waitTimeSlider.minValue = MinWaitTime;
            waitTimeSlider.maxValue = MaxWaitTime;
            waitTimeSlider.OnValueChangedAsAsyncEnumerable(destroyCancellationToken)
                .Select(value => System.MathF.Round(value, 2))
                .ForEachAsync(value =>
                {
                    skipActivator.Duration = value;
                    waitTimeText.text = $"Wait time: {skipActivator.Duration} sec.";
                }, destroyCancellationToken);
            waitTimeSlider.value = InitialWaitTime;

            skipButton.OnClickAsAsyncEnumerable(destroyCancellationToken)
                .ForEachAsync(_ =>
                {
                    skipActivator.IsActive = !skipActivator.IsActive;
                    skipButtonText.text = skipActivator.IsActive ? "Skip ON" : "SKip OFF";
                }, destroyCancellationToken);
        }
    }
}

public class SkipActivator : MonoBehaviour
{
	[SerializeField]
	private Button skipButton;
	[SerializeField]
	private TextMeshProUGUI skipButtonText;
	[SerializeField]
	private Slider waitTimeSlider;
	[SerializeField]
	private TextMeshProUGUI waitTimeText;

	private readonly float InitialWaitTime = 0.01f;
	private readonly float MinWaitTime = 0.0f;
	private readonly float MaxWaitTime = 0.5f;

	public void ActivateSkipButton(ISkipActivator skipActivator)
	{
		waitTimeSlider.minValue = MinWaitTime;
		waitTimeSlider.maxValue = MaxWaitTime;
		waitTimeSlider.OnValueChangedAsAsyncEnumerable(destroyCancellationToken)
			.Select(value => System.MathF.Round(value, 2))
			.ForEachAsync(value =>
			{
				skipActivator.Duration = value;
				waitTimeText.text = $"Wait time: {skipActivator.Duration} sec.";
			}, destroyCancellationToken);
		waitTimeSlider.value = InitialWaitTime;

		skipButton.OnClickAsAsyncEnumerable(destroyCancellationToken)
			.ForEachAsync(_ =>
			{
				skipActivator.IsActive = !skipActivator.IsActive;
				skipButtonText.text = skipActivator.IsActive ? "Skip ON" : "SKip OFF";
			}, destroyCancellationToken);
	}
}