using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using AdsManagerService.Infrastructure;

namespace AdsManagerService.FunctionalTests;

/// <summary>
/// EN: Custom WebApplicationFactory for functional tests.
/// VI: WebApplicationFactory tùy chỉnh cho functional tests.
/// </summary>
public class CustomWebApplicationFactory : WebApplicationFactory<Program>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.UseEnvironment("Testing");
        
        builder.ConfigureServices(services =>
        {
            // EN: Remove the existing DbContext registration
            // VI: Xóa đăng ký DbContext hiện tại
            var descriptor = services.SingleOrDefault(
                d => d.ServiceType == typeof(DbContextOptions<AdsManagerServiceContext>));

            if (descriptor != null)
            {
                services.Remove(descriptor);
            }

            // EN: Remove DbContext service
            // VI: Xóa DbContext service
            var dbContextDescriptor = services.SingleOrDefault(
                d => d.ServiceType == typeof(AdsManagerServiceContext));

            if (dbContextDescriptor != null)
            {
                services.Remove(dbContextDescriptor);
            }

            // EN: Add in-memory database for testing
            // VI: Thêm in-memory database để test
            services.AddDbContext<AdsManagerServiceContext>(options =>
            {
                options.UseInMemoryDatabase("TestDatabase_" + Guid.NewGuid().ToString());
            });

            // EN: Ensure database is created with seed data
            // VI: Đảm bảo database được tạo với seed data
            var sp = services.BuildServiceProvider();
            using var scope = sp.CreateScope();
            var db = scope.ServiceProvider.GetRequiredService<AdsManagerServiceContext>();
            db.Database.EnsureCreated();
        });
    }
}
