import type { FeedItem } from "@/api/repairsFeed";
import {
  toLocalDateKey,
  formatDayLabel,
  groupByLocalDay,
  fmtMoney,
  pluralRepairs,
  pluralWorks,
} from "@/lib/repairsFeed";

function item(id: number, created_at: string, works_total = 0): FeedItem {
  return {
    id,
    created_at,
    car_plate: "А001АА125",
    car_make: null,
    car_model: null,
    driver_name: null,
    mechanic_name: "M",
    works_preview: [],
    works_extra: 0,
    works_total,
    photo_url: null,
    is_external: false,
  } as FeedItem;
}

describe("toLocalDateKey (Asia/Vladivostok)", () => {
  it("маппит UTC-инстант на VLA-сутки (+10)", () => {
    // 2026-05-25 20:00Z == 2026-05-26 06:00 VLA → день 26-го
    expect(toLocalDateKey("2026-05-25T20:00:00Z")).toBe("2026-05-26");
    // 2026-05-25 13:00Z == 2026-05-25 23:00 VLA → ещё 25-е
    expect(toLocalDateKey("2026-05-25T13:00:00Z")).toBe("2026-05-25");
    // 2026-05-25 14:00Z == 2026-05-26 00:00 VLA → уже 26-е (граница суток)
    expect(toLocalDateKey("2026-05-25T14:00:00Z")).toBe("2026-05-26");
  });
});

describe("formatDayLabel", () => {
  const now = new Date("2026-05-26T05:00:00Z"); // 15:00 VLA, день 26-го
  it("Сегодня / Вчера относительно VLA-now", () => {
    expect(formatDayLabel("2026-05-26", now)).toBe("Сегодня");
    expect(formatDayLabel("2026-05-25", now)).toBe("Вчера");
  });
  it("прочие даты — «D месяц»", () => {
    expect(formatDayLabel("2026-05-20", now)).toBe("20 мая");
  });
});

describe("groupByLocalDay", () => {
  it("группирует по VLA-дню, суммирует works_total, сохраняет порядок", () => {
    const items = [
      item(3, "2026-05-26T01:00:00Z", 100), // 26-е VLA
      item(2, "2026-05-25T20:00:00Z", 50), // тоже 26-е VLA (06:00)
      item(1, "2026-05-25T01:00:00Z", 200), // 25-е VLA
    ];
    const groups = groupByLocalDay(items);
    expect(groups.map((g) => g.key)).toEqual(["2026-05-26", "2026-05-25"]);
    expect(groups[0].total).toBe(150);
    expect(groups[0].items).toHaveLength(2);
    expect(groups[1].total).toBe(200);
  });

  it("пустой вход → пустой массив", () => {
    expect(groupByLocalDay([])).toEqual([]);
  });
});

describe("fmtMoney", () => {
  it("округляет и форматирует тысячи (NBSP-разделитель)", () => {
    expect(fmtMoney(91000).replace(/ /g, " ")).toBe("91 000");
    expect(fmtMoney(1499.6).replace(/ /g, " ")).toBe("1 500");
  });
});

describe("склонения", () => {
  it.each([
    [1, "ремонт"],
    [2, "ремонта"],
    [4, "ремонта"],
    [5, "ремонтов"],
    [11, "ремонтов"],
    [21, "ремонт"],
    [22, "ремонта"],
  ])("pluralRepairs(%i) = %s", (n, exp) => {
    expect(pluralRepairs(n)).toBe(exp);
  });

  it.each([
    [1, "работа"],
    [3, "работы"],
    [5, "работ"],
    [12, "работ"],
  ])("pluralWorks(%i) = %s", (n, exp) => {
    expect(pluralWorks(n)).toBe(exp);
  });
});
