using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.ComponentModel.DataAnnotations.Schema; using Commerce.Contracts.DTOs; namespace Commerce.Domain.Entities; public class Product { public Guid Id { get; set; } public double Price { get; set; } public double Discount { get; set; } public DateTime Created { get; set; } public string CodeName { get; set; } = string.Empty; public bool IsBundle { get; set; } public string? CategoryName { get; set; } public Guid? CategoryId { get; set; } public string[] Photos { get; set; } = Array.Empty(); [ForeignKey("CategoryId")] public virtual Category Category { get; set; } = null!; public virtual List ChildProducts { get; set; } = new(); public virtual List? ParentBundles { get; set; } // New nested structure for JSONB public List Translations { get; set; } = new(); public static ProductVM ToVM(Product product, string? language = null) { var translations = product.Translations?.ToList() ?? new List(); List selectedTranslations; if (string.IsNullOrEmpty(language)) { selectedTranslations = translations .Select(t => new ProductTranslationVM { Language = t.Language, Info = new ProductInfoVM { Name = t.Info.Name, Description = t.Info.Description, TechnicalDetails = t.Info.TechnicalDetails?.Select(td => new TechnicalDetailVM { Key = td.Key, Value = td.Value }).ToList() ?? new() } }).ToList(); } else { var matchedTranslation = translations .FirstOrDefault(t => t.Language == language) ?? translations.FirstOrDefault(t => t.Language == "en"); selectedTranslations = matchedTranslation != null ? new List { new ProductTranslationVM { Language = matchedTranslation.Language, Info = new ProductInfoVM { Name = matchedTranslation.Info.Name, Description = matchedTranslation.Info.Description, TechnicalDetails = matchedTranslation.Info.TechnicalDetails?.Select(td => new TechnicalDetailVM { Key = td.Key, Value = td.Value }).ToList() ?? new() } } } : new List(); } return new ProductVM { Id = product.Id, Price = product.Price, Discount = product.Discount, Created = product.Created, CodeName = product.CodeName, CategoryName = product.CategoryName, IsBundle = product.IsBundle, CategoryId = product.CategoryId, Photos = product.Photos, Translations = selectedTranslations, ChildProducts = product.ChildProducts?.Select(x => Product.ToVM(x, language)).ToList() ?? new List(), }; } public static Product ToEntity(ProductVM productVM) { return new Product { Id = productVM.Id ?? Guid.NewGuid(), Price = productVM.Price ?? 0, Discount = productVM.Discount ?? 0, Created = productVM.Created ?? DateTime.UtcNow, CodeName = productVM.CodeName ?? string.Empty, CategoryName = productVM.CategoryName, IsBundle = productVM.IsBundle, CategoryId = productVM.CategoryId ?? Guid.Empty, Photos = productVM.Photos ?? Array.Empty(), Translations = productVM.Translations?.Select(t => new ProductTranslation { Language = t.Language, Info = new ProductInfo { Name = t.Info.Name, Description = t.Info.Description, TechnicalDetails = t.Info.TechnicalDetails?.Select(td => new TechnicalDetail { Key = td.Key, Value = td.Value }).ToList() ?? new() } }).ToList() ?? new(), ChildProducts = new List(), }; } } public class ProductTranslation { public string Language { get; set; } = string.Empty; public ProductInfo Info { get; set; } = new(); } public class ProductInfo { public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public List TechnicalDetails { get; set; } = new(); } public class TechnicalDetail { public string Key { get; set; } = string.Empty; public string Value { get; set; } = string.Empty; }