using Microsoft.Extensions.Logging; using PARR.BLL.Services.Interfaces; using PARR.Constants; namespace PARR.BLL.Services.Implementations { internal class CalendarService : ICalendarService { private readonly ILogger logger; public CalendarService(ILogger logger) { this.logger = logger; } private DateOnly GetEndPeriodDate(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod) { switch (periodType) { case (DistributionPeriodTypeEnum.Day): return startPeriod.AddDays(ParseInt(distributionPeriod)).AddDays(-1); case (DistributionPeriodTypeEnum.Month): return startPeriod.AddMonths(ParseInt(distributionPeriod)).AddDays(-1); case (DistributionPeriodTypeEnum.Year): return startPeriod.AddYears(ParseInt(distributionPeriod)).AddDays(-1); //case (DistributionPeriodTypeEnum.TimeSpan): // var timeSpan = ParseTimeSpan(distributionPeriod); // return timeSpan.Days > 0 ? startPeriod.AddDays(); } //return startPeriod.AddDays(duration.Days).AddDays(-1); return startPeriod; } private int ParseInt(string value) { try { return int.Parse(value); } catch (Exception ex) { logger.LogError(ex, $"{nameof(CalendarService)}, получение конца периода. Не смог распарсить string в int для значения {value}."); return 0; } } //private TimeSpan ParseTimeSpan(string value) //{ // try // { // return TimeSpan.Parse(value); // } // catch (Exception ex) // { // logger.LogError(ex, $"{nameof(CalendarService)}, получение конца периода. Не смог распарсить string в TimeSpan для значения {value}."); // return new TimeSpan(0); // } //} //public List GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan duration, GetWeekendsDelegate getWeekends) public List GetWorkDatesForPeriod(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends) { var endPeriod = GetEndPeriodDate(startPeriod, periodType, distributionPeriod); //не получилось сделать асинхронным var weekends = getWeekends.Invoke(startPeriod, endPeriod).ToList(); //.ToListAsync(); //TODO: метод получения рабочих дней, получать актуальные рабочие дни за период //не стали добавлять праздничные и выходные дни сразу, так как повысится нагрузка на робота // на следующий месяц будет много изменений //временно сделаем список руками рабочих дней var workDays = GetDatesForPeriod(startPeriod, endPeriod); if (weekends.Any()) workDays = workDays.Where(t => weekends.Any(x => x != t)).ToList(); return workDays; } /// /// Временные данные пока не реализован сервис и логика /// /// /// /// private List GetDatesForPeriod(DateOnly startPeriod, DateOnly EndPeriod) { var workDaysList = new List(); var currentDay = startPeriod; while (currentDay <= EndPeriod) { //!!!!!!!! 29 дней, потому что в феврале 28, чтоб не париться, сделали так if (currentDay.Day < 29) workDaysList.Add(currentDay); currentDay = currentDay.AddDays(1); } return workDaysList.OrderBy(t => t).ToList(); } } //public class Test //{ // private readonly ICalendarService calendarService; // public Test(ICalendarService calendarService) // { // this.calendarService = calendarService; // } // public async void Ttt() // { // var tService = new TestService(); // // var endPeriod = calendarService.GetEndPeriodDate(new DateOnly(2024, 1, 1), TimeSpan.Parse("30:00:00:00")); // var workDays = await calendarService.GetWorkDatesForPeriodAsync(new DateOnly(2024, 1, 1), TimeSpan.Parse("30:00:00:00"), tService.GetWeekendsAsync); // } //} //public class TestService //{ // public async Task> GetWeekendsAsync(DateOnly start, DateOnly end) // { // await Task.Delay(1000); // return new List { new DateOnly(2024, 1, 12) }; // } //} }