///|
pub(all) struct MoonbookAnswer {
  kind : String
  title : String
  body : String
  sources : Array[String]
  state : String
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct MoonbookLocalizedAnswer {
  en_us : MoonbookAnswer
  zh_hans : MoonbookAnswer
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct MoonbookRegistry {
  empty : MoonbookLocalizedAnswer
  blocked : MoonbookLocalizedAnswer
  window : MoonbookLocalizedAnswer
  terrain_source : MoonbookLocalizedAnswer
  robot_authority : MoonbookLocalizedAnswer
  project : MoonbookLocalizedAnswer
  unknown : MoonbookLocalizedAnswer
} derive(Debug, Eq, ToJson, FromJson)

///|
fn moonbook_answer(
  kind : String,
  title : String,
  body : String,
  sources : Array[String],
  state : String,
) -> MoonbookAnswer {
  { kind, title, body, sources, state }
}

///|
fn moonbook_localized_answer(
  en_us : MoonbookAnswer,
  zh_hans : MoonbookAnswer,
) -> MoonbookLocalizedAnswer {
  { en_us, zh_hans }
}

///|
fn moonbook_selected_route(view : TrustedSquareViewModel) -> RouteView {
  for route in view.routes {
    if route.route_id == view.selected_route_id {
      return route
    }
  }
  view.routes[0]
}

///|
fn moonbook_rounded_3(value : Double) -> Double {
  (value * 1000.0).round() / 1000.0
}

///|
pub fn moonbook_registry(view : TrustedSquareViewModel) -> MoonbookRegistry {
  let route = moonbook_selected_route(view)
  let recommended = route.illumination.recommended_window
  let terrain_source = view.source_panel.local_source_path
  let horizon_source = route.illumination.horizon_evidence_path
  let blockers_en = view.blockers.join("; ")
  let blockers_zh = view.blockers.join(";")
  let available_energy_wh = moonbook_rounded_3(
    recommended.terrain_available_energy_wh,
  )
  let longest_dark_hours = moonbook_rounded_3(recommended.longest_dark_hours)
  {
    empty: moonbook_localized_answer(
      moonbook_answer(
        "Question needed",
        "Enter a question first",
        "Ask about mission blockers, illumination windows, terrain sources, route authority, or project architecture.",
        [],
        "is-warning",
      ),
      moonbook_answer(
        "需要问题",
        "请先输入一个问题",
        "可以询问任务阻碍、光照窗口、地形来源、路线权限或项目架构。",
        [],
        "is-warning",
      ),
    ),
    blocked: moonbook_localized_answer(
      moonbook_answer(
        "Mission facts",
        "The mission is held by \{view.blockers.length()} controlling blockers",
        "The current decision is \{view.scorecard.decision}. \{blockers_en}. Next action: \{view.scorecard.next_action}",
        [terrain_source, "src/ui/view_model.mbt", "src/ui/motion_contract.mbt"],
        "is-answered",
      ),
      moonbook_answer(
        "任务事实",
        "任务因 \{view.blockers.length()} 个控制性阻碍而暂停",
        "当前决策为 \{view.scorecard.decision}。\{blockers_zh}。下一步:\{view.scorecard.next_action}",
        [terrain_source, "src/ui/view_model.mbt", "src/ui/motion_contract.mbt"],
        "is-answered",
      ),
    ),
    window: moonbook_localized_answer(
      moonbook_answer(
        "Moon + mission facts",
        "The ranked window is \{recommended.time_start_utc} to \{recommended.time_end_utc}",
        "Route \{route.route_id} has \{available_energy_wh} Wh available and \{longest_dark_hours} h longest darkness in this candidate window. It remains a candidate until every mission gate passes.",
        [
          horizon_source,
          route.illumination.power_window_source_path,
          "src/ui/route_overlay.mbt",
        ],
        "is-answered",
      ),
      moonbook_answer(
        "月球与任务事实",
        "排名最高的窗口是 \{recommended.time_start_utc} 至 \{recommended.time_end_utc}",
        "路线 \{route.route_id} 在该候选窗口可获得 \{available_energy_wh} Wh,最长黑暗期 \{longest_dark_hours} 小时。它仍是候选窗口,必须通过全部任务门控。",
        [
          horizon_source,
          route.illumination.power_window_source_path,
          "src/ui/route_overlay.mbt",
        ],
        "is-answered",
      ),
    ),
    terrain_source: moonbook_localized_answer(
      moonbook_answer(
        "Moon facts",
        "Terrain comes from locally registered LRO LOLA evidence",
        "The loaded trusted square contains \{view.terrain_cells.length()} cells. Elevation, slope, roughness, hazard, and confidence remain traceable to \{view.source_panel.authority}.",
        [
          terrain_source,
          view.source_panel.catalog_manifest_path,
          "src/ui/inspector.mbt",
        ],
        "is-answered",
      ),
      moonbook_answer(
        "月球事实",
        "地形来自本地登记的 LRO LOLA 证据",
        "加载的可信区域包含 \{view.terrain_cells.length()} 个网格。每个网格的高程、坡度、粗糙度、危险等级和置信度均可追溯到 \{view.source_panel.authority}。",
        [
          terrain_source,
          view.source_panel.catalog_manifest_path,
          "src/ui/inspector.mbt",
        ],
        "is-answered",
      ),
    ),
    robot_authority: moonbook_localized_answer(
      moonbook_answer(
        "Project boundary",
        "No — robot motion cannot authorize a route",
        "The Noetix E1 view is a non-authoritative adapter preview. Only the mission gate can authorize a route after terrain, power, and illumination evidence passes.",
        [
          "src/ui/motion_contract.mbt", "ui/rabbita-moon/main/main.mbt", "ui/rabbita-moon/main/moonbook.mbt",
        ],
        "is-answered",
      ),
      moonbook_answer(
        "项目边界",
        "不能:机器人运动无权批准路线",
        "Noetix E1 视图只是非权威适配器预览。只有任务门控可以在地形、电力与光照证据全部通过后批准路线。",
        [
          "src/ui/motion_contract.mbt", "ui/rabbita-moon/main/main.mbt", "ui/rabbita-moon/main/moonbook.mbt",
        ],
        "is-answered",
      ),
    ),
    project: moonbook_localized_answer(
      moonbook_answer(
        "Project facts",
        "MoonBit and Rabbita form the product core",
        "MoonBit produces the mission domain and semantic view; Rabbita renders the interface. JavaScript is limited to WebGL, browser history, and input adapters.",
        [
          "src/ui/view_model.mbt", "ui/rabbita-moon/main/main.mbt", "ui/rabbita-moon/main/moonbook.mbt",
        ],
        "is-answered",
      ),
      moonbook_answer(
        "项目事实",
        "MoonBit 与 Rabbita 构成产品核心",
        "MoonBit 生成任务领域模型和语义视图,Rabbita 渲染界面;JavaScript 仅处理 WebGL、浏览器历史和输入适配。",
        [
          "src/ui/view_model.mbt", "ui/rabbita-moon/main/main.mbt", "ui/rabbita-moon/main/moonbook.mbt",
        ],
        "is-answered",
      ),
    ),
    unknown: moonbook_localized_answer(
      moonbook_answer(
        "Outside registry",
        "Moonbook does not have enough evidence for that question",
        "Rephrase it or ask about blockers, illumination, terrain provenance, route authority, the robot boundary, or project architecture.",
        ["ui/rabbita-moon/main/moonbook.mbt"],
        "is-unknown",
      ),
      moonbook_answer(
        "超出登记范围",
        "Moonbook 中没有足够证据回答这个问题",
        "请换一种问法,或询问任务阻碍、光照、地形来源、路线权限、机器人边界或项目架构。",
        ["ui/rabbita-moon/main/moonbook.mbt"],
        "is-unknown",
      ),
    ),
  }
}

///|
pub fn moonbook_registry_json(view : TrustedSquareViewModel) -> Json {
  moonbook_registry(view).to_json()
}