using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PARR.DAL.Context;
using PARR.DAL.Models.Unit;
using PARR.DAL.Services.Interfaces.Unit;

namespace PARR.DAL.Services.Implementations.Unit
{
    internal class UnitInUnitService : IUnitInUnitService
    {
        private readonly DataContext dataContext;
        private readonly ILogger<UnitInUnitService> logger;

        public UnitInUnitService(
            DataContext dataContext,
            ILogger<UnitInUnitService> logger
            )
        {
            this.dataContext = dataContext;
            this.logger = logger;
        }


        public IQueryable<UnitInUnit> Get()
        {
            return dataContext.UnitInUnits;
        }


        public Task<List<UnitInUnit>> GetByParentIdAsync(Guid parentId)
        {
            return dataContext.UnitInUnits
                .Where(u => u.ParentUnitId == parentId)
                .ToListAsync();
        }


        public Task<List<UnitInUnit>> GetByChildIdAsync(Guid childId)
        {
            return dataContext.UnitInUnits
                .Where(u => u.ChildUnitId == childId)
                .ToListAsync();
        }


        public async Task<List<UnitInUnit>> GetParentLinksByChildIdsAsync(IEnumerable<Guid> childUnitIds)
        {
            var set = childUnitIds.ToHashSet();
            return await dataContext.UnitInUnits
                .AsNoTracking()
                .Where(uinu => set.Contains(uinu.ChildUnitId))
                .ToListAsync();
        }

        public async Task<List<UnitInUnit>> GetChildLinksByParentIdsAsync(IEnumerable<Guid> parentUnitIds)
        {
            var set = parentUnitIds.ToHashSet();
            return await dataContext.UnitInUnits
                .AsNoTracking()
                .Where(uinu => set.Contains(uinu.ParentUnitId))
                .ToListAsync();
        }
    }
}
