using System.Text.Json; namespace Tiku.Application.Profile; public sealed record ProfileActor(Guid TenantId, Guid UserId); public sealed record ProfileQuery(int? RecentLimit = null, int? Limit = null); public sealed record UpdateProfileCommand( string? Name, string? AvatarPreset, Guid? RegionId, Guid? SelectedSchoolId, Guid? SelectedMajorId, JsonElement? Stats, JsonElement? Progress, JsonElement? ModuleSelections, JsonElement? RecentActivities); public sealed record StudentProfileItem( Guid ProfileId, Guid UserId, string? Username, string? Phone, string? Email, string? Name, string AvatarPreset, string AvatarDisplayUrl, string PrimaryRole, int Score, Guid? RegionId, string? RegionName, Guid? SelectedSchoolId, string? SelectedSchoolName, Guid? SelectedMajorId, string? SelectedMajorName, int QuestionsAnsweredToday, int MasteredWordsCount, DateOnly? LastCheckInDate, JsonElement Stats, JsonElement Progress, JsonElement ModuleSelections, JsonElement RecentActivities, IReadOnlyCollection RecentPractices, StudentMembershipItem Membership); public sealed record RecentPracticeItem( Guid Id, string? PracticeType, string? TargetName, int Progress, DateTimeOffset? LastAccessAt, DateTimeOffset? LastPracticeAt); public sealed record StudentMembershipItem(bool IsSvip, DateTimeOffset? ExpiresAt); public sealed record ExamCountdownItem( Guid Id, string? LegacyId, Guid? RegionId, Guid? SchoolId, string ExamName, DateTimeOffset? ExamAt, string? ExamType, string? Description, JsonElement Metadata, int Order, bool IsActive, int? DaysLeft); public sealed record ExamCountdownList( IReadOnlyCollection Items, Guid? RegionId, Guid? SchoolId); public interface IProfileService { Task GetMeAsync(ProfileActor actor, ProfileQuery query, CancellationToken cancellationToken = default); Task UpdateMeAsync(ProfileActor actor, UpdateProfileCommand command, CancellationToken cancellationToken = default); Task GetExamCountdownsAsync(ProfileActor actor, ProfileQuery query, CancellationToken cancellationToken = default); }