using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PARR.Core.Repositories.Interfaces.Schedule;
using PARR.DAL.Context;
using PARR.DAL.Repositories.Base;
using PARR.Domain.Entities.Schedule;

namespace PARR.DAL.Repositories
{
    internal class EsppSchTypeConfigRepository : BaseRepository<EsppSchTypeConfig>, IEsppSchTypeConfigRepository
    {
        public EsppSchTypeConfigRepository(DataContext dataContext, ILogger<EsppSchTypeConfigRepository> logger) : base(logger, dataContext) { }

        public IQueryable<EsppSchTypeConfig> GetWithSchIncludes()
        {
            return Get()
                    .Include(t => t.EsppSchValues)
                    .Include(t => t.EsppSchTypeSchedule)
                    .Include(t => t.EsppSchType)
                        .ThenInclude(t => t!.EsppSchTypeValues)
                        .ThenInclude(t => t!.EsppSchValues);
        }


        public async Task<EsppScheduleDto?> GetEsppScheduleDtoAsync(Guid jobGroupId)
        {
            //Формирует расписание в нормальном понятном виде из БД

            var items = await EntityContext.EsppSchValues.Where(t => t.JobGroupId == jobGroupId)
                                    .Select(t => new
                                    {
                                        t.EsppSchTypeConfig!.Order,
                                        Type = t.EsppSchTypeConfig.EsppSchType!,
                                        Value = t.EsppSchTypeValue!,
                                        TypeSchedule = t.EsppSchTypeConfig.EsppSchTypeSchedule!
                                    })
                                    .OrderBy(t => t.Order)
                                    .ToListAsync();

            if (items.Count == 0)
                return null;

            var typeSchedule = items.First().TypeSchedule;

            var dto = new EsppScheduleDto
            {
                TypeSchedule = typeSchedule,
                Values = items.Select(t => new EsppScheduleValDto
                {
                    Order = t.Order,
                    Type = t.Type,
                    Value = t.Value
                }
                ).ToList()
            };

            return dto;
        }


        #region original GetEsppScheduleDtoAsync
        //public async Task<EsppScheduleDto?> GetEsppScheduleDtoAsync(Guid jobGroupId)
        //{
        //    //Формирует расписание в нормальном понятном виде из БД

        //    var schValues = await dataContext.EsppSchValues
        //                                .AsNoTracking()
        //                                .Include(t => t.EsppSchTypeConfig)
        //                                    .ThenInclude(t => t!.EsppSchTypeSchedule)
        //                                .Include(t => t.EsppSchTypeConfig)
        //                                    .ThenInclude(t => t.EsppSchType)
        //                                .Include(t => t.EsppSchTypeValue)
        //                                .Include(t => t.JobGroup)
        //                                .Where(t => t.JobGroup!.Id == jobGroupId)
        //                                .OrderBy(t => t.EsppSchTypeConfig!.Order)
        //                                .ToListAsync();


        //    if (!schValues.Any())
        //        return null;


        //    var values = new List<EsppScheduleValDto>();

        //    foreach (var schValue in schValues)
        //    {
        //        var value = new EsppScheduleValDto
        //        {
        //            Order = schValue.EsppSchTypeConfig!.Order,
        //            Type = schValue.EsppSchTypeConfig!.EsppSchType!,
        //            Value = schValue.EsppSchTypeValue!
        //        };

        //        values.Add(value);
        //    }


        //    var dto = new EsppScheduleDto
        //    {
        //        TypeSchedule = schValues.First().EsppSchTypeConfig!.EsppSchTypeSchedule!,
        //        Values = values.OrderBy(t => t.Order).ToList()
        //    };


        //    return dto;
        //}
        #endregion


        public EsppScheduleDto? GetEsppScheduleDto(Guid jobGroupId)
        {
            var result = Task.Run(async () =>
            {
                return await GetEsppScheduleDtoAsync(jobGroupId);
            }).GetAwaiter().GetResult();

            return result;
        }
    }
}
