using SVSim.Database.Models; namespace SVSim.Database.Repositories.Mission; public interface IMissionCatalogRepository { Task> GetByLotTypeAsync(int lotType, CancellationToken ct); Task> GetByIdsAsync(IReadOnlyCollection ids, CancellationToken ct); Task GetByIdAsync(int id, CancellationToken ct); Task> GetByEventTypesAsync(IReadOnlyCollection eventTypes, CancellationToken ct); Task> GetAchievementsByEventTypesAsync(IReadOnlyCollection eventTypes, CancellationToken ct); /// All distinct achievement_type values present in the catalog. Used by /load/index materialization. Task> GetAllAchievementTypesAsync(CancellationToken ct); /// MIN(Level) per achievement_type — the "starting tier" for new viewers when the /// catalog doesn't contain a level-1 row. With our captured-data-is-catalog model, a fresh /// viewer starts at whatever the lowest captured tier is for that type. Task> GetMinLevelByAchievementTypeAsync(CancellationToken ct); /// MAX(Level) per achievement_type — cached. Used to compute wire max_level. Task> GetMaxLevelByAchievementTypeAsync(CancellationToken ct); /// Catalog row at (type, level), or null if no such tier has been captured. Task GetAchievementAsync(int achievementType, int level, CancellationToken ct); Task> GetMonthlyMissionsAsync(int year, int month, CancellationToken ct); }