using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Commerce.Contracts.DTOs; namespace Commerce.Domain.Entities; public class Category { public Guid Id { get; set; } public string[] Photos { get; set; } = Array.Empty(); public Guid? ParentCategoryId { get; set; } public Category? ParentCategory { get; set; } public ICollection ChildCategories { get; set; } = new List(); public bool IsBundle { get; set; } // New nested structure for JSONB public List Translations { get; set; } = new(); public static CategoryVM ToVM(Category category, string? language = null) { var translations = category.Translations?.ToList() ?? new List(); List selectedTranslations; if (string.IsNullOrEmpty(language)) { selectedTranslations = translations .Select(t => new CategoryTranslationVM { Language = t.Language, Info = new CategoryInfoVM { 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 CategoryTranslationVM { Language = matchedTranslation.Language, Info = new CategoryInfoVM { 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 CategoryVM { Id = category.Id, Photos = category.Photos, ParentCategoryId = category.ParentCategoryId, IsBundle = category.IsBundle, Translations = selectedTranslations, ChildCategories = category.ChildCategories?.Select(x => Category.ToVM(x, language)).ToList() ?? new List(), }; } public static Category ToEntity(CategoryVM categoryVM) { return new Category { Id = categoryVM.Id ?? Guid.NewGuid(), Photos = categoryVM.Photos ?? Array.Empty(), ParentCategoryId = categoryVM.ParentCategoryId, IsBundle = categoryVM.IsBundle, Translations = categoryVM.Translations?.Select(t => new CategoryTranslation { Language = t.Language, Info = new CategoryInfo { 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(), ChildCategories = categoryVM.ChildCategories?.Select(x => Category.ToEntity(x)).ToList() ?? new List(), }; } } public class CategoryTranslation { public string Language { get; set; } = string.Empty; public CategoryInfo Info { get; set; } = new(); } public class CategoryInfo { public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public List TechnicalDetails { get; set; } = new(); }