using SampleWebApi.Models; namespace SampleWebApi.Data; public static class DataSeeder { private static readonly Random _random = new Random(); private static readonly string[] _categories = { "Electronics", "Books", "Clothing", "Home & Garden", "Sports", "Toys", "Food & Beverage" }; private static readonly string[] _productAdjectives = { "Premium", "Essential", "Professional", "Deluxe", "Standard", "Advanced", "Basic" }; private static readonly string[] _productNouns = { "Widget", "Gadget", "Tool", "Device", "Kit", "Set", "Pack", "Bundle" }; public static async Task SeedAsync(SampleDbContext context) { // Check if data already exists if (context.Products.Any()) { return; } // Create customers var customers = GenerateCustomers(1000); await context.Customers.AddRangeAsync(customers); await context.SaveChangesAsync(); // Create products var products = GenerateProducts(10000); await context.Products.AddRangeAsync(products); await context.SaveChangesAsync(); // Create orders with items var orders = GenerateOrders(customers, products, 50000); await context.Orders.AddRangeAsync(orders); await context.SaveChangesAsync(); } private static List GenerateCustomers(int count) { var customers = new List(); for (int i = 1; i <= count; i++) { customers.Add(new Customer { Id = $"CUST{i:D6}", Name = $"Customer {i}", Email = $"customer{i}@example.com", RegisteredAt = DateTime.UtcNow.AddDays(-_random.Next(1, 730)) }); } return customers; } private static List GenerateProducts(int count) { var products = new List(); for (int i = 1; i <= count; i++) { var category = _categories[_random.Next(_categories.Length)]; var adjective = _productAdjectives[_random.Next(_productAdjectives.Length)]; var noun = _productNouns[_random.Next(_productNouns.Length)]; products.Add(new Product { Id = i, Name = $"{adjective} {noun} {i}", Description = $"High-quality {adjective.ToLower()} {noun.ToLower()} for {category.ToLower()} enthusiasts", Category = category, Price = (decimal)(_random.NextDouble() * 990 + 10), // $10 to $1000 StockQuantity = _random.Next(0, 1000), CreatedAt = DateTime.UtcNow.AddDays(-_random.Next(1, 365)), UpdatedAt = DateTime.UtcNow.AddDays(-_random.Next(0, 30)) }); } return products; } private static List GenerateOrders(List customers, List products, int count) { var orders = new List(); for (int i = 1; i <= count; i++) { var customer = customers[_random.Next(customers.Count)]; var orderDate = DateTime.UtcNow.AddDays(-_random.Next(0, 365)); var itemCount = _random.Next(1, 10); var orderItems = new List(); decimal totalAmount = 0; // Add random products to the order var selectedProducts = products .OrderBy(x => _random.Next()) .Take(itemCount) .ToList(); foreach (var product in selectedProducts) { var quantity = _random.Next(1, 5); var itemTotal = product.Price * quantity; totalAmount += itemTotal; orderItems.Add(new OrderItem { ProductId = product.Id, Quantity = quantity, UnitPrice = product.Price, TotalPrice = itemTotal }); } orders.Add(new Order { Id = i, CustomerId = customer.Id, OrderDate = orderDate, TotalAmount = totalAmount, Status = GetRandomOrderStatus(orderDate), Items = orderItems }); } return orders; } private static string GetRandomOrderStatus(DateTime orderDate) { var daysSinceOrder = (DateTime.UtcNow - orderDate).Days; if (daysSinceOrder < 1) return "Pending"; else if (daysSinceOrder < 3) return _random.Next(2) == 0 ? "Processing" : "Pending"; else if (daysSinceOrder < 7) return _random.Next(3) == 0 ? "Shipped" : "Processing"; else return _random.Next(10) == 0 ? "Cancelled" : "Delivered"; } }