///|
fn source_wire_limit_v4(
  options : Map[String, Json],
  key : String,
  fallback : Int32,
) -> Int32 raise {
  match options.get(key) {
    None => fallback
    Some(value) => fetch_number_v1(value, 1000000)
  }
}

///|
fn source_wire_error_v4(error : Error, format : String) -> String {
  (
    {
      "format": Json(format),
      "status": "invalid",
      "valid": false,
      "sourceFactsProduced": false,
      "sourceAuthenticated": false,
      "writerWindowVerified": false,
      "isolationModelChecked": false,
      "reason": Json(error.to_string()),
    } : Json).stringify()
}

///|
fn source_wire_install_v4(
  config_text : String,
  policy_text : String,
  log_text : String,
  receipt_text : String,
  options_text : String,
) -> SourceInstallationCheckV4 raise {
  let config = match parse_sql_config_v1(config_text) {
    Ok(value) => value
    Err(reason) => fail(reason)
  }
  let options = source_object_v4(sql_json_v1(options_text, 8192))
  known_fields(options, ["maxChecks"], "source-install-options")
  verify_source_installation_v4(
    config,
    sql_json_v1(policy_text, 8192),
    log_text,
    sql_json_v1(receipt_text, 2097152),
    max_checks=source_wire_limit_v4(options, "maxChecks", 1000000),
  )
}

///|
pub fn verify_source_installation_v4_json(
  config_text : String,
  policy_text : String,
  log_text : String,
  receipt_text : String,
  options_text : String,
) -> String {
  source_installation_check_v4_json(
    source_wire_install_v4(
      config_text, policy_text, log_text, receipt_text, options_text,
    ),
  ).stringify() catch {
    error =>
      source_wire_error_v4(error, "moontxnwitness-source-installation-check/v4")
  }
}

///|
pub fn verify_source_installation_report_v4_json(
  config_text : String,
  policy_text : String,
  log_text : String,
  receipt_text : String,
  report_text : String,
  expected_options_text : String,
) -> Bool {
  try {
    let actual = sql_json_v1(report_text, 2097152)
    let expected = source_installation_check_v4_json(
      source_wire_install_v4(
        config_text, policy_text, log_text, receipt_text, expected_options_text,
      ),
    )
    sql_canonical_v1(actual) == sql_canonical_v1(expected)
  } catch {
    _ => false
  }
}

///|
fn source_wire_mapping_v4(
  config_text : String,
  policy_text : String,
  log_text : String,
  receipt_text : String,
  execution_text : String,
  native_text : String,
  deliveries_text : String,
  context_text : String,
  options_text : String,
) -> SourceFetchMappingV4 raise {
  let config = match parse_sql_config_v1(config_text) {
    Ok(value) => value
    Err(reason) => fail(reason)
  }
  let options = source_object_v4(sql_json_v1(options_text, 8192))
  known_fields(
    options,
    ["maxChecks", "maxInstallationChecks", "maxFetchChecks", "grammarOptions"],
    "source-fetch-options",
  )
  let installation = verify_source_installation_v4(
    config,
    sql_json_v1(policy_text, 8192),
    log_text,
    sql_json_v1(receipt_text, 2097152),
    max_checks=source_wire_limit_v4(options, "maxInstallationChecks", 1000000),
  )
  let grammar_options = match options.get("grammarOptions") {
    None => sql_verification_options_v1()
    Some(value) => sql_wire_options_v1(value.stringify())
  }
  verify_source_fetch_mapping_v4(
    installation,
    sql_json_v1(execution_text, 1048576),
    sql_json_v1(native_text, 524288),
    sql_json_v1(deliveries_text, 2097152),
    sql_json_v1(context_text, 8192),
    max_checks=source_wire_limit_v4(options, "maxChecks", 1000000),
    max_fetch_checks=source_wire_limit_v4(options, "maxFetchChecks", 1000000),
    grammar_options~,
  )
}

///|
pub fn verify_source_fetch_mapping_v4_json(
  config_text : String,
  policy_text : String,
  log_text : String,
  receipt_text : String,
  execution_text : String,
  native_text : String,
  deliveries_text : String,
  context_text : String,
  options_text : String,
) -> String {
  source_fetch_mapping_v4_json(
    source_wire_mapping_v4(
      config_text, policy_text, log_text, receipt_text, execution_text, native_text,
      deliveries_text, context_text, options_text,
    ),
  ).stringify() catch {
    error =>
      source_wire_error_v4(error, "moontxnwitness-source-fetch-mapping/v4")
  }
}

///|
pub fn verify_source_fetch_mapping_report_v4_json(
  config_text : String,
  policy_text : String,
  log_text : String,
  receipt_text : String,
  execution_text : String,
  native_text : String,
  deliveries_text : String,
  context_text : String,
  report_text : String,
  expected_options_text : String,
) -> Bool {
  try {
    let actual = sql_json_v1(report_text, 4194304)
    let expected = source_fetch_mapping_v4_json(
      source_wire_mapping_v4(
        config_text, policy_text, log_text, receipt_text, execution_text, native_text,
        deliveries_text, context_text, expected_options_text,
      ),
    )
    sql_canonical_v1(actual) == sql_canonical_v1(expected)
  } catch {
    _ => false
  }
}