using System.Text.Json; using Tiku.Domain.Common; namespace Tiku.Domain.Content; public sealed class QuestionAsset : AuditableTenantEntity { public Guid? FamilyId { get; set; } public Guid? CurrentRevisionId { get; set; } public string DeliveryFingerprint { get; set; } = string.Empty; public QuestionAssetStatus Status { get; set; } = QuestionAssetStatus.Draft; public Guid? CreatedBy { get; set; } public Guid? UpdatedBy { get; set; } } public sealed class QuestionRevision : Entity, ITenantOwned { public Guid QuestionAssetId { get; set; } public int RevisionNo { get; set; } = 1; public string QuestionType { get; set; } = "choice"; public string? TypeLabel { get; set; } public int? Difficulty { get; set; } public string NormalizedContent { get; set; } = string.Empty; public string? Content { get; set; } public JsonElement Options { get; set; } = JsonDefaults.Array(); public int? CorrectOptionIndex { get; set; } public JsonElement CorrectOptionIndices { get; set; } = JsonDefaults.Array(); public string? AnswerText { get; set; } public string? Explanation { get; set; } public JsonElement SubQuestions { get; set; } = JsonDefaults.Array(); public string? CodeLang { get; set; } public string? CodeTemplate { get; set; } public string DeliveryFingerprint { get; set; } = string.Empty; public Guid? CreatedBy { get; set; } public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; public Guid TenantId { get; set; } } public sealed class QuestionFamily : AuditableTenantEntity { public string Name { get; set; } = string.Empty; public string? Description { get; set; } public Guid? CreatedBy { get; set; } } public sealed class QuestionPlacement : AuditableTenantEntity { public Guid QuestionAssetOwnerTenantId { get; set; } public Guid QuestionAssetId { get; set; } public Guid CurriculumVersionId { get; set; } public Guid CurriculumNodeId { get; set; } public Guid AssessmentPolicyVersionId { get; set; } public int? DifficultyOverride { get; set; } public QuestionPlacementStatus Status { get; set; } = QuestionPlacementStatus.Draft; public DateTimeOffset? ValidFrom { get; set; } public DateTimeOffset? ValidTo { get; set; } public Guid? CreatedBy { get; set; } public Guid? UpdatedBy { get; set; } } public sealed class QuestionPlacementConcept : Entity, ITenantOwned { public Guid PlacementId { get; set; } public Guid KnowledgeConceptId { get; set; } public Guid TenantId { get; set; } } public sealed class QuestionPlacementRuleGroup : Entity, ITenantOwned { public Guid PlacementId { get; set; } public int GroupOrder { get; set; } public Guid TenantId { get; set; } } public sealed class QuestionPlacementRuleCondition : Entity, ITenantOwned { public Guid RuleGroupId { get; set; } public Guid TargetDimensionDefinitionId { get; set; } public Guid TargetNodeId { get; set; } public TargetRuleOperator Operator { get; set; } = TargetRuleOperator.Exact; public Guid TenantId { get; set; } } public enum QuestionAssetStatus { Draft, Published, Archived } public enum QuestionPlacementStatus { Draft, Active, Retired } public enum TargetRuleOperator { Exact, DescendantOf, NotExact, NotDescendantOf }