import { describe, expect, it } from "vitest";
import { reconcileOptimisticEntries } from "./timelineOptimisticAllocations.js";

describe("timelineOptimisticAllocations", () => {
  it("keeps state unchanged when no optimistic allocations exist", () => {
    expect(
      reconcileOptimisticEntries(
        new Map(),
        [{ id: "alloc-1", startDate: "2025-01-01T00:00:00.000Z", endDate: "2025-01-02T00:00:00.000Z" }],
        "alloc-1",
      ),
    ).toEqual({
      optimisticAllocations: new Map(),
      pendingOptimisticAllocationId: "alloc-1",
      changed: false,
    });
  });

  it("keeps unmatched optimistic entries and pending ids", () => {
    const optimisticAllocations = new Map([
      [
        "alloc-1",
        {
          startDate: new Date("2025-01-03T00:00:00.000Z"),
          endDate: new Date("2025-01-04T00:00:00.000Z"),
        },
      ],
    ]);

    expect(
      reconcileOptimisticEntries(
        optimisticAllocations,
        [{ id: "alloc-1", startDate: "2025-01-05T00:00:00.000Z", endDate: "2025-01-06T00:00:00.000Z" }],
        "alloc-1",
      ),
    ).toEqual({
      optimisticAllocations,
      pendingOptimisticAllocationId: "alloc-1",
      changed: false,
    });
  });

  it("drops optimistic entries once server data matches the optimistic override", () => {
    const optimisticAllocations = new Map([
      [
        "alloc-1",
        {
          startDate: new Date("2025-01-03T00:00:00.000Z"),
          endDate: new Date("2025-01-04T00:00:00.000Z"),
        },
      ],
      [
        "alloc-2",
        {
          startDate: new Date("2025-01-07T00:00:00.000Z"),
          endDate: new Date("2025-01-08T00:00:00.000Z"),
        },
      ],
    ]);

    expect(
      reconcileOptimisticEntries(
        optimisticAllocations,
        [
          { id: "alloc-1", startDate: "2025-01-03T00:00:00.000Z", endDate: "2025-01-04T00:00:00.000Z" },
          { id: "alloc-2", startDate: "2025-01-10T00:00:00.000Z", endDate: "2025-01-11T00:00:00.000Z" },
        ],
        "alloc-1",
      ),
    ).toEqual({
      optimisticAllocations: new Map([
        [
          "alloc-2",
          {
            startDate: new Date("2025-01-07T00:00:00.000Z"),
            endDate: new Date("2025-01-08T00:00:00.000Z"),
          },
        ],
      ]),
      pendingOptimisticAllocationId: null,
      changed: true,
    });
  });
});
