using ColaFlow.Modules.Identity.Infrastructure.Persistence;
using Microsoft.Extensions.DependencyInjection;

namespace ColaFlow.Modules.Identity.IntegrationTests.Infrastructure;

/// <summary>
/// Database Fixture for Real PostgreSQL Database Tests
/// Use this for more realistic integration tests that verify actual database behavior
/// Requires PostgreSQL to be running on localhost
/// </summary>
public class RealDatabaseFixture : IDisposable
{
    public ColaFlowWebApplicationFactory Factory { get; }
    public HttpClient Client { get; }
    private readonly string _testDatabaseName;

    public RealDatabaseFixture()
    {
        _testDatabaseName = $"test_{Guid.NewGuid():N}";

        // Use Real PostgreSQL Database
        Factory = new ColaFlowWebApplicationFactory(
            useInMemoryDatabase: false,
            testDatabaseName: _testDatabaseName
        );

        Client = Factory.CreateClient();

        // Clean up any existing test data
        CleanupDatabase();
    }

    private void CleanupDatabase()
    {
        using var scope = Factory.Services.CreateScope();
        var db = scope.ServiceProvider.GetRequiredService<IdentityDbContext>();

        // Clear all data from test database
        db.RefreshTokens.RemoveRange(db.RefreshTokens);
        db.Users.RemoveRange(db.Users);
        db.Tenants.RemoveRange(db.Tenants);
        db.SaveChanges();
    }

    public void Dispose()
    {
        try
        {
            // Clean up test database
            using (var scope = Factory.Services.CreateScope())
            {
                var db = scope.ServiceProvider.GetRequiredService<IdentityDbContext>();
                db.Database.EnsureDeleted();
            }
        }
        catch
        {
            // Ignore cleanup errors
        }

        Client?.Dispose();
        Factory?.Dispose();
        GC.SuppressFinalize(this);
    }
}
