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

// Mock client.trackEvent so we can assert event names and payloads without
// firing network requests or relying on memoized shouldTrack() state.
const trackEvent = vi.fn();
vi.mock("./client", () => ({
  trackEvent: (...args: unknown[]) => trackEvent(...args),
}));

const {
  trackStudioSessionStart,
  trackStudioRenderStart,
  trackStudioRazorSplit,
  trackStudioExpandedClipEdit,
} = await import("./events");

describe("studio telemetry events", () => {
  beforeEach(() => {
    trackEvent.mockClear();
  });

  it("trackStudioSessionStart emits 'studio_session_start' with has_project", () => {
    trackStudioSessionStart({ has_project: true });
    expect(trackEvent).toHaveBeenCalledOnce();
    expect(trackEvent).toHaveBeenCalledWith("studio_session_start", { has_project: true });
  });

  it("trackStudioSessionStart preserves false for has_project (scratch open)", () => {
    trackStudioSessionStart({ has_project: false });
    expect(trackEvent).toHaveBeenCalledWith("studio_session_start", { has_project: false });
  });

  it("trackStudioRenderStart emits 'studio_render_start' with all render opts", () => {
    trackStudioRenderStart({
      fps: 30,
      quality: "standard",
      format: "mp4",
      resolution: "landscape",
      composition: "intro.html",
    });
    expect(trackEvent).toHaveBeenCalledOnce();
    expect(trackEvent).toHaveBeenCalledWith("studio_render_start", {
      fps: 30,
      quality: "standard",
      format: "mp4",
      resolution: "landscape",
      composition: "intro.html",
    });
  });

  it("trackStudioRenderStart leaves optional fields undefined when omitted", () => {
    trackStudioRenderStart({ fps: 60, quality: "high", format: "webm" });
    const payload = trackEvent.mock.calls[0][1];
    expect(payload).toEqual({
      fps: 60,
      quality: "high",
      format: "webm",
      resolution: undefined,
      composition: undefined,
    });
  });

  it("trackStudioRazorSplit emits 'studio_razor_split' with mode and count", () => {
    trackStudioRazorSplit({ mode: "all", count: 3 });
    expect(trackEvent).toHaveBeenCalledWith("studio_razor_split", { mode: "all", count: 3 });
  });

  it("trackStudioExpandedClipEdit emits 'studio_expanded_clip_edit' with action", () => {
    trackStudioExpandedClipEdit({ action: "resize" });
    expect(trackEvent).toHaveBeenCalledWith("studio_expanded_clip_edit", { action: "resize" });
  });
});
