using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Moq;
using PARR.DAL.Context;
using PARR.DAL.DomainServices.Implementations;
using PARR.DAL.Services.Implementations.Job;
using PARR.DAL.Services.Implementations.Unit;

namespace PARR.DAL.Tests
{
    public class UnitFilterServiceTests //: IDisposable
    {
    //    private readonly DbContextOptions<DataContext> _options;
    //    private readonly DataContext _context;
    //    private readonly UnitFilterService _service;

    //    public UnitFilterServiceTests()
    //    {
    //        _options = new DbContextOptionsBuilder<DataContext>()
    //            .UseInMemoryDatabase($"TestDb_{Guid.NewGuid()}")
    //            .EnableSensitiveDataLogging()
    //            .Options;

    //        _context = new DataContext(_options);
    //        _context.Database.EnsureCreated();
    //        TestDataGenerator.Seed(_context);

    //        // Логгеры
    //        var logger = Mock.Of<ILogger<UnitFilterService>>();
    //        var jobServiceLogger = Mock.Of<ILogger<JobService>>();
    //        var unitServiceLogger = Mock.Of<ILogger<UnitService>>();
    //        var unitInUnitServiceLogger = Mock.Of<ILogger<UnitInUnitService>>();
    //        var unitInValueServiceLogger = Mock.Of<ILogger<UnitInValueService>>();

    //        // Реальные сервисы с правильными конструкторами
    //        var jobService = new JobService(_context, jobServiceLogger);
    //        var unitService = new UnitService(_context, unitServiceLogger);
    //        var unitInUnitService = new UnitInUnitService(_context, unitInUnitServiceLogger);
    //        var unitInValueService = new UnitInValueService(unitInValueServiceLogger, _context); // ← logger first!

    //        _service = new UnitFilterService(
    //            logger,
    //            jobService,
    //            unitService,
    //            unitInUnitService,
    //            unitInValueService
    //        );
    //    }

    //    public void Dispose() => _context.Dispose();

    //    [Fact]
    //    public async Task GetUnitsIdByJobFilterAsync_WithExistingJobId_ShouldReturnExpectedUnits()
    //    {
    //        // Arrange
    //        var jobId = _context.Jobs.First(j => j.Name == "TestJob_1").Id;
    //        var expectedUnitIds = new[] { TestDataGenerator.UnitAId, TestDataGenerator.UnitBId };

    //        // Act
    //        var result = await _service.GetUnitsIdByJobFilterAsync(jobId, takeCount: 10);

    //        // Assert
    //        result.Should().NotBeNull()
    //    .And.HaveCount(2)
    //    .And.Contain(expectedUnitIds);
    //    }

    //    [Fact]
    //    public async Task GetRelatedUnitNamesAsync_WithChildRelationshipFilter_ShouldReturnExpectedNames()
    //    {
    //        // Arrange
    //        var jobId = _context.Jobs.First(j => j.Name == "TestJob_2").Id;
    //        var unitId = TestDataGenerator.UnitWId; // Родитель

    //        // rf.IsParent = false
    //        // Ищем юниты, у которых ParentUnitId = UnitWId (т.е. это дети UnitWId)
    //        // и у этих юнитов (детей) есть FieldId1 = "коммутатор"
    //        // Это UnitXId и UnitYId -> имена: "СХД-КМТ-CISCO-MDS9148-1-ДВС", "СХД-КМТ-CISCO-MDS9148-3-ДВС"

    //        // Act
    //        var result = await _service.GetRelatedUnitNamesAsync(jobId, unitId);

    //        // Assert
    //        result.Should().Contain(new[] { "СХД-КМТ-CISCO-MDS9148-1-ДВС", "СХД-КМТ-CISCO-MDS9148-3-ДВС" });
    //    }
    }
}