import { crawlController } from "../v0/crawl";
import { config } from "../../config";
import { Request, Response } from "express";
import { authenticateUser } from "../auth"; // Ensure this import is correct
import { createIdempotencyKey } from "../../services/idempotency/create";
import { validateIdempotencyKey } from "../../services/idempotency/validate";
import { v7 as uuidv7 } from "uuid";

jest.mock("../auth", () => ({
  authenticateUser: jest.fn().mockResolvedValue({
    success: true,
    team_id: "team123",
    error: null,
    status: 200,
  }),
  reduce: jest.fn(),
}));
jest.mock("../../services/idempotency/validate");

describe("crawlController", () => {
  it("should prevent duplicate requests using the same idempotency key", async () => {
    const req = {
      headers: {
        "x-idempotency-key": await uuidv7(),
        Authorization: `Bearer ${config.TEST_API_KEY}`,
      },
      body: {
        url: "https://mendable.ai",
      },
    } as unknown as Request;
    const res = {
      status: jest.fn().mockReturnThis(),
      json: jest.fn(),
    } as unknown as Response;

    // Mock the idempotency key validation to return false for the second call
    (validateIdempotencyKey as jest.Mock)
      .mockResolvedValueOnce(true)
      .mockResolvedValueOnce(false);

    // First request should succeed
    await crawlController(req, res);
    expect(res.status).not.toHaveBeenCalledWith(409);

    // Second request with the same key should fail
    await crawlController(req, res);
    expect(res.status).toHaveBeenCalledWith(409);
    expect(res.json).toHaveBeenCalledWith({
      error: "Idempotency key already used",
    });
  });
});
