/**
 * Unit tests for current-duty: getRemainingTime, findCurrentDuty.
 * Ported from webapp/js/currentDuty.test.js.
 */

import { describe, it, expect, vi } from "vitest";
import { getRemainingTime, findCurrentDuty } from "./current-duty";
import type { DutyWithUser } from "@/types";

describe("getRemainingTime", () => {
  it("returns hours and minutes until end from now", () => {
    const endAt = "2025-03-02T17:30:00.000Z";
    vi.useFakeTimers();
    vi.setSystemTime(new Date("2025-03-02T12:00:00.000Z"));
    const { hours, minutes } = getRemainingTime(endAt);
    vi.useRealTimers();
    expect(hours).toBe(5);
    expect(minutes).toBe(30);
  });

  it("returns 0 when end is in the past", () => {
    const endAt = "2025-03-02T09:00:00.000Z";
    vi.useFakeTimers();
    vi.setSystemTime(new Date("2025-03-02T12:00:00.000Z"));
    const { hours, minutes } = getRemainingTime(endAt);
    vi.useRealTimers();
    expect(hours).toBe(0);
    expect(minutes).toBe(0);
  });

  it("returns 0 hours and 0 minutes when endAt is invalid", () => {
    const { hours, minutes } = getRemainingTime("not-a-date");
    expect(hours).toBe(0);
    expect(minutes).toBe(0);
  });
});

describe("findCurrentDuty", () => {
  it("returns duty when now is between start_at and end_at", () => {
    const now = new Date();
    const start = new Date(now);
    start.setHours(start.getHours() - 1, 0, 0, 0);
    const end = new Date(now);
    end.setHours(end.getHours() + 1, 0, 0, 0);
    const duties: DutyWithUser[] = [
      {
        id: 1,
        user_id: 1,
        event_type: "duty",
        full_name: "Иванов",
        start_at: start.toISOString(),
        end_at: end.toISOString(),
        phone: null,
        username: null,
      },
    ];
    const duty = findCurrentDuty(duties);
    expect(duty).not.toBeNull();
    expect(duty?.full_name).toBe("Иванов");
  });

  it("returns null when no duty overlaps current time", () => {
    const duties: DutyWithUser[] = [
      {
        id: 1,
        user_id: 1,
        event_type: "duty",
        full_name: "Past",
        start_at: "2020-01-01T09:00:00Z",
        end_at: "2020-01-01T17:00:00Z",
        phone: null,
        username: null,
      },
      {
        id: 2,
        user_id: 2,
        event_type: "duty",
        full_name: "Future",
        start_at: "2030-01-01T09:00:00Z",
        end_at: "2030-01-01T17:00:00Z",
        phone: null,
        username: null,
      },
    ];
    expect(findCurrentDuty(duties)).toBeNull();
  });
});
