import type { AwpWebDataSource } from "./data-source.js";
import { deterministicC1DataSource, fixtureDataSource } from "./data-source.js";
import { escapeHtml } from "./html.js";
import { renderFactoryRun } from "./render-factory.js";
import { renderProjectOverview } from "./render-project.js";
import { renderQueuePage } from "./render-queue.js";
import { renderReviewPage } from "./render-review.js";
import { resolveRoute } from "./router.js";

export interface RenderRequestOptions {
  readonly dataSource?: AwpWebDataSource;
  readonly fixtureMode?: boolean;
}

const document = (body: string, title: string, shell: "project" | "lifecycle"): string =>
  `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="color-scheme" content="dark"><title>${escapeHtml(title)}</title><link rel="stylesheet" href="/${shell === "project" ? "u1.css" : "lifecycle.css"}"><link rel="stylesheet" href="/common.css"></head><body>${body}<div class="toast-region" aria-live="polite" aria-atomic="true"></div><script type="module" src="/client.js"></script></body></html>`;

export function renderRequest(input: URL | string, options: RenderRequestOptions = {}): string {
  const url = typeof input === "string" ? new URL(input, "http://awp.local") : input;
  const source = options.fixtureMode
    ? fixtureDataSource(url.searchParams.get("fixture") ?? undefined)
    : (options.dataSource ?? deterministicC1DataSource);
  const route = resolveRoute(url);

  if (route.kind === "project" && route.id) {
    const snapshot = source.project(route.id);
    return document(
      renderProjectOverview(
        snapshot.model,
        snapshot.tasks,
        snapshot.surfaceState,
        route.tab ?? "overview",
      ),
      `${snapshot.model.project.name} — AWP`,
      "project",
    );
  }
  if (route.kind === "queue" && route.id) {
    const snapshot = source.project(route.id);
    return document(
      renderQueuePage(
        snapshot.model,
        snapshot.tasks,
        route.tab ?? "queue",
        snapshot.surfaceState,
        route.task,
      ),
      "Queue — AWP",
      "lifecycle",
    );
  }
  if (route.kind === "factory-run" && route.id) {
    const snapshot = source.factoryRun(route.id);
    return document(
      renderFactoryRun(snapshot.model, snapshot.surfaceState, route.tab ?? "overview"),
      `${route.id} — AWP`,
      "lifecycle",
    );
  }
  if (route.kind === "review" && route.id) {
    const snapshot = source.review(route.id);
    return document(
      renderReviewPage(
        snapshot.model,
        snapshot.surfaceState,
        route.tab ?? "review",
        route.file,
        route.finding,
      ),
      `${route.id} Review — AWP`,
      "lifecycle",
    );
  }

  return document(
    `<main class="not-found" id="main-content"><h1>Page not found</h1><p>The requested AWP route does not exist.</p><a class="btn primary" href="/projects/project-i1">Open Project</a></main>`,
    "Not found — AWP",
    "lifecycle",
  );
}
