///|
fn configured_session_wire_options_v4(
  text : String,
) -> ConfiguredSessionOptionsV4 raise {
  let o = source_object_v4(sql_json_v1(text, 8192))
  known_fields(
    o,
    [
      "maxJournalChecks", "maxResults", "maxInstallationChecks", "maxFetchChecksPerResult",
      "maxReturnedRowChecksPerResult", "maxSourceChecksPerResult",
    ],
    "configured-session-options",
  )
  let result = configured_session_options_v4(
    max_journal_checks=source_wire_limit_v4(o, "maxJournalChecks", 1000000),
    max_results=source_wire_limit_v4(o, "maxResults", 32),
    max_installation_checks=source_wire_limit_v4(
      o, "maxInstallationChecks", 1000000,
    ),
    max_fetch_checks=source_wire_limit_v4(o, "maxFetchChecksPerResult", 1000000),
    max_result_checks=source_wire_limit_v4(
      o, "maxReturnedRowChecksPerResult", 1000000,
    ),
    max_source_checks=source_wire_limit_v4(
      o, "maxSourceChecksPerResult", 1000000,
    ),
  )
  match result {
    Ok(value) => value
    Err(reason) => fail(reason)
  }
}

///|
pub fn configured_session_options_v4_json(text : String) -> String {
  (
    {
      "valid": true,
      "options": configured_session_options_record_v4(
        configured_session_wire_options_v4(text),
      ),
    } : Json).stringify() catch {
    error =>
      ({ "valid": false, "error": Json(error.to_string()) } : Json).stringify()
  }
}

///|
pub fn configured_session_bundle_v4_json(text : String) -> String {
  try {
    let raw = sql_json_v1(text, 33554432)
    let f = orm_exact(raw, [
      "format", "configText", "lifecycleText", "diagnosticTraceText", "sourceInputsText",
    ])
    if f.at("format") != Json("moontxnwitness-configured-session-input/v1") {
      fail("Unknown configured session input format")
    }
    for
      key in [
        "configText", "lifecycleText", "diagnosticTraceText", "sourceInputsText",
      ] {
      ignore(sql_string_v1(f.at(key)))
    }
    ({ "valid": true, "input": raw } : Json).stringify()
  } catch {
    error =>
      ({ "valid": false, "error": Json(error.to_string()) } : Json).stringify()
  }
}

///|
pub fn diagnose_configured_session_v4_json(
  config_text : String,
  lifecycle_text : String,
  diagnostic_trace_text : String,
  source_inputs_text : String,
  options_text : String,
) -> String {
  try {
    let config = match parse_sql_config_v1(config_text) {
      Ok(c) => c
      Err(reason) => fail(reason)
    }
    configured_session_diagnostic_v4_json(
      diagnose_configured_session_v4(
        config,
        lifecycle_text,
        diagnostic_trace_text,
        sql_json_v1(source_inputs_text, 12582912),
        options=configured_session_wire_options_v4(options_text),
      ),
    ).stringify()
  } catch {
    error =>
      (
        {
          "format": "moontxnwitness-configured-session-diagnostic/v4",
          "status": "invalid",
          "sourceFactsProduced": false,
          "writerWindowVerified": false,
          "sourceAuthenticated": false,
          "serverInstanceIdentityAuthenticated": false,
          "isolationModelChecked": false,
          "isolationAnalysisReady": false,
          "reason": Json(error.to_string()),
        } : Json).stringify()
  }
}

///|
pub fn verify_configured_session_diagnostic_v4_json(
  config_text : String,
  lifecycle_text : String,
  diagnostic_trace_text : String,
  source_inputs_text : String,
  report_text : String,
  expected_options_text : String,
) -> Bool {
  try {
    let actual = sql_json_v1(report_text, 67108864)
    let expected = sql_json_v1(
      diagnose_configured_session_v4_json(
        config_text, lifecycle_text, diagnostic_trace_text, source_inputs_text, expected_options_text,
      ),
      67108864,
    )
    sql_canonical_v1(actual) == sql_canonical_v1(expected)
  } catch {
    _ => false
  }
}