/**
 * Z-Anordnen von 2D-Zeichnungselementen (`reorderDrawings` in
 * `src/state/projectSlice.ts`). Die Array-Reihenfolge in `drawings2d` IST die
 * Zeichenreihenfolge im Grundriss (spätere Position = weiter oben, siehe
 * `generatePlan.ts`) — „front"/„back"/„forward"/„backward" sortieren das
 * Array um.
 */

import { describe, it, expect, beforeEach } from "vitest";
import { getState, setState } from "./appStore";
import { sampleProject } from "../model/sampleProject";
import type { Drawing2D } from "../model/types";

function rect(id: string): Drawing2D {
  return {
    id,
    type: "drawing2d",
    levelId: "eg",
    categoryCode: "A",
    geom: { shape: "rect", min: { x: 0, y: 0 }, max: { x: 1, y: 1 } },
  };
}

beforeEach(() => {
  setState({
    project: {
      ...sampleProject,
      drawings2d: [rect("A"), rect("B"), rect("C"), rect("D")],
    },
    undoStack: [],
    redoStack: [],
    canUndo: false,
    canRedo: false,
  });
});

function ids(): string[] {
  return getState().project.drawings2d.map((d) => d.id);
}

describe("reorderDrawings", () => {
  it("front: schiebt die Auswahl ans Ende, Reihenfolge untereinander bleibt", () => {
    getState().reorderDrawings(["B", "A"], "front");
    // Auswahl-Reihenfolge im Array bleibt A vor B (Array-Reihenfolge zählt,
    // nicht die Aufruf-Reihenfolge der ids).
    expect(ids()).toEqual(["C", "D", "A", "B"]);
  });

  it("back: schiebt die Auswahl an den Anfang", () => {
    getState().reorderDrawings(["C"], "back");
    expect(ids()).toEqual(["C", "A", "B", "D"]);
  });

  it("forward: contiguous block überholt genau einen Nachbarn", () => {
    getState().reorderDrawings(["B", "C"], "forward");
    expect(ids()).toEqual(["A", "D", "B", "C"]);
  });

  it("backward: contiguous block überholt genau einen Nachbarn rückwärts", () => {
    getState().reorderDrawings(["B", "C"], "backward");
    expect(ids()).toEqual(["B", "C", "A", "D"]);
  });

  it("forward: letztes Element bleibt am Ende (kein Überlauf)", () => {
    getState().reorderDrawings(["D"], "forward");
    expect(ids()).toEqual(["A", "B", "C", "D"]);
  });

  it("backward: erstes Element bleibt am Anfang (kein Überlauf)", () => {
    getState().reorderDrawings(["A"], "backward");
    expect(ids()).toEqual(["A", "B", "C", "D"]);
  });

  it("unbekannte IDs werden ignoriert", () => {
    getState().reorderDrawings(["nope"], "front");
    expect(ids()).toEqual(["A", "B", "C", "D"]);
  });

  it("ist ein normaler Undo-Schritt", () => {
    getState().reorderDrawings(["A"], "front");
    expect(ids()).toEqual(["B", "C", "D", "A"]);
    expect(getState().canUndo).toBe(true);
    getState().undo();
    expect(ids()).toEqual(["A", "B", "C", "D"]);
  });
});
