using System.Text.Json; using Tiku.Domain.Common; namespace Tiku.Domain.Content; public sealed class VocabularyUnit : AuditableTenantEntity { public Guid? RegionId { get; set; } public Guid? EntryId { get; set; } public Guid? ContentNodeId { get; set; } public string? LegacyId { get; set; } public string Name { get; set; } = string.Empty; public string? Description { get; set; } public int? WordCount { get; set; } public int SortOrder { get; set; } public bool IsActive { get; set; } = true; public string? SourceHash { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); } public sealed class VocabularyWord : AuditableTenantEntity { public Guid? UnitId { get; set; } public Guid? EntryId { get; set; } public Guid? ContentNodeId { get; set; } public string? LegacyId { get; set; } public string Word { get; set; } = string.Empty; public string? Phonetic { get; set; } public string? Meaning { get; set; } public string? Example { get; set; } public string? ExampleTranslation { get; set; } public int? Difficulty { get; set; } public JsonElement Tags { get; set; } = JsonDefaults.Array(); public int SortOrder { get; set; } public bool IsActive { get; set; } = true; public string? SourceHash { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); } public sealed class UserWordProgress : AuditableTenantEntity { public Guid UserId { get; set; } public Guid WordId { get; set; } public string? LegacyId { get; set; } public string? LegacyUserId { get; set; } public string? LegacyWordId { get; set; } public WordProgressStatus Status { get; set; } = WordProgressStatus.New; public int CorrectCount { get; set; } public int WrongCount { get; set; } public DateTimeOffset? LastReviewAt { get; set; } public DateTimeOffset? NextReviewAt { get; set; } public int ReviewCount { get; set; } public int CorrectStreak { get; set; } public decimal EaseFactor { get; set; } = 2.50m; public WordReviewResult? LastResult { get; set; } public WordDueLevel DueLevel { get; set; } = WordDueLevel.New; public JsonElement Metadata { get; set; } = JsonDefaults.Object(); } public sealed class UserWordFavorite : AuditableTenantEntity { public Guid UserId { get; set; } public Guid WordId { get; set; } public string? LegacyId { get; set; } public string? LegacyUserId { get; set; } public string? LegacyWordId { get; set; } public string? Note { get; set; } public DateTimeOffset? FavoritedAt { get; set; } } public sealed class HandbookSubject : AuditableTenantEntity { public Guid? RegionId { get; set; } public Guid? SchoolId { get; set; } public Guid? MajorId { get; set; } public Guid? EntryId { get; set; } public Guid? ContentNodeId { get; set; } public string? LegacyId { get; set; } public string Name { get; set; } = string.Empty; public HandbookSubjectType? Type { get; set; } public string? Icon { get; set; } public string? Color { get; set; } public string? Description { get; set; } public JsonElement MajorLegacyIds { get; set; } = JsonDefaults.Array(); public int SortOrder { get; set; } public bool IsActive { get; set; } = true; public string? SourceHash { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); } public sealed class HandbookChapter : AuditableTenantEntity { public Guid? SubjectId { get; set; } public Guid? EntryId { get; set; } public Guid? ContentNodeId { get; set; } public string? LegacyId { get; set; } public string Name { get; set; } = string.Empty; public string? Description { get; set; } public int SortOrder { get; set; } public bool IsActive { get; set; } = true; public string? SourceHash { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); } public sealed class HandbookEntry : AuditableTenantEntity { public Guid? ChapterId { get; set; } public Guid? EntryId { get; set; } public Guid? ContentNodeId { get; set; } public string? LegacyId { get; set; } public string Title { get; set; } = string.Empty; public string? Summary { get; set; } public string? Content { get; set; } public JsonElement Tags { get; set; } = JsonDefaults.Array(); public int SortOrder { get; set; } public bool IsActive { get; set; } = true; public string? SourceHash { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); } public sealed class QuestionTypeGroup : AuditableTenantEntity { public Guid? SubjectId { get; set; } public string? LegacyId { get; set; } public string DisplayName { get; set; } = string.Empty; public JsonElement Types { get; set; } = JsonDefaults.Array(); public int SortOrder { get; set; } public bool IsActive { get; set; } = true; } public sealed class SubjectShare : AuditableTenantEntity { public Guid? SourceSubjectId { get; set; } public Guid? TargetSubjectId { get; set; } public string? LegacyId { get; set; } public string? LegacySourceSubjectId { get; set; } public string? LegacyTargetSubjectId { get; set; } } public enum WordProgressStatus { New, Learning, Mastered, Reviewing, Forgotten } public enum WordReviewResult { Correct, Wrong, Known, Unknown } public enum WordDueLevel { New, Again, Soon, Later, Mastered } public enum HandbookSubjectType { Cultural, Professional, Common }