using System;
using System.Threading;
using System.Threading.Tasks;
using Avalonia.Threading;

namespace dmeo040225.Services;

public class TimerService
{
    private TimeSpan _timeRemaining = TimeSpan.FromMinutes(20);
    private CancellationTokenSource _cts = new();
    public event Action<TimeSpan>? TimeUpdated;
    public event Action? TimerExpired;

    private static TimerService? _instance;
    public static TimerService Instance => _instance ??= new TimerService();

    private TimerService() { }

    public void Start()
    {
        _cts.Cancel(); 
        _cts = new CancellationTokenSource();
        
        Task.Run(async () =>
        {
            while (_timeRemaining > TimeSpan.Zero)
            {
                await Task.Delay(TimeSpan.FromSeconds(1), _cts.Token);
                _timeRemaining -= TimeSpan.FromSeconds(1);
                Dispatcher.UIThread.Post(() => TimeUpdated?.Invoke(_timeRemaining));
            }
            Dispatcher.UIThread.Post(() => TimerExpired?.Invoke());
        }, _cts.Token);
    }

    public void Reset()
    {
        _timeRemaining = TimeSpan.FromMinutes(20);
    }

    public void Stop()
    {
        _cts.Cancel();
    }
}