// Golden replay tests for PromptBuilder — Task 5.12
// Reads 6 golden files from contract/goldens/prompt/ and verifies invariants.
// Prefix: pgr_ (prompt goldens replay)

fn pgr_read_file(path : String) -> String {
  (try? @fs.read_file_to_string(path)).unwrap_or("")
}

///| Extract a top-level string field from a JSON document. Mirrors the
///| prior JS behavior: non-string (or missing) values render as "".
fn pgr_json_field(json_str : String, field : String) -> String {
  let root = try {
    @json.parse(json_str)
  } catch {
    _ => return ""
  }
  match root {
    Json::Object(obj) =>
      match obj.get(field) {
        Some(Json::String(s)) => s
        Some(Json::True) => "true"
        Some(Json::False) => "false"
        Some(Json::Number(n)) => n.to_string()
        _ => ""
      }
    _ => ""
  }
}

// ---------------------------------------------------------------------------
// Section-presence tests
// ---------------------------------------------------------------------------

test "golden 01_empty_config: identity present" {
  let raw = pgr_read_file("contract/goldens/prompt/01_empty_config.json")
  let expected = pgr_json_field(raw, "expected")
  assert_eq(expected.contains("Ermes Agent"), true)
  assert_eq(expected.contains("persistent memory"), true)
  // No memory block, no context, no soul
  assert_eq(expected.contains("MEMORY"), false)
  assert_eq(expected.contains("Project Context"), false)
  assert_eq(expected.contains("SOUL.md"), false)
}

test "golden 02_memory_only: memory block present" {
  let raw = pgr_read_file("contract/goldens/prompt/02_memory_only.json")
  let expected = pgr_json_field(raw, "expected")
  assert_eq(expected.contains("pnpm"), true)
  assert_eq(expected.contains("MEMORY"), true)
}

test "golden 05_with_context_file: context present" {
  let raw = pgr_read_file("contract/goldens/prompt/05_with_context_file.json")
  let expected = pgr_json_field(raw, "expected")
  assert_eq(expected.contains("Project Context"), true)
  assert_eq(expected.contains("just test"), true)
}

test "golden 06_with_soul_md: soul block present" {
  let raw = pgr_read_file("contract/goldens/prompt/06_with_soul_md.json")
  let expected = pgr_json_field(raw, "expected")
  assert_eq(expected.contains("SOUL.md"), true)
  assert_eq(expected.contains("precise and thorough"), true)
}

// ---------------------------------------------------------------------------
// Assembly order test
// ---------------------------------------------------------------------------

test "golden 01 assembly order: identity before guidance" {
  let raw = pgr_read_file("contract/goldens/prompt/01_empty_config.json")
  let expected = pgr_json_field(raw, "expected")
  let idx_id = pb_index_of(expected, "Ermes Agent")
  let idx_mem = pb_index_of(expected, "persistent memory")
  assert_eq(idx_id < idx_mem, true)
}

// ---------------------------------------------------------------------------
// Model-specific guidance goldens
// ---------------------------------------------------------------------------

test "golden 07_with_openai_guidance: OpenAI guidance present" {
  let raw = pgr_read_file("contract/goldens/prompt/07_with_openai_guidance.json")
  let expected = pgr_json_field(raw, "expected")
  assert_eq(expected.contains("Execution discipline"), true)
  assert_eq(expected.contains("tool_persistence"), true)
  assert_eq(expected.contains("mandatory_tool_use"), true)
}

test "golden 08_with_google_guidance: Google guidance present" {
  let raw = pgr_read_file("contract/goldens/prompt/08_with_google_guidance.json")
  let expected = pgr_json_field(raw, "expected")
  assert_eq(expected.contains("Google model operational directives"), true)
  assert_eq(expected.contains("Absolute paths"), true)
  assert_eq(expected.contains("Parallel tool calls"), true)
}