using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.Core.Repositories.Interfaces.Schedule; using PARR.DAL.Context; using PARR.DAL.Contracts; using PARR.Domain.Entities.Schedule; namespace PARR.DAL.Repositories.Schedule { internal sealed class ScheduleResponseAreaTimeOffsetRepository : IScheduleResponseAreaTimeOffsetRepository { private readonly IReadOnlyDictionary offsetList; /// /// ЗО по умолчанию /// private readonly string defaultResponseArea; /// /// Настройки, если не нашли в offsetList /// private readonly ScheduleResponseAreaTimeOffset defaultOffset; private readonly ILogger logger; public ScheduleResponseAreaTimeOffsetRepository(DataContext dataContext, SettingsFromDb settingsFromDb, ILogger logger) { offsetList = dataContext.ScheduleResponseAreaTimeOffsets .AsNoTracking() .ToDictionary(t => t.ResponseArea, t => t, StringComparer.OrdinalIgnoreCase); if (string.IsNullOrEmpty(settingsFromDb.DefaultResponseAreaToTimeOffset)) defaultResponseArea = "17-МСК"; else defaultResponseArea = settingsFromDb.DefaultResponseAreaToTimeOffset; defaultOffset = new ScheduleResponseAreaTimeOffset { ResponseArea = "17-МСК", EsppValue = "", UtcTimeOffset = new TimeSpan(3, 0, 0) }; this.logger = logger; } public IReadOnlyDictionary GetAll => offsetList; public ScheduleResponseAreaTimeOffset GetDefault => GetByResponseAreaOrDefault(defaultResponseArea); public ScheduleResponseAreaTimeOffset GetByResponseAreaOrDefault(string responseArea) { offsetList.TryGetValue(responseArea, out var value); if (value != null) { logger.LogDebug("Получил часовой пояс по ЗО '{responseArea}', esppValue: {EsppValue}, utcTimeOffset: {utcTimeOffset}", responseArea, value.EsppValue, value.UtcTimeOffset); return value; } else { logger.LogWarning("Не смог получить часовой пояс по ЗО '{responseArea}', вернул часово пояс по умолчанию: name: {name}, esppValue: {EsppValue}, utcTimeOffset: {utcTimeOffset}", responseArea, defaultOffset.ResponseArea, defaultOffset.EsppValue, defaultOffset.UtcTimeOffset); return defaultOffset; } //return offsetList.TryGetValue(responseArea, out var value) ? value : defaultOffset; } //public IQueryable Get() //{ // return dataContext.ScheduleResponseAreaTimeOffsets; //} //public async Task GetTimeOffsetByResponseAreaAsync(string responseArea) //{ // var result = await dataContext.ScheduleResponseAreaTimeOffsets.FirstOrDefaultAsync(t => t.ResponseArea == responseArea); // return result != null ? result.TimeOffset : null; //} } }