using System;
using Microsoft.EntityFrameworkCore;

namespace PolyTrader.Tests.TestSupport
{
    /// <summary>
    /// Test-Implementierung von <see cref="IDbContextFactory{TContext}"/> auf Basis des
    /// EF-Core-InMemory-Providers. Jede Factory-Instanz nutzt eine eigene (per GUID benannte)
    /// In-Memory-DB, sodass Tests voneinander isoliert sind; alle vom selben Factory erzeugten
    /// Kontexte teilen sich die gleiche Datenbank (wie im echten Betrieb der DbContextFactory).
    /// </summary>
    public sealed class InMemoryContextFactory<TContext> : IDbContextFactory<TContext>
        where TContext : DbContext
    {
        private readonly Func<DbContextOptions<TContext>, TContext> _ctor;
        private readonly DbContextOptions<TContext> _options;

        public InMemoryContextFactory(Func<DbContextOptions<TContext>, TContext> ctor)
        {
            _ctor = ctor;
            _options = new DbContextOptionsBuilder<TContext>()
                .UseInMemoryDatabase(Guid.NewGuid().ToString())
                .EnableSensitiveDataLogging()
                .Options;
        }

        public TContext CreateDbContext() => _ctor(_options);
    }
}
