using Microsoft.EntityFrameworkCore; using PowderCoating.Core.Entities; namespace PowderCoating.Infrastructure.Services; public partial class SeedDataService { /// /// Seeds the global set of powder-coat manufacturer URL patterns used by the AI inventory /// lookup service to construct direct product-page links (e.g. a Prismatic Powders color /// page from a part number + color name). /// /// /// /// These records use CompanyId = 0 (a sentinel value meaning "platform-wide") rather /// than a specific tenant ID, so a single set of patterns is shared across all companies. /// The global query filter that restricts queries to the current tenant's CompanyId /// does not apply here; IgnoreQueryFilters() is used for the existence check so the /// count includes records belonging to any company including the platform-level 0. /// /// /// Idempotency: returns 0 if any patterns already exist (regardless of which manufacturer) /// rather than checking per-manufacturer, because the full set is always inserted together /// and partial sets should not occur in practice. /// /// /// ProductUrlTemplate is nullable; a null value (e.g. Powder Buy The Pound) tells /// the lookup service to fall back to a search URL rather than a direct product page. /// /// /// This method is public (unlike other seed helpers) because it is called from the /// Platform Management → Seed Data page independently of company-scoped seed operations. /// /// /// Number of patterns inserted, or 0 if patterns were already present. public async Task SeedManufacturerPatternsAsync() { // Check if any patterns already exist (global records, CompanyId = 0) var existingCount = await _context.Set() .IgnoreQueryFilters() .CountAsync(p => !p.IsDeleted); if (existingCount > 0) { return 0; // Already seeded } var patterns = new List { new ManufacturerLookupPattern { ManufacturerName = "Prismatic Powders", Domain = "prismaticpowders.com", ProductUrlTemplate = "https://www.prismaticpowders.com/shop/powder-coating-colors/{partNumber}/{slug}", SlugTransform = "LowerHyphen", IsActive = true, Notes = "Requires both part number and color name", CompanyId = 0, CreatedAt = DateTime.UtcNow }, new ManufacturerLookupPattern { ManufacturerName = "Columbia Coatings", Domain = "columbiacoatings.com", ProductUrlTemplate = "https://www.columbiacoatings.com/product/{slug}/", SlugTransform = "LowerHyphen", IsActive = true, Notes = "Color name slug only", CompanyId = 0, CreatedAt = DateTime.UtcNow }, new ManufacturerLookupPattern { ManufacturerName = "All Powder Paints", Domain = "allpowderpaints.com", ProductUrlTemplate = "https://www.allpowderpaints.com/powder-coating-colors/{slug}/", SlugTransform = "LowerHyphen", IsActive = true, Notes = "Color name slug only", CompanyId = 0, CreatedAt = DateTime.UtcNow }, new ManufacturerLookupPattern { ManufacturerName = "Tiger Drylac", Domain = "tiger-coatings.com", ProductUrlTemplate = "https://www.tiger-coatings.com/us-en/shop/show/{partNumber}", SlugTransform = "LowerHyphen", IsActive = true, Notes = "Part number required; normalize slashes to hyphens", CompanyId = 0, CreatedAt = DateTime.UtcNow }, new ManufacturerLookupPattern { ManufacturerName = "Powder Buy The Pound", Domain = "powderbuythepound.com", ProductUrlTemplate = null, SlugTransform = "LowerHyphen", IsActive = true, Notes = "Complex slug; domain used for search URL selection only", CompanyId = 0, CreatedAt = DateTime.UtcNow } }; await _context.Set().AddRangeAsync(patterns); await _context.SaveChangesAsync(); return patterns.Count; } }