using Microsoft.EntityFrameworkCore; using SVSim.Bootstrap.Models.Seed; using SVSim.Database; using SVSim.Database.Models; namespace SVSim.Bootstrap.Importers; /// /// Idempotent upsert of BP monthly mission rows from seeds/bp-monthly-missions.json. /// Keyed by (Year, Month, OrderNum). Rows missing from the seed are LEFT INTACT. /// public class BattlePassMonthlyMissionImporter { public async Task ImportAsync(SVSimDbContext context, string seedDir) { var seed = SeedLoader.LoadList( Path.Combine(seedDir, "bp-monthly-missions.json")); if (seed.Count == 0) { Console.WriteLine("[BattlePassMonthlyMissionImporter] No seed rows; skipping."); return 0; } var existing = await context.BattlePassMonthlyMissions .ToDictionaryAsync(e => (e.Year, e.Month, e.OrderNum)); int created = 0, updated = 0; var unmapped = new List(); foreach (var s in seed) { if (s.Year == 0 || s.Month == 0) continue; var key = (s.Year, s.Month, s.OrderNum); var entry = existing.TryGetValue(key, out var ex) ? ex : new BattlePassMonthlyMissionEntry { Year = s.Year, Month = s.Month, OrderNum = s.OrderNum, }; entry.Name = s.Name; entry.RequireNumber = s.RequireNumber; entry.BattlePassPoint = s.BattlePassPoint; entry.RewardType = s.RewardType; entry.RewardDetailId = s.RewardDetailId; entry.RewardNumber = s.RewardNumber; entry.EventType = s.EventType; entry.EventArg = s.EventArg; if (ex is null) { context.BattlePassMonthlyMissions.Add(entry); existing[key] = entry; created++; } else updated++; if (s.EventType is null) unmapped.Add($"{s.Year}-{s.Month:00}/{s.OrderNum}"); } await context.SaveChangesAsync(); Console.WriteLine($"[BattlePassMonthlyMissionImporter] +{created}/~{updated}"); if (unmapped.Count > 0) { Console.WriteLine($"[BattlePassMonthlyMissionImporter] WARN: {unmapped.Count} rows " + $"with no event_type: [{string.Join(", ", unmapped)}] — add name to " + "BP_MONTHLY_EVENT_MAP in data_dumps/scripts/extract-bp-monthly-missions.py"); } return created + updated; } }