///|
/// Presentation language only. Machine-readable codes and reader notes stay intact.
pub(all) enum ReportLanguage {
  English
  SimplifiedChinese
} derive(Debug, Eq)

///|
pub extend ReportLanguage with @debug.Debug::{to_repr}

///|
pub extend ReportLanguage with Eq::{equal, not_equal}

///|
fn tr(language : ReportLanguage, english : String, chinese : String) -> String {
  match language {
    English => english
    SimplifiedChinese => chinese
  }
}

///|
fn axis_label(kind : @lesion.LesionKind, language : ReportLanguage) -> String {
  match kind {
    NonNodal => tr(language, "Longest diameter", "最长径")
    LymphNode => tr(language, "Node short axis", "淋巴结短轴")
  }
}

///|
fn observation_label(
  observation : @visit.Observation,
  language : ReportLanguage,
) -> String {
  match observation {
    Measured(_) => tr(language, "measured", "实际测量")
    Absent => tr(language, "absent (0.0 mm)", "明确消失(0.0 mm)")
    TooSmallToMeasure =>
      tr(
        language, "too_small (5.0 mm default)", "可见但过小(默认 5.0 mm)",
      )
    Missing => tr(language, "missing (no value)", "漏测(无数值)")
    NotEvaluable(_) =>
      tr(
        language, "not_evaluable (reader reason)", "无法评价(读片者说明)",
      )
  }
}

///|
fn finding_label(
  finding : @evidence.Finding,
  language : ReportLanguage,
) -> String {
  if language == English {
    return finding.message
  }
  match finding.code {
    "default_5mm" =>
      "靶病灶可见但无法可靠测量;使用明确标注的 5.0 mm 默认值。"
    "missing_measurement" =>
      "缺少靶病灶测量;不推算直径,也不填为零。"
    "reader_not_evaluable" => "读片者说明:" + finding.message
    "node_below_10mm" =>
      "淋巴结短轴小于 10.0 mm;实际直径仍保留在总和中。"
    "technique_mismatch" =>
      "采集标识与基线不同;可比性需要人工复核。"
    "target_cr" =>
      "全部靶病灶符合本规则配置的靶病灶完全缓解条件。"
    "target_pr" =>
      "直径总和较基线减少至少 30%,且不满足靶病灶 PD 条件。"
    "target_pd" =>
      "相对于此前可用最低值,同时满足至少 20% 增长及至少 5.0 mm 绝对增加。"
    "target_sd" =>
      "靶病灶测量未达到 CR、PR 或同时满足的两项 PD 条件。"
    "prior_pr_context_required" =>
      "此前靶病灶 PR 不再达到基线缩小阈值,且未满足 PD;确认与持续性需要额外评价背景。"
    "reappearance_after_target_cr" =>
      "靶病灶 CR 后再次出现;需要整体评价背景,本次及后续随访保留为 NE。"
    "track_requires_review" =>
      "此前的进展或背景复核门槛持续生效;本次随访保留为 NE。"
    "no_followup" => "尚未提供随访记录。"
    _ => "复核提示:" + finding.message
  }
}

///|
fn glossary(language : ReportLanguage) -> String {
  tr(
    language, "Target-only terms: CR complete response; PR partial response; SD stable disease; PD progressive disease; NE not evaluable. Baseline is the initial target sum; prior nadir is the lowest earlier eligible sum. n/a means unavailable, never zero.",
    "靶病灶术语:CR 完全缓解;PR 部分缓解;SD 疾病稳定;PD 疾病进展;NE 无法评价。基线是初始靶病灶总和;此前最低值是更早可用随访中的最小总和。n/a 表示数值不可用,不代表零。",
  )
}

///|
/// Localized diagnostic summary; the original detail is retained verbatim.
fn diagnostic_message(
  code : String,
  detail : String,
  language : ReportLanguage,
) -> String {
  if language == English {
    return detail
  }
  let summary = match code {
    "json_syntax" => "JSON 语法错误"
    "study_schema" => "研究配置字段不符合约定"
    "csv_header" => "CSV 表头不符合约定"
    "csv_columns" => "CSV 列数不正确"
    "csv_quoting" => "CSV 引号格式错误"
    "csv_diameter" => "CSV 直径格式或精度不正确"
    "csv_state" => "观察状态与直径或说明不匹配"
    "csv_metadata" => "同次随访的日期或采集标识不一致"
    "csv_visit_order" => "同次随访的记录必须连续"
    "invalid_date" => "日期无效"
    "visit_order" => "随访日期须在基线之后严格递增"
    "duplicate_id" => "标识重复或使用了保留标识"
    "unknown_target" => "测量引用了基线集合之外的病灶"
    "invalid_study" => "研究或随访元数据不符合约定"
    "invalid_target" => "基线靶病灶不符合输入约定"
    "invalid_measurement" => "测量值或无法评价的说明不符合约定"
    "target_count" => "靶病灶数量不符合约定"
    "organ_target_count" => "同一器官组的靶病灶数量超限"
    _ => "请核对输入或复核背景"
  }
  summary + "(" + detail + ")"
}