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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
OUT_DIR_INPUT="${1:-$ROOT_DIR/target/docs-site}"
if [[ "$OUT_DIR_INPUT" = /* ]]; then
  OUT_DIR="$OUT_DIR_INPUT"
else
  OUT_DIR="$ROOT_DIR/$OUT_DIR_INPUT"
fi
mkdir -p "$(dirname "$OUT_DIR")"
OUT_DIR="$(cd "$(dirname "$OUT_DIR")" && pwd -P)/$(basename "$OUT_DIR")"
API_DIR="$OUT_DIR/api"
DOC_ROOT="$ROOT_DIR/target/doc"
API_INDEX_MD="$ROOT_DIR/docs/api_index.md"
PROJECT_DOCS_DIR="$OUT_DIR/docs"
DEFAULT_PROJECT_DOCS_DIR="$ROOT_DIR/target/docs-site/docs"

rm -rf "$OUT_DIR"
mkdir -p "$API_DIR"

render_overview_html() {
  if [[ -f "$API_INDEX_MD" ]]; then
    if command -v pandoc >/dev/null 2>&1; then
      pandoc "$API_INDEX_MD" -f gfm -t html5
      return
    fi
    printf '<pre>'
    sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g' "$API_INDEX_MD"
    printf '</pre>\n'
    return
  fi

  python3 - "$ROOT_DIR" <<'PY'
import html
import json
import pathlib
import subprocess
import sys

root = pathlib.Path(sys.argv[1])


def workspace_lib_crates(root):
    metadata = json.loads(
        subprocess.run(
            [
                "cargo",
                "metadata",
                "--no-deps",
                "--format-version",
                "1",
                "--manifest-path",
                str(root / "Cargo.toml"),
            ],
            check=True,
            capture_output=True,
            text=True,
        ).stdout
    )
    workspace_members = set(metadata["workspace_members"])
    for package in metadata["packages"]:
        if package["id"] not in workspace_members:
            continue
        if not any("lib" in target["kind"] for target in package["targets"]):
            continue
        yield package


print("<h1>Workspace API</h1>")
print("<p>Autogenerated crate inventory for this workspace.</p>")
print("<ul>")
for package in workspace_lib_crates(root):
    doc_dir = package["name"].replace("-", "_")
    print(f'<li><a href="{html.escape(doc_dir)}/index.html">{html.escape(package["name"])}</a></li>')
print("</ul>")
PY
}

render_crate_inventory_html() {
  python3 - "$ROOT_DIR" <<'PY'
import html
import json
import pathlib
import subprocess
import sys

root = pathlib.Path(sys.argv[1])


def workspace_lib_crates(root):
    metadata = json.loads(
        subprocess.run(
            [
                "cargo",
                "metadata",
                "--no-deps",
                "--format-version",
                "1",
                "--manifest-path",
                str(root / "Cargo.toml"),
            ],
            check=True,
            capture_output=True,
            text=True,
        ).stdout
    )
    workspace_members = set(metadata["workspace_members"])
    for package in metadata["packages"]:
        if package["id"] not in workspace_members:
            continue
        if not any("lib" in target["kind"] for target in package["targets"]):
            continue
        manifest_dir = pathlib.Path(package["manifest_path"]).parent.resolve()
        member = manifest_dir.relative_to(root).as_posix()
        yield package, "." if member == "." else member


print("<h2>Workspace Crates</h2>")
print("<ul>")
for package, member in workspace_lib_crates(root):
    doc_dir = package["name"].replace("-", "_")
    print(
        f'<li><a href="{html.escape(doc_dir)}/index.html">{html.escape(package["name"])}</a>'
        f' <code>{html.escape(member)}</code></li>'
    )
print("</ul>")
PY
}

echo "[1/5] Building rustdoc"
rm -rf "$DOC_ROOT"
cargo doc --workspace --no-deps

echo "[2/5] Copying rustdoc output"
cp -a "$DOC_ROOT/." "$API_DIR/"

echo "[3/5] Generating optional dependency graph"
if [[ -x "$ROOT_DIR/scripts/gen_dep_graph.py" || -f "$ROOT_DIR/scripts/gen_dep_graph.py" ]]; then
  if command -v dot >/dev/null 2>&1; then
    python3 "$ROOT_DIR/scripts/gen_dep_graph.py" --root-dir "$ROOT_DIR" | dot -Tsvg > "$API_DIR/dep_graph.svg"
  else
    echo "  Warning: graphviz (dot) not found; dependency graph skipped."
    if [[ "${CI:-}" == "true" ]]; then
      echo "  graphviz is required in CI to render the dependency graph."
      exit 1
    fi
  fi
else
  echo "  No scripts/gen_dep_graph.py found; skipping dependency graph."
fi

echo "[4/5] Rendering API landing page"
OVERVIEW_HTML="$(render_overview_html)"
CRATE_INVENTORY_HTML="$(render_crate_inventory_html)"
{
  cat <<'HEADER'
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Workspace API docs</title>
    <style>
      body { font-family: "IBM Plex Sans", "Segoe UI", sans-serif; margin: 2rem auto; max-width: 56rem; padding: 0 1rem; color: #14231f; }
      h1 { margin-bottom: 0.5rem; }
      h2 { margin-top: 2rem; color: #2e3d38; }
      p { color: #3a4a45; line-height: 1.6; }
      ul { line-height: 1.8; }
      a { color: #0c7a5a; text-decoration: none; }
      a:hover { text-decoration: underline; }
      code { font-family: "IBM Plex Mono", "SFMono-Regular", monospace; }
      pre { background: #f4f7f5; padding: 1rem; border-radius: 6px; overflow-x: auto; }
      .inventory code { margin-left: 0.4rem; color: #426058; }
    </style>
  </head>
  <body>
HEADER
  printf '%s\n' "$OVERVIEW_HTML"
  printf '<section class="inventory">\n%s\n</section>\n' "$CRATE_INVENTORY_HTML"
  cat <<'FOOTER'
  </body>
</html>
FOOTER
} >"$API_DIR/index.html"

python3 "$ROOT_DIR/scripts/check-docs-site.py" --root-dir "$ROOT_DIR" --site-index "$API_DIR/index.html"

echo "[5/5] Rendering project docs if configured"
if [[ -f "$ROOT_DIR/docs/_quarto.yml" ]]; then
  if command -v quarto >/dev/null 2>&1; then
    if [[ "$PROJECT_DOCS_DIR" != "$DEFAULT_PROJECT_DOCS_DIR" ]]; then
      rm -rf "$DEFAULT_PROJECT_DOCS_DIR"
    fi
    quarto render "$ROOT_DIR/docs"
    if [[ "$PROJECT_DOCS_DIR" != "$DEFAULT_PROJECT_DOCS_DIR" ]]; then
      rm -rf "$PROJECT_DOCS_DIR"
      mkdir -p "$(dirname "$PROJECT_DOCS_DIR")"
      cp -a "$DEFAULT_PROJECT_DOCS_DIR" "$PROJECT_DOCS_DIR"
    fi
  else
    echo "  Warning: quarto not found; project docs site skipped."
    if [[ "${CI:-}" == "true" ]]; then
      echo "  quarto is required in CI to render project docs."
      exit 1
    fi
  fi
else
  echo "  No docs/_quarto.yml found; skipping design docs render."
fi

echo "[6/6] Generating site top page"
REPO_TITLE="$(basename "$ROOT_DIR")"
if [[ -d "$PROJECT_DOCS_DIR" ]]; then
  PROJECT_DOCS_CARD='
        <section class="card">
          <h2>Project Documentation</h2>
          <p>Getting started material, tutorials, guides, architecture notes, and design records.</p>
          <a href="./docs/">Open project docs</a>
        </section>'
else
  PROJECT_DOCS_CARD=""
fi

cat >"$OUT_DIR/index.html" <<EOF
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>${REPO_TITLE} docs</title>
    <style>
      :root {
        --bg: #f4f7f5;
        --fg: #14231f;
        --muted: #426058;
        --accent: #0c7a5a;
        --card: #ffffff;
        --line: #d6e3de;
      }
      body {
        margin: 0;
        font-family: "IBM Plex Sans", "Segoe UI", sans-serif;
        color: var(--fg);
        background: radial-gradient(circle at top right, #eaf6ef, var(--bg) 55%);
      }
      main {
        max-width: 920px;
        margin: 0 auto;
        padding: 40px 20px 56px;
      }
      h1 {
        margin: 0 0 10px;
        font-size: 2rem;
      }
      p {
        margin: 0 0 12px;
        color: var(--muted);
        line-height: 1.55;
      }
      .grid {
        display: grid;
        grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
        gap: 14px;
        margin-top: 26px;
      }
      .card {
        border: 1px solid var(--line);
        background: var(--card);
        border-radius: 10px;
        padding: 16px;
      }
      .card h2 {
        margin: 0 0 8px;
        font-size: 1.05rem;
      }
      .card a {
        color: var(--accent);
        text-decoration: none;
        font-weight: 600;
      }
    </style>
  </head>
  <body>
    <main>
      <h1>${REPO_TITLE} Documentation</h1>
      <div class="grid">
        ${PROJECT_DOCS_CARD}
        <section class="card">
          <h2>API Index</h2>
          <p>Workspace crate APIs generated by <code>cargo doc --workspace --no-deps</code>.</p>
          <a href="./api/index.html">Open API index</a>
        </section>
      </div>
    </main>
  </body>
</html>
EOF

echo "Done: $OUT_DIR"
