using Microsoft.Extensions.Logging;
using PARR.BLL.Services.Interfaces;

namespace PARR.BLL.Services.Implementations
{
    internal class IntervalService : IIntervalService
    {
        private readonly ILogger<IntervalService> logger;

        public IntervalService(ILogger<IntervalService> logger)
        {
            this.logger = logger;
        }

        public async Task IntervalInitAsync(IntervalHandlerDelegate intervalHandler, TimeSpan interval)
        {
            var nextStart = DateTimeOffset.UtcNow;

            while (true)
            {
                nextStart = DateTimeOffset.UtcNow;

                logger.LogInformation($"Запуск по расписанию. Интервал: {interval}, дата: {nextStart}");

                await intervalHandler.Invoke();

                nextStart = nextStart.Add(interval);

                logger.LogInformation($"Следующая дата запуска: {nextStart}. Интервал: {interval}.");

                var intervalOffset = nextStart - DateTimeOffset.UtcNow;
                if (intervalOffset < TimeSpan.Zero)
                {
                    intervalOffset = TimeSpan.Zero;
                    logger.LogWarning($"Время следующего запуска изменено на сейчас. Так как рассчитанное время запуска меньше чем сейчас, {nextStart}<{DateTimeOffset.UtcNow}. " +
                        $"Это произошло потому что время выполнения основного метода больше чем заданный интервал повторений.");
                }

                await Task.Delay(intervalOffset);
            }
        }
    }
}
