#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
README_PATH="${ROOT_DIR}/README.md"
MIGRATION_PATH="${ROOT_DIR}/MIGRATION.md"

require_pattern() {
  local pattern="$1"
  local file="$2"
  if command -v rg >/dev/null 2>&1; then
    if rg -F --quiet "$pattern" "$file"; then
      return 0
    fi
  elif grep -F -q "$pattern" "$file"; then
    return 0
  fi

  if [[ -f "$file" ]]; then
    echo "Missing required migration pattern in ${file}: ${pattern}" >&2
  fi
  exit 1
}

if [[ ! -f "$README_PATH" ]]; then
  echo "README.md not found at ${README_PATH}" >&2
  exit 1
fi

# README must keep the current migration-entry section plus recent breaking mappings.
require_pattern "### 🔁 0.10 Public Model Migration" "$README_PATH"
require_pattern "ResponseUsage::new(...)" "$README_PATH"
require_pattern "ToolCall::new(...)" "$README_PATH"
require_pattern "Add wildcard arms when matching affected public enums" "$README_PATH"
require_pattern "### 🔁 0.9 Audio Speech Migration" "$README_PATH"
require_pattern "client.tts().create(...)" "$README_PATH"
require_pattern "client.audio().speech().create(...)" "$README_PATH"
require_pattern "api::tts::TtsRequest" "$README_PATH"
require_pattern "api::audio::SpeechRequest" "$README_PATH"

# README must also keep historical migration-entry mappings while those
# historical sections remain part of the public upgrade docs.
require_pattern "### 🔁 0.6 Naming/Pagination Migration" "$README_PATH"
require_pattern "models().count()" "$README_PATH"
require_pattern "models().get_model_count()" "$README_PATH"
require_pattern "models().list_for_user()" "$README_PATH"
require_pattern "models().list_user_models()" "$README_PATH"
require_pattern "management().exchange_code_for_api_key(...)" "$README_PATH"
require_pattern "management().create_api_key_from_auth_code(...)" "$README_PATH"

# If MIGRATION.md exists (OR-25 and later), validate current and historical key structure.
if [[ -f "$MIGRATION_PATH" ]]; then
  require_pattern "# Migration Guide" "$MIGRATION_PATH"
  require_pattern "## Latest: 0.9.x -> 0.10.0" "$MIGRATION_PATH"
  require_pattern "## Previous: 0.8.x -> 0.9.0" "$MIGRATION_PATH"
  require_pattern "## Earlier: 0.7.x -> 0.8.0" "$MIGRATION_PATH"
  require_pattern "## Historical: 0.5.x -> 0.6.0" "$MIGRATION_PATH"
  require_pattern "ResponseUsage::new(prompt_tokens, completion_tokens, total_tokens)" "$MIGRATION_PATH"
  require_pattern "ToolCall::new(id, name, arguments).with_index(index)" "$MIGRATION_PATH"
  require_pattern "Add a wildcard arm" "$MIGRATION_PATH"
  require_pattern "client.audio().speech().create" "$MIGRATION_PATH"
  require_pattern "api::audio::{SpeechRequest, SpeechResponseFormat}" "$MIGRATION_PATH"
  require_pattern "UpdateWorkspaceRequest::builder()" "$MIGRATION_PATH"
  require_pattern "## Breaking-Change Mapping" "$MIGRATION_PATH"
  require_pattern "## Top 10 Before/After Recipes" "$MIGRATION_PATH"
  require_pattern "OpenRouterClientBuilder::management_key" "$MIGRATION_PATH"
  require_pattern "api::legacy::completion" "$MIGRATION_PATH"
  require_pattern "client.legacy().completions().create" "$MIGRATION_PATH"

  if command -v rg >/dev/null 2>&1; then
    recipe_count="$(rg -n "^### [0-9]+\\)" "$MIGRATION_PATH" | wc -l | tr -d ' ')"
  else
    recipe_count="$(grep -E -n "^### [0-9]+\\)" "$MIGRATION_PATH" | wc -l | tr -d ' ')"
  fi
  if [[ "$recipe_count" -ne 10 ]]; then
    echo "Expected 10 numbered migration recipes in MIGRATION.md, found ${recipe_count}" >&2
    exit 1
  fi
fi

echo "Migration documentation checks passed."
