using Modules.User.Application;
using Modules.User.Database.Database;

namespace Modules.User.Database;

public class UnitOfWork(UserDbContext context) : IUnitOfWork
{
    // public async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
    // {
    //     return await context.SaveChangesAsync(cancellationToken);
    // }
    public async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
    {
        try
        {
            return await context.SaveChangesAsync(cancellationToken);
            // try
            // {
            //     return await context.SaveChangesAsync(cancellationToken);
            // }
            // catch (Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException ex)
            // {
            //     var hadSessionConflict = false;
            //
            //     foreach (var entry in ex.Entries)
            //     {
            //         var name = entry.Metadata.Name;
            //         if (name != typeof(Database.Entities.Session).FullName &&
            //             name != typeof(Database.Entities.ClientInfo).FullName) continue;
            //         
            //         hadSessionConflict = true;
            //         var dbValues = await entry.GetDatabaseValuesAsync(cancellationToken);
            //         if (dbValues is null)
            //         {
            //             entry.State = Microsoft.EntityFrameworkCore.EntityState.Detached;
            //         }
            //         else
            //         {
            //             // подтягиваем актуальное “оригинальное” состояние и повторим
            //             entry.OriginalValues.SetValues(dbValues);
            //         }
            //     }
            //
            //     if (hadSessionConflict)
            //         return await context.SaveChangesAsync(cancellationToken);
            //
            //     throw;
            // }
        }
        catch (Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException ex)
        {
            Console.WriteLine($"Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:\r\n{ex.Message}");
            foreach (var e in ex.Entries)
            {
                var key = string.Join(",", e.Properties
                    .Where(p => p.Metadata.IsPrimaryKey())
                    .Select(p => $"{p.Metadata.Name}={p.CurrentValue}"));
                Console.WriteLine($"Concurrency on {e.Metadata.Name} [{key}]");
            }
            throw;
        }
    }
}