using System.Text.Json; using Tiku.Domain.Content; namespace Tiku.Application.Learning; public sealed record LearningActor(Guid TenantId, Guid UserId); public sealed record LearningList(IReadOnlyCollection Items); public sealed record SubmitAnswerCommand( Guid QuestionId, Guid? PracticeSessionId, IReadOnlyCollection? SelectedOptions, string? AnswerText, bool? SelfJudgedCorrect); public sealed record QuestionActionCommand(Guid QuestionId, bool? Favorite); public sealed record WordProgressCommand( Guid WordId, string? Status, int? CorrectDelta, int? WrongDelta, DateTimeOffset? NextReviewAt); public sealed record FavoriteWordCommand(Guid WordId, bool? Favorite, string? Note); public sealed record LearningLimitFilter(int? Limit = null, string? Status = null, Guid? UnitId = null); public sealed record AnswerRecordItem( Guid Id, Guid QuestionId, Guid? QuestionVersionId, Guid? PracticeSessionId, JsonElement SelectedOptions, string? AnswerText, bool? IsCorrect, DateTimeOffset AnsweredAt); public sealed record FavoriteQuestionItem( Guid QuestionId, string Source, DateTimeOffset CreatedAt); public sealed record WrongQuestionItem( Guid QuestionId, int WrongCount, DateTimeOffset LastWrongAt, DateTimeOffset? ResolvedAt); public sealed record WordProgressItem( Guid WordId, WordProgressStatus Status, int CorrectCount, int WrongCount, DateTimeOffset? LastReviewAt, DateTimeOffset? NextReviewAt, int ReviewCount, int CorrectStreak, WordReviewResult? LastResult, WordDueLevel DueLevel, JsonElement Metadata); public sealed record FavoriteWordItem( Guid WordId, string? Note, DateTimeOffset? FavoritedAt); public sealed record LearningActionResult(bool Ok, bool? IsFavorite = null);