using System.ComponentModel.DataAnnotations;
using System.Text.Json;
using Tiku.Application.Content;
using Tiku.Domain.Common;

namespace Tiku.Api.Contracts;

/// <summary>
/// 管理侧内容查询参数。
/// </summary>
public sealed class DirectContentQueryDto
{
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 内容入口 ID。
    /// </summary>
    public Guid? EntryId { get; set; }
    /// <summary>
    /// 内容节点 ID。
    /// </summary>
    public Guid? ContentNodeId { get; set; }
    /// <summary>
    /// 父节点 ID。
    /// </summary>
    public Guid? ParentId { get; set; }
    /// <summary>
    /// 科目 ID。
    /// </summary>
    public Guid? SubjectId { get; set; }
    /// <summary>
    /// 章节 ID。
    /// </summary>
    public Guid? ChapterId { get; set; }
    /// <summary>
    /// 单元 ID。
    /// </summary>
    public Guid? UnitId { get; set; }
    /// <summary>
    /// 院校 ID。
    /// </summary>
    public Guid? SchoolId { get; set; }
    /// <summary>
    /// 专业 ID。
    /// </summary>
    public Guid? MajorId { get; set; }
    /// <summary>
    /// 题目 ID。
    /// </summary>
    public Guid? QuestionId { get; set; }

    /// <summary>
    /// 状态。
    /// </summary>
    [StringLength(50)]
    public string? Status { get; set; }

    /// <summary>
    /// 关键字。
    /// </summary>
    [StringLength(200)]
    public string? Keyword { get; set; }

    /// <summary>
    /// 年份。
    /// </summary>
    [Range(1900, 3000)]
    public int? Year { get; set; }

    /// <summary>
    /// 返回数量上限。
    /// </summary>
    [Range(1, 1000)]
    public int? Limit { get; set; }

    public AdminLimitFilter ToFilter()
    {
        return new AdminLimitFilter(
            RegionId,
            EntryId,
            ContentNodeId,
            ParentId,
            SubjectId,
            ChapterId,
            UnitId,
            SchoolId,
            MajorId,
            QuestionId,
            Status,
            Keyword,
            Year,
            Limit);
    }
}

/// <summary>
/// 管理侧题目写入请求。
/// </summary>
public sealed class DirectQuestionWriteDto
{
    /// <summary>
    /// 题目 ID。
    /// </summary>
    public Guid? QuestionId { get; set; }
    /// <summary>
    /// 题库 ID。
    /// </summary>
    public Guid? QuestionBankId { get; set; }
    /// <summary>
    /// 科目 ID。
    /// </summary>
    public Guid? SubjectId { get; set; }
    /// <summary>
    /// 分类 ID。
    /// </summary>
    public Guid? CategoryId { get; set; }
    /// <summary>
    /// 节点 ID。
    /// </summary>
    public Guid? NodeId { get; set; }
    /// <summary>
    /// 内容入口 ID。
    /// </summary>
    public Guid? EntryId { get; set; }
    /// <summary>
    /// 内容节点 ID。
    /// </summary>
    public Guid? ContentNodeId { get; set; }
    /// <summary>
    /// 主题集 ID。
    /// </summary>
    public Guid? PrimaryCollectionId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 类型。
    /// </summary>
    public string? Type { get; set; }
    /// <summary>
    /// 类型显示名。
    /// </summary>
    public string? TypeLabel { get; set; }

    /// <summary>
    /// 难度。
    /// </summary>
    [Range(1, 5)]
    public int? Difficulty { get; set; }

    /// <summary>
    /// 标签列表。
    /// </summary>
    public JsonElement Tags { get; set; } = JsonDefaults.Array();
    /// <summary>
    /// 内容。
    /// </summary>
    public string? Content { get; set; }
    /// <summary>
    /// 选项配置。
    /// </summary>
    public JsonElement Options { get; set; } = JsonDefaults.Array();
    /// <summary>
    /// 正确选项索引。
    /// </summary>
    public int? CorrectOptionIndex { get; set; }
    /// <summary>
    /// 正确选项索引列表。
    /// </summary>
    public JsonElement CorrectOptionIndices { get; set; } = JsonDefaults.Array();
    /// <summary>
    /// 文字答案。
    /// </summary>
    public string? AnswerText { get; set; }
    /// <summary>
    /// 解析。
    /// </summary>
    public string? Explanation { get; set; }
    /// <summary>
    /// 子题列表。
    /// </summary>
    public JsonElement SubQuestions { get; set; } = JsonDefaults.Array();
    /// <summary>
    /// 代码语言。
    /// </summary>
    public string? CodeLang { get; set; }
    /// <summary>
    /// 代码模板。
    /// </summary>
    public string? CodeTemplate { get; set; }
    /// <summary>
    /// 媒体地址。
    /// </summary>
    public string? MediaUrl { get; set; }
    /// <summary>
    /// 状态。
    /// </summary>
    public string? Status { get; set; }
    /// <summary>
    /// 考试标记配置。
    /// </summary>
    public JsonElement ExamMarkers { get; set; } = JsonDefaults.Object();
    /// <summary>
    /// 来源哈希。
    /// </summary>
    public string? SourceHash { get; set; }
    /// <summary>
    /// 是否创建题目版本。
    /// </summary>
    public bool? CreateVersion { get; set; }

    public QuestionWriteCommand ToCommand(bool createVersionDefault)
    {
        return new QuestionWriteCommand(
            QuestionId,
            QuestionBankId,
            SubjectId,
            CategoryId,
            NodeId,
            EntryId,
            ContentNodeId,
            PrimaryCollectionId,
            LegacyId,
            Type,
            TypeLabel,
            Difficulty,
            Tags,
            Content,
            Options,
            CorrectOptionIndex,
            CorrectOptionIndices,
            AnswerText,
            Explanation,
            SubQuestions,
            CodeLang,
            CodeTemplate,
            MediaUrl,
            Status,
            ExamMarkers,
            SourceHash,
            CreateVersion ?? createVersionDefault);
    }
}

/// <summary>
/// 管理侧词汇单元写入请求。
/// </summary>
public sealed class DirectVocabularyUnitDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 内容入口 ID。
    /// </summary>
    public Guid? EntryId { get; set; }
    /// <summary>
    /// 内容节点 ID。
    /// </summary>
    public Guid? ContentNodeId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 名称。
    /// </summary>
    public required string Name { get; set; }
    /// <summary>
    /// 说明。
    /// </summary>
    public string? Description { get; set; }
    /// <summary>
    /// 单词数量。
    /// </summary>
    public int? WordCount { get; set; }
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool? IsActive { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public VocabularyUnitCommand ToCommand()
    {
        return new VocabularyUnitCommand(Id, RegionId, EntryId, ContentNodeId, LegacyId, Name, Description, WordCount, Order, IsActive, Metadata);
    }
}

/// <summary>
/// 管理侧词汇单词写入请求。
/// </summary>
public sealed class DirectVocabularyWordDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 单元 ID。
    /// </summary>
    public Guid? UnitId { get; set; }
    /// <summary>
    /// 内容入口 ID。
    /// </summary>
    public Guid? EntryId { get; set; }
    /// <summary>
    /// 内容节点 ID。
    /// </summary>
    public Guid? ContentNodeId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 单词。
    /// </summary>
    public required string Word { get; set; }
    /// <summary>
    /// 音标。
    /// </summary>
    public string? Phonetic { get; set; }
    /// <summary>
    /// 释义。
    /// </summary>
    public string? Meaning { get; set; }
    /// <summary>
    /// 例句。
    /// </summary>
    public string? Example { get; set; }
    /// <summary>
    /// 例句翻译。
    /// </summary>
    public string? ExampleTranslation { get; set; }
    /// <summary>
    /// 难度。
    /// </summary>
    public int? Difficulty { get; set; }
    /// <summary>
    /// 标签列表。
    /// </summary>
    public JsonElement Tags { get; set; } = JsonDefaults.Array();
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool? IsActive { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public VocabularyWordCommand ToCommand()
    {
        return new VocabularyWordCommand(
            Id,
            UnitId,
            EntryId,
            ContentNodeId,
            LegacyId,
            Word,
            Phonetic,
            Meaning,
            Example,
            ExampleTranslation,
            Difficulty,
            Tags,
            Order,
            IsActive,
            Metadata);
    }
}

/// <summary>
/// 管理侧知识手册科目写入请求。
/// </summary>
public sealed class DirectHandbookSubjectDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 院校 ID。
    /// </summary>
    public Guid? SchoolId { get; set; }
    /// <summary>
    /// 专业 ID。
    /// </summary>
    public Guid? MajorId { get; set; }
    /// <summary>
    /// 内容入口 ID。
    /// </summary>
    public Guid? EntryId { get; set; }
    /// <summary>
    /// 内容节点 ID。
    /// </summary>
    public Guid? ContentNodeId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 名称。
    /// </summary>
    public required string Name { get; set; }
    /// <summary>
    /// 类型。
    /// </summary>
    public string? Type { get; set; }
    /// <summary>
    /// 图标。
    /// </summary>
    public string? Icon { get; set; }
    /// <summary>
    /// 颜色。
    /// </summary>
    public string? Color { get; set; }
    /// <summary>
    /// 说明。
    /// </summary>
    public string? Description { get; set; }
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool? IsActive { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public HandbookSubjectCommand ToCommand()
    {
        return new HandbookSubjectCommand(
            Id,
            RegionId,
            SchoolId,
            MajorId,
            EntryId,
            ContentNodeId,
            LegacyId,
            Name,
            Type,
            Icon,
            Color,
            Description,
            Order,
            IsActive,
            Metadata);
    }
}

/// <summary>
/// 管理侧知识手册章节写入请求。
/// </summary>
public sealed class DirectHandbookChapterDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 科目 ID。
    /// </summary>
    public Guid? SubjectId { get; set; }
    /// <summary>
    /// 内容入口 ID。
    /// </summary>
    public Guid? EntryId { get; set; }
    /// <summary>
    /// 内容节点 ID。
    /// </summary>
    public Guid? ContentNodeId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 名称。
    /// </summary>
    public required string Name { get; set; }
    /// <summary>
    /// 说明。
    /// </summary>
    public string? Description { get; set; }
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool? IsActive { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public HandbookChapterCommand ToCommand()
    {
        return new HandbookChapterCommand(Id, SubjectId, EntryId, ContentNodeId, LegacyId, Name, Description, Order, IsActive, Metadata);
    }
}

/// <summary>
/// 管理侧知识手册条目写入请求。
/// </summary>
public sealed class DirectHandbookEntryDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 章节 ID。
    /// </summary>
    public Guid? ChapterId { get; set; }
    /// <summary>
    /// 内容入口 ID。
    /// </summary>
    public Guid? EntryId { get; set; }
    /// <summary>
    /// 内容节点 ID。
    /// </summary>
    public Guid? ContentNodeId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 标题。
    /// </summary>
    public required string Title { get; set; }
    /// <summary>
    /// 摘要。
    /// </summary>
    public string? Summary { get; set; }
    /// <summary>
    /// 内容。
    /// </summary>
    public string? Content { get; set; }
    /// <summary>
    /// 标签列表。
    /// </summary>
    public JsonElement Tags { get; set; } = JsonDefaults.Array();
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool? IsActive { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public HandbookEntryCommand ToCommand()
    {
        return new HandbookEntryCommand(Id, ChapterId, EntryId, ContentNodeId, LegacyId, Title, Summary, Content, Tags, Order, IsActive, Metadata);
    }
}

/// <summary>
/// 管理侧院校写入请求。
/// </summary>
public sealed class DirectSchoolDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 名称。
    /// </summary>
    public required string Name { get; set; }
    /// <summary>
    /// 专业考试日期。
    /// </summary>
    public string? ProfessionalExamDate { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public SchoolCommand ToCommand()
    {
        return new SchoolCommand(Id, RegionId, LegacyId, Name, ProfessionalExamDate, Metadata);
    }
}

/// <summary>
/// 管理侧专业写入请求。
/// </summary>
public sealed class DirectMajorDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 院校 ID。
    /// </summary>
    public Guid? SchoolId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 名称。
    /// </summary>
    public required string Name { get; set; }
    /// <summary>
    /// 说明。
    /// </summary>
    public string? Description { get; set; }
    /// <summary>
    /// 备考建议。
    /// </summary>
    public string? StudyTips { get; set; }
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool? IsActive { get; set; }

    public MajorCommand ToCommand()
    {
        return new MajorCommand(Id, RegionId, SchoolId, LegacyId, Name, Description, StudyTips, Order, IsActive);
    }
}

/// <summary>
/// 管理侧分数线字段写入请求。
/// </summary>
public sealed class DirectScorelineFieldDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 字段键。
    /// </summary>
    public required string FieldKey { get; set; }
    /// <summary>
    /// 字段名称。
    /// </summary>
    public required string FieldName { get; set; }
    /// <summary>
    /// 字段类型。
    /// </summary>
    public string? FieldType { get; set; }
    /// <summary>
    /// 单位。
    /// </summary>
    public string? Unit { get; set; }
    /// <summary>
    /// 是否可筛选。
    /// </summary>
    public bool? IsFilter { get; set; }
    /// <summary>
    /// 是否必填。
    /// </summary>
    public bool? IsRequired { get; set; }
    /// <summary>
    /// 是否可见。
    /// </summary>
    public bool? IsVisible { get; set; }
    /// <summary>
    /// 是否参与趋势展示。
    /// </summary>
    public bool? IsTrend { get; set; }
    /// <summary>
    /// 选项配置。
    /// </summary>
    public JsonElement Options { get; set; } = JsonDefaults.Array();
    /// <summary>
    /// 占位提示。
    /// </summary>
    public string? Placeholder { get; set; }
    /// <summary>
    /// 说明。
    /// </summary>
    public string? Description { get; set; }
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }

    public ScorelineFieldCommand ToCommand()
    {
        return new ScorelineFieldCommand(
            Id,
            RegionId,
            LegacyId,
            FieldKey,
            FieldName,
            FieldType,
            Unit,
            IsFilter,
            IsRequired,
            IsVisible,
            IsTrend,
            Options,
            Placeholder,
            Description,
            Order);
    }
}

/// <summary>
/// 管理侧分数线记录写入请求。
/// </summary>
public sealed class DirectScorelineRecordDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 院校 ID。
    /// </summary>
    public Guid? SchoolId { get; set; }
    /// <summary>
    /// 专业 ID。
    /// </summary>
    public Guid? MajorId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }

    /// <summary>
    /// 年份。
    /// </summary>
    [Range(1900, 3000)]
    public int Year { get; set; }

    /// <summary>
    /// 院校名称。
    /// </summary>
    public string? SchoolName { get; set; }
    /// <summary>
    /// 专业名称。
    /// </summary>
    public string? MajorName { get; set; }
    /// <summary>
    /// 动态字段值。
    /// </summary>
    public JsonElement FieldValues { get; set; } = JsonDefaults.Object();

    public ScorelineRecordCommand ToCommand()
    {
        return new ScorelineRecordCommand(
            Id,
            RegionId,
            SchoolId,
            MajorId,
            LegacyId,
            Year,
            SchoolName,
            MajorName,
            FieldValues);
    }
}

/// <summary>
/// 管理侧视频写入请求。
/// </summary>
public sealed class DirectVideoDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 科目 ID。
    /// </summary>
    public Guid? SubjectId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 标题。
    /// </summary>
    public required string Title { get; set; }
    /// <summary>
    /// 说明。
    /// </summary>
    public string? Description { get; set; }
    /// <summary>
    /// 视频地址。
    /// </summary>
    public string? VideoUrl { get; set; }
    /// <summary>
    /// 缩略图地址。
    /// </summary>
    public string? ThumbnailUrl { get; set; }
    /// <summary>
    /// 时长，单位为秒。
    /// </summary>
    public int? DurationSeconds { get; set; }
    /// <summary>
    /// 知识标签。
    /// </summary>
    public JsonElement KnowledgeTags { get; set; } = JsonDefaults.Array();
    /// <summary>
    /// 是否通用视频。
    /// </summary>
    public bool? IsGeneral { get; set; }
    /// <summary>
    /// 难度。
    /// </summary>
    public int? Difficulty { get; set; }
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool? IsActive { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public VideoExplanationCommand ToCommand()
    {
        return new VideoExplanationCommand(
            Id,
            SubjectId,
            LegacyId,
            Title,
            Description,
            VideoUrl,
            ThumbnailUrl,
            DurationSeconds,
            KnowledgeTags,
            IsGeneral,
            Difficulty,
            Order,
            IsActive,
            Metadata);
    }
}

/// <summary>
/// 管理侧题目视频绑定请求。
/// </summary>
public sealed class DirectQuestionVideoDto
{
    /// <summary>
    /// 题目 ID。
    /// </summary>
    public Guid QuestionId { get; set; }
    /// <summary>
    /// 视频 ID。
    /// </summary>
    public Guid VideoId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 视频类型。
    /// </summary>
    public string? VideoType { get; set; }
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public QuestionVideoCommand ToCommand()
    {
        return new QuestionVideoCommand(QuestionId, VideoId, LegacyId, VideoType, Order, Metadata);
    }
}

/// <summary>
/// 管理侧运营内容写入请求。
/// </summary>
public sealed class DirectOperationContentDto
{
    /// <summary>
    /// ID。
    /// </summary>
    public Guid? Id { get; set; }
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 院校 ID。
    /// </summary>
    public Guid? SchoolId { get; set; }
    /// <summary>
    /// 历史系统 ID。
    /// </summary>
    public string? LegacyId { get; set; }
    /// <summary>
    /// 标题。
    /// </summary>
    public string? Title { get; set; }
    /// <summary>
    /// 副标题。
    /// </summary>
    public string? Subtitle { get; set; }
    /// <summary>
    /// 内容。
    /// </summary>
    public string? Content { get; set; }
    /// <summary>
    /// 问题。
    /// </summary>
    public string? Question { get; set; }
    /// <summary>
    /// 答案。
    /// </summary>
    public string? Answer { get; set; }
    /// <summary>
    /// 链接地址。
    /// </summary>
    public string? Link { get; set; }
    /// <summary>
    /// 按钮文案。
    /// </summary>
    public string? ButtonText { get; set; }
    /// <summary>
    /// 按钮链接。
    /// </summary>
    public string? ButtonLink { get; set; }
    /// <summary>
    /// 背景颜色。
    /// </summary>
    public string? BackgroundColor { get; set; }
    /// <summary>
    /// 边框颜色。
    /// </summary>
    public string? BorderColor { get; set; }
    /// <summary>
    /// 考试名称。
    /// </summary>
    public string? ExamName { get; set; }
    /// <summary>
    /// 考试时间。
    /// </summary>
    public DateTimeOffset? ExamAt { get; set; }
    /// <summary>
    /// 考试类型。
    /// </summary>
    public string? ExamType { get; set; }
    /// <summary>
    /// 说明。
    /// </summary>
    public string? Description { get; set; }
    /// <summary>
    /// 显示顺序。
    /// </summary>
    public int? Order { get; set; }
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool? IsActive { get; set; }
    /// <summary>
    /// 扩展元数据。
    /// </summary>
    public JsonElement Metadata { get; set; } = JsonDefaults.Object();

    public OperationContentCommand ToCommand()
    {
        return new OperationContentCommand(
            Id,
            RegionId,
            SchoolId,
            LegacyId,
            Title,
            Subtitle,
            Content,
            Question,
            Answer,
            Link,
            ButtonText,
            ButtonLink,
            BackgroundColor,
            BorderColor,
            ExamName,
            ExamAt,
            ExamType,
            Description,
            Order,
            IsActive,
            Metadata);
    }
}

/// <summary>
/// 管理侧内容导入请求。
/// </summary>
public sealed class DirectImportDto
{
    /// <summary>
    /// 来源格式。
    /// </summary>
    public string? SourceFormat { get; set; }
    /// <summary>
    /// 来源名称。
    /// </summary>
    public string? SourceName { get; set; }
    /// <summary>
    /// 地区 ID。
    /// </summary>
    public Guid? RegionId { get; set; }
    /// <summary>
    /// 内容入口 ID。
    /// </summary>
    public Guid? EntryId { get; set; }
    /// <summary>
    /// 内容节点 ID。
    /// </summary>
    public Guid? ContentNodeId { get; set; }
    /// <summary>
    /// 科目 ID。
    /// </summary>
    public Guid? SubjectId { get; set; }
    /// <summary>
    /// 分类 ID。
    /// </summary>
    public Guid? CategoryId { get; set; }
    /// <summary>
    /// 题库 ID。
    /// </summary>
    public Guid? QuestionBankId { get; set; }
    /// <summary>
    /// 题集 ID。
    /// </summary>
    public Guid? CollectionId { get; set; }
    /// <summary>
    /// 是否异步执行。
    /// </summary>
    public bool? Async { get; set; }
    /// <summary>
    /// 数据项列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Items { get; set; }
    /// <summary>
    /// 单元数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Units { get; set; }
    /// <summary>
    /// 单词数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Words { get; set; }
    /// <summary>
    /// 科目数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Subjects { get; set; }
    /// <summary>
    /// 条目数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Entries { get; set; }
    /// <summary>
    /// 字段数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Fields { get; set; }
    /// <summary>
    /// 院校数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Schools { get; set; }
    /// <summary>
    /// 专业数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Majors { get; set; }
    /// <summary>
    /// 记录数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Records { get; set; }
    /// <summary>
    /// 视频数据列表。
    /// </summary>
    public IReadOnlyCollection<JsonElement>? Videos { get; set; }

    public SimpleImportCommand ToCommand(string importType, bool dryRun)
    {
        return new SimpleImportCommand(
            importType,
            SourceFormat,
            SourceName,
            RegionId,
            EntryId,
            ContentNodeId,
            SubjectId,
            CategoryId,
            QuestionBankId,
            CollectionId,
            ResolveItems(importType),
            dryRun);
    }

    private IReadOnlyCollection<JsonElement> ResolveItems(string importType)
    {
        return importType.ToLowerInvariant() switch
        {
            "questions" => Items ?? [],
            "vocabulary" => Words ?? Units ?? Items ?? [],
            "handbook" => Entries ?? Subjects ?? Items ?? [],
            "scoreline" => Records ?? Schools ?? Majors ?? Fields ?? Items ?? [],
            "videos" => Videos ?? Items ?? [],
            _ => Items ?? []
        };
    }
}

/// <summary>
/// 管理侧内容导入任务查询请求。
/// </summary>
public sealed class DirectImportJobDto
{
    /// <summary>
    /// 任务 ID。
    /// </summary>
    public Guid JobId { get; set; }
}
