import { test, expect } from "./fixtures.js";

/**
 * Navigation smoke tests — verifies that each page loads without errors.
 * These tests mock all API calls so they can run without a live backend.
 */

test.beforeEach(async ({ page }) => {
  // Intercept all API calls and return empty defaults so pages render.
  // Reports endpoints need shaped responses (not bare []) to avoid render crashes.
  await page.route("/api/**", (route) => {
    const url = route.request().url();
    if (url.includes("/api/dev/config")) {
      return route.fulfill({ json: { authDisabled: true } });
    }
    if (url.includes("/api/dev/users")) {
      return route.fulfill({ json: { staff: [], clients: [] } });
    }
    if (url.includes("/api/branding")) {
      return route.fulfill({ json: { businessName: "GroomBook", logoUrl: null, theme: "default" } });
    }
    if (url.includes("/api/reports/summary")) {
      return route.fulfill({
        json: {
          from: "",
          to: "",
          revenue: { totalCents: 0, paidInvoices: 0 },
          appointments: { total: 0, completed: 0, cancelled: 0, noShow: 0 },
          clients: { total: 0, new: 0 },
        },
      });
    }
    if (url.includes("/api/reports/revenue")) {
      return route.fulfill({ json: { byPeriod: [], byGroomer: [] } });
    }
    if (url.includes("/api/reports/appointments")) {
      return route.fulfill({ json: { byPeriod: [] } });
    }
    if (url.includes("/api/reports/services")) {
      return route.fulfill({ json: { rows: [] } });
    }
    if (url.includes("/api/reports/clients")) {
      return route.fulfill({
        json: { newClients: [], activeInPeriodCount: 0, churnRisk: [], churnRiskTotal: 0 },
      });
    }
    if (url.includes("/api/invoices/stats/summary")) {
      return route.fulfill({
        json: {
          revenueThisMonth: 0,
          outstanding: 0,
          refundsThisMonth: 0,
          methodBreakdown: [],
        },
      });
    }
    if (url.includes("/api/invoices")) {
      return route.fulfill({ json: { data: [], total: 0 } });
    }
    // Appointments, clients, services, staff, book, etc.
    return route.fulfill({ json: [] });
  });
});

test("customer portal loads at root", async ({ page }) => {
  await page.goto("/");
  await expect(page.getByRole("navigation").getByText("GroomBook")).toBeVisible();
  await expect(page.locator("nav")).toBeVisible();
});

test("admin appointments page loads", async ({ page }) => {
  await page.goto("/admin");
  await expect(page.getByText("GroomBook")).toBeVisible();
  // Calendar/appointments view renders
  await expect(page.locator("nav")).toBeVisible();
});

test("admin clients page loads", async ({ page }) => {
  await page.goto("/admin/clients");
  await expect(page.getByText("GroomBook")).toBeVisible();
  await expect(page.getByRole("link", { name: "Clients" })).toBeVisible();
});

test("admin services page loads", async ({ page }) => {
  await page.goto("/admin/services");
  await expect(page.getByText("GroomBook")).toBeVisible();
  await expect(page.getByRole("link", { name: "Services" })).toBeVisible();
});

test("admin staff page loads", async ({ page }) => {
  await page.goto("/admin/staff");
  await expect(page.getByText("GroomBook")).toBeVisible();
  await expect(page.getByRole("link", { name: "Staff" })).toBeVisible();
});

test("admin invoices page loads", async ({ page }) => {
  await page.goto("/admin/invoices");
  await page.waitForLoadState("domcontentloaded");
  await expect(page.getByText("GroomBook")).toBeVisible();
  await expect(page.getByRole("link", { name: "Invoices" })).toBeVisible();
});

test("admin reports page loads", async ({ page }) => {
  await page.goto("/admin/reports");
  await expect(page.getByText("GroomBook")).toBeVisible();
  await expect(page.getByRole("link", { name: "Reports" })).toBeVisible();
});

test("admin booking portal loads", async ({ page }) => {
  await page.goto("/admin/book");
  await expect(page.getByText("Book an Appointment")).toBeVisible();
  await expect(page.getByText("Choose a service")).toBeVisible();
});
