import { describe, expect, it, vi } from "vitest";

import type { CliDeps } from "../cli/deps.js";
import type { RuntimeEnv } from "../runtime.js";
import { statusCommand } from "./status.js";

vi.mock("../twilio/messages.js", () => ({
  formatMessageLine: (m: { sid: string }) => `LINE:${m.sid}`,
}));

const runtime: RuntimeEnv = {
  log: vi.fn(),
  error: vi.fn(),
  exit: vi.fn(() => {
    throw new Error("exit");
  }),
};

const deps: CliDeps = {
  listRecentMessages: vi.fn(),
} as unknown as CliDeps;

describe("statusCommand", () => {
  it("validates limit and lookback", async () => {
    await expect(
      statusCommand({ limit: "0", lookback: "10" }, deps, runtime),
    ).rejects.toThrow("limit must be between 1 and 200");
    await expect(
      statusCommand({ limit: "10", lookback: "0" }, deps, runtime),
    ).rejects.toThrow("lookback must be > 0 minutes");
  });

  it("prints JSON when requested", async () => {
    (deps.listRecentMessages as jest.Mock).mockResolvedValue([{ sid: "1" }]);
    await statusCommand(
      { limit: "5", lookback: "10", json: true },
      deps,
      runtime,
    );
    expect(runtime.log).toHaveBeenCalledWith(
      JSON.stringify([{ sid: "1" }], null, 2),
    );
  });

  it("prints formatted lines otherwise", async () => {
    (deps.listRecentMessages as jest.Mock).mockResolvedValue([{ sid: "123" }]);
    await statusCommand({ limit: "1", lookback: "5" }, deps, runtime);
    expect(runtime.log).toHaveBeenCalledWith("LINE:123");
  });
});
