using AyCode.Database.DataLayers.Users;
using AyCode.Interfaces.Entities;
using AyCode.Models.Enums;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Newtonsoft.Json;
using TIAM.Database.DbContexts;
using TIAM.Database.DbContexts.ServiceProviders;
using TIAM.Database.DbSets.Permissions;
using TIAM.Database.DbSets.Products;
using TIAM.Database.DbSets.Users;
using TIAM.Entities.Permissions;
using TIAM.Entities.Products;
using TIAM.Entities.ServiceProviders;
using TIAM.Entities.Users;

//namespace TIAM.Database.DataLayers.ServiceProviders;

//public static class ServiceProviderDalExtension
//{
//    //public static string ToJson<T>(this T source) where T : class, IEntity
//    //{
//    //    JsonSerializerSettings options = new()
//    //    {
//    //        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
//    //        NullValueHandling = NullValueHandling.Ignore
//    //    };

//    //    return JsonConvert.SerializeObject(source, options);
//    //}

//    //public static string ToJson<T>(this IQueryable<T> source) where T : class, IEntity
//    //{
//    //        JsonSerializerSettings options = new()
//    //        {
//    //            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
//    //            NullValueHandling = NullValueHandling.Ignore
//    //        };

//    //        return JsonConvert.SerializeObject(source, options);
//    //}

//    //public static IQueryable<UserProductMapping> GetUserProductMappingsByPermissionGroupId(this IServiceProviderDbContext ctx, Guid permissionGroupId)
//    //{
//    //    return ctx.UserProductMappings
//    //        .Where(user => ctx.PermissionGroupUserMappings
//    //            .Where(x => x.PermissionGroupId == permissionGroupId)
//    //            .Select(x => x.SubjectId)
//    //            .Contains(user.Id));
//    //}

//    //public static void CleanUpAndRemoveUserProductMappings(this IServiceProviderDbContext ctx, IEnumerable<UserProductMapping> userProductMappings)
//    //{
//    //    foreach (var userProductMapping in userProductMappings)
//    //    {
//    //        ctx.CleanUpAndRemoveAssignedUser(userProductMapping);
//    //    }
//    //}

//    //public static void CleanUpAndRemoveAssignedUser(this IServiceProviderDbContext ctx, UserProductMapping userProductMapping)
//    //{
//    //    ctx.RemoveContextMappingBySubjectId(userProductMapping.Id);
//    //    ctx.RemoveAssingedUserFromPermissionGroups(userProductMapping.Id);

//    //    ctx.UserProductMappings.Remove(userProductMapping);
//    //}

//    //public static bool CleanUpAndRemoveUserProductMappings(this IServiceProviderDbContext ctx, Guid userProductMappingId)
//    //{
//    //    var userProductMapping = ctx.GetUserProductMappingById(userProductMappingId);

//    //    if (userProductMapping == null) return false;

//    //    ctx.CleanUpAndRemoveAssignedUser(userProductMapping);

//    //    return true;
//    //}

//    //public static UserProductMapping UpdateUserProductMapping(this IServiceProviderDbContext context, UserProductMapping userProductMapping)
//    //{
//    //    if(userProductMapping == null) return null;
//    //    var existingUserProductMapping = context.UserProductMappings.FirstOrDefault(u => u.Id == userProductMapping.Id);
//    //    if (existingUserProductMapping == null) return null;
//    //    existingUserProductMapping.Id = userProductMapping.Id;
//    //    existingUserProductMapping.UserId = userProductMapping.UserId;
//    //    existingUserProductMapping.ProductId = userProductMapping.ProductId;

//    //    return existingUserProductMapping;

//    //}

//    //public static Product UpdateProduct(this IServiceProviderDbContext ctx, Product product)
//    //{
//    //    if (product == null) return null;

//    //    var existingProduct = ctx.Products.FirstOrDefault(u => u.Id == product.Id);
//    //    if (existingProduct == null) return null;

//    //    existingProduct.Name = product.Name;
//    //    existingProduct.ServiceProviderId = product.ServiceProviderId;
//    //    existingProduct.Description = product.Description;
//    //    existingProduct.Price = product.Price;
//    //    existingProduct.JsonDetails = product.JsonDetails;
//    //    //existingProduct.UserMediaId = product.UserMediaId;
//    //    existingProduct.ProductType = product.ProductType;



//    //    return existingProduct;
//    //}

//    //public static void DeleteProductById(this IServiceProviderDbContext ctx, Guid productId)
//    //{
//    //    var product = ctx.Products.FirstOrDefault(u => u.Id == productId);
//    //    if (product == null) return;

//    //    ctx.CleanUpAndRemoveUserProductMappings(ctx.GetUserProductMappingsByProductId(productId));
//    //    ctx.Products.Remove(product);
//    //}

//    //public static bool CreatePermissionGroup(this IServiceProviderDbContext ctx, PermissionGroup permissionGroup)
//    //{
//    //    if (permissionGroup == null) return false;

//    //    ctx.PermissionGroups.Add(permissionGroup);

//    //    return true;
//    //}

//    //public static bool CreatePermissionContextMapping(this IServiceProviderDbContext ctx, PermissionContextMapping permissionContextMapping)
//    //{
//    //    if (permissionContextMapping == null) return false;

//    //    ctx.PermissionContextMappings.Add(permissionContextMapping);

//    //    return true;
//    //}

//    //public static bool CreatePermissionGroupUserMapping(this IServiceProviderDbContext ctx, PermissionGroupUserMapping permissionGroupUserMapping)
//    //{
//    //    if (permissionGroupUserMapping == null) return false;

//    //    ctx.PermissionGroupUserMappings.Add(permissionGroupUserMapping);

//    //    return true;
//    //}

//    //public static bool CreatePermissionsType(this IServiceProviderDbContext ctx, PermissionsType permissionType)
//    //{
//    //    if (permissionType == null) return false;

//    //    ctx.PermissionsTypes.Add(permissionType);

//    //    return true;
//    //}
//}