using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespace QuestionsApi.Models; public sealed class UserProgression { [BsonId, BsonRepresentation(BsonType.ObjectId)] public string? Id { get; set; } public string UserId { get; set; } = ""; public int HighestRankOrdinal { get; set; } public DateTime TrackingStartedUtc { get; set; } public bool BaselineApplied { get; set; } public Dictionary EarnedRanksUtc { get; set; } = []; public int CurrentHardStreak { get; set; } public int BestHardStreak { get; set; } public DateTime? BestHardStreakUtc { get; set; } public PersonalRecordValue BestTimedBlock { get; set; } = new(); public PersonalRecordValue SystemsAdvancedWeek { get; set; } = new(); public PersonalRecordValue ReviewQueueReduction { get; set; } = new(); public PersonalRecordValue WeakSystemImprovement { get; set; } = new(); public DateTime UpdatedUtc { get; set; } } public sealed class PersonalRecordValue { public int Value { get; set; } public int SampleSize { get; set; } public string Detail { get; set; } = ""; public DateTime? AchievedUtc { get; set; } } public sealed class ProgressionWeeklySnapshot { [BsonId] public string Id { get; set; } = ""; public string UserId { get; set; } = ""; public DateTime WeekStartUtc { get; set; } public List OpeningSystems { get; set; } = []; public List LatestSystems { get; set; } = []; public int OpeningPendingReviews { get; set; } public int LatestPendingReviews { get; set; } public DateTime UpdatedUtc { get; set; } } public sealed class ProgressionSystemSnapshot { public string System { get; set; } = ""; public int StateOrdinal { get; set; } public int MasteryScore { get; set; } public int DistinctQuestions { get; set; } } public sealed class ProgressionRequirementResponse { public string Key { get; set; } = ""; public string Label { get; set; } = ""; public int Current { get; set; } public int Required { get; set; } public bool Complete => Current >= Required; } public sealed class ProgressionRecordResponse { public string Key { get; set; } = ""; public string Label { get; set; } = ""; public string Definition { get; set; } = ""; public int Value { get; set; } public int SampleSize { get; set; } public string Detail { get; set; } = ""; public DateTime? AchievedUtc { get; set; } public bool TrackingFromLaunch { get; set; } } public sealed class ProgressionResponse { public int RankOrdinal { get; set; } public int QualifiedRankOrdinal { get; set; } public string RankName { get; set; } = "Case Scout"; public string Division { get; set; } = "III"; public string DisplayName => $"{RankName} {Division}"; public DateTime TrackingStartedUtc { get; set; } public List EarnedBadges { get; set; } = []; public Dictionary EarnedRanksUtc { get; set; } = []; public List Ladder { get; set; } = []; public string? NextRankName { get; set; } public string? NextDivision { get; set; } public List NextRequirements { get; set; } = []; public List Records { get; set; } = []; } public sealed class ProgressionRankResponse { public int Ordinal { get; set; } public string RankName { get; set; } = ""; public string Division { get; set; } = ""; public bool Earned { get; set; } public DateTime? EarnedUtc { get; set; } public string RequirementSummary { get; set; } = ""; }