import { http, HttpResponse, passthrough } from "msw";
import { setupWorker } from "msw/browser";
import { TERRAIN_TILE, LAYER_JSON } from "../fixtures/terrain/terrain";

// Default handlers that persist across worker.resetHandlers() calls.
// These serve minimal valid responses for Cesium Ion terrain loading
// so tests never hit real external APIs.
export const worker = setupWorker(
  http.get("/", () => passthrough()),
  http.get("__jasmine__/*", () => passthrough()),
  http.get("*chrome-extension*", () => passthrough()),
  http.get("/build/TerriaJS/*", () => passthrough()),

  http.get("/build/Cesium/*", () => passthrough()),
  http.get("/build/*.js", () => passthrough()),
  http.get("/build/*.svg", () => passthrough()),
  http.get("/test/*", () => passthrough()),

  http.get("/languages/*.json", () => passthrough()),
  http.get("/images/*", () => passthrough()),
  http.get("/data/*", () => passthrough()),
  // Ion asset endpoint → return a mock terrain server URL
  http.get("https://api.cesium.com/v1/assets/:assetId/endpoint", ({ params }) =>
    HttpResponse.json({
      type: "TERRAIN",
      url: `https://assets.cesium.com/${params.assetId}/`,
      accessToken: "mock-token"
    })
  ),

  // Catch-all for other api.cesium.com requests
  http.all("https://api.cesium.com/*", () => HttpResponse.error()),

  // Serve terrain data from *.cesium.com subdomains
  http.get("https://*.cesium.com/*", ({ request }) => {
    const url = new URL(request.url);
    if (url.pathname.endsWith("/layer.json")) {
      return HttpResponse.json(LAYER_JSON);
    }
    if (url.pathname.endsWith(".terrain")) {
      return new HttpResponse(TERRAIN_TILE.buffer, {
        headers: { "Content-Type": "application/vnd.quantized-mesh" }
      });
    }
    // Unknown pattern — block
    return HttpResponse.error();
  })
);
