import { describe, expect, it } from "vitest";
import {
  clampAgentPanelWidth,
  getAgentPanelDefaultWidth,
  getAgentPanelMaxWidth,
  getWorkbenchBasemapTone,
  getWorkbenchCameraPadding,
  getWorkbenchViewportLayout
} from "./workbench-layout";

describe("workbench basemap surface tone", () => {
  it.each([
    ["mapbox-light", "light"],
    ["mapbox-satellite", "satellite"],
    ["none", "none"],
    ["unknown", "none"]
  ])("maps %s to %s", (baseLayerId, expectedTone) => {
    expect(getWorkbenchBasemapTone(baseLayerId)).toBe(expectedTone);
  });
});

describe("workbench floating panels", () => {
  it("uses bounded desktop and wide panel widths", () => {
    expect(getWorkbenchViewportLayout(1440)).toMatchObject({
      agentWidth: 500,
      conditionWidth: 432,
      conditionExpandedWidth: 880,
      toolbarWidth: 48
    });
    expect(getWorkbenchViewportLayout(1536)).toMatchObject({
      agentWidth: 540,
      conditionExpandedWidth: 960
    });
  });

  it("tracks the expanded condition panel in camera padding", () => {
    expect(
      getWorkbenchCameraPadding(1440, {
        agentOpen: true,
        conditionOpen: true,
        conditionExpanded: false
      })
    ).toEqual({ top: 72, right: 504, bottom: 32, left: 524 });

    expect(
      getWorkbenchCameraPadding(1440, {
        agentOpen: true,
        conditionOpen: true,
        conditionExpanded: true
      })
    ).toEqual({ top: 72, right: 952, bottom: 32, left: 476 });
  });

  it("uses the committed Agent width without exceeding the hard limit", () => {
    expect(
      getWorkbenchCameraPadding(1920, {
        agentOpen: true,
        agentWidth: 620,
        conditionOpen: true
      })
    ).toEqual({ top: 72, right: 504, bottom: 32, left: 644 });

    expect(
      getWorkbenchCameraPadding(1920, {
        agentOpen: true,
        agentWidth: 900,
        conditionOpen: false
      }).left
    ).toBe(744);
  });

  it("uses responsive defaults and preserves the map corridor at maximum width", () => {
    expect(getAgentPanelDefaultWidth(390)).toBe(500);
    expect(getAgentPanelDefaultWidth(1024)).toBe(484);
    expect(getAgentPanelDefaultWidth(1440)).toBe(500);
    expect(getAgentPanelDefaultWidth(1536)).toBe(540);
    expect(getAgentPanelMaxWidth(1024)).toBe(484);
    expect(clampAgentPanelWidth(620, 1024)).toBe(484);
    expect(getAgentPanelMaxWidth(1280)).toBe(516);
    expect(getAgentPanelMaxWidth(1440)).toBe(676);
    expect(getAgentPanelMaxWidth(1536)).toBe(720);
    expect(getAgentPanelMaxWidth(1920)).toBe(720);
    expect(getAgentPanelMaxWidth(1920, true)).toBe(628);
  });
});
