/**
 * Unit tests for /api/files/stage-paths.
 */

import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest';
import type { IncomingMessage, ServerResponse } from 'http';
import { mkdirSync, rmSync } from 'node:fs';
import { join } from 'node:path';
import { tmpdir } from 'node:os';

const sendJsonMock = vi.fn();
const parseJsonBodyMock = vi.fn();

const testRootDir = join(tmpdir(), 'clawx-tests', 'files-routes');

vi.mock('@electron/api/route-utils', () => ({
  parseJsonBody: (...args: unknown[]) => parseJsonBodyMock(...args),
  sendJson: (...args: unknown[]) => sendJsonMock(...args),
}));

function resetFixtures(): void {
  rmSync(testRootDir, { recursive: true, force: true });
  mkdirSync(testRootDir, { recursive: true });
}

function makeReq(method = 'POST'): IncomingMessage {
  return { method } as IncomingMessage;
}

function makeRes(): ServerResponse {
  return {
    setHeader: vi.fn(),
    end: vi.fn(),
  } as unknown as ServerResponse;
}

const STAGE_PATHS_URL = new URL('http://127.0.0.1:13210/api/files/stage-paths');
const ctx = {} as never;

describe('handleFileRoutes — POST /api/files/stage-paths', () => {
  beforeEach(() => {
    vi.resetAllMocks();
    resetFixtures();
  });

  afterAll(() => {
    rmSync(testRootDir, { recursive: true, force: true });
  });

  it('returns directory metadata without copying the folder', async () => {
    const folderPath = join(testRootDir, 'project-folder');
    mkdirSync(folderPath);

    parseJsonBodyMock.mockResolvedValueOnce({ filePaths: [folderPath] });

    const { handleFileRoutes } = await import('@electron/api/routes/files');
    const handled = await handleFileRoutes(makeReq(), makeRes(), STAGE_PATHS_URL, ctx);

    expect(handled).toBe(true);
    expect(sendJsonMock).toHaveBeenCalledTimes(1);
    const [, status, payload] = sendJsonMock.mock.calls[0] as [ServerResponse, number, Array<Record<string, unknown>>];
    expect(status).toBe(200);
    expect(payload).toHaveLength(1);
    expect(payload[0]).toMatchObject({
      fileName: 'project-folder',
      mimeType: 'application/x-directory',
      fileSize: 0,
      stagedPath: folderPath,
      preview: null,
    });
  });
});