/**
 * Suggestions API 路径测试
 *
 * 验证前端 API 路径与后端路由一致
 * 后端路由: /api/v1/brands/${brandId}/suggestions/*
 */

import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { suggestionsApi } from "@/lib/api/suggestions";
import { API_BASE } from "@/lib/api/client";

const mockFetch = vi.fn();
const originalFetch = global.fetch;

beforeEach(() => {
  global.fetch = mockFetch;
  vi.clearAllMocks();
  mockFetch.mockResolvedValue({
    ok: true,
    status: 200,
    json: () => Promise.resolve([]),
  });
});

afterEach(() => {
  global.fetch = originalFetch;
});

function getCalledUrl() {
  return mockFetch.mock.calls[0][0] as string;
}

function getCalledMethod() {
  return mockFetch.mock.calls[0][1]?.method as string;
}

describe("suggestionsApi 路径测试", () => {
  describe("getSuggestions", () => {
    it("应使用正确的路径 /api/v1/brands/${brandId}/suggestions", async () => {
      await suggestionsApi.getSuggestions("token-123", "brand-abc");

      const url = getCalledUrl();
      expect(url).toBe(`${API_BASE}/api/v1/brands/brand-abc/suggestions`);
    });

    it("应正确传递查询参数", async () => {
      await suggestionsApi.getSuggestions("token-123", "brand-abc", {
        status: "pending",
        page: 1,
      });

      const url = getCalledUrl();
      expect(url).toContain(`${API_BASE}/api/v1/brands/brand-abc/suggestions`);
      expect(url).toContain("status=pending");
      expect(url).toContain("page=1");
    });

    it("空参数时不应包含查询字符串", async () => {
      await suggestionsApi.getSuggestions("token-123", "brand-abc", {});

      const url = getCalledUrl();
      expect(url).toBe(`${API_BASE}/api/v1/brands/brand-abc/suggestions`);
    });
  });

  describe("regenerateSuggestions", () => {
    it("应使用正确的路径 /api/v1/brands/${brandId}/suggestions/regenerate", async () => {
      await suggestionsApi.regenerateSuggestions("token-123", "brand-abc");

      const url = getCalledUrl();
      const method = getCalledMethod();

      expect(url).toBe(`${API_BASE}/api/v1/brands/brand-abc/suggestions/regenerate`);
      expect(method).toBe("POST");
    });
  });

  describe("updateSuggestionStatus", () => {
    it("应使用正确的路径 /api/v1/brands/${brandId}/suggestions/${suggestionId}/status", async () => {
      await suggestionsApi.updateSuggestionStatus(
        "token-123",
        "brand-abc",
        "suggestion-xyz",
        "completed"
      );

      const url = getCalledUrl();
      const method = getCalledMethod();

      expect(url).toBe(
        `${API_BASE}/api/v1/brands/brand-abc/suggestions/suggestion-xyz/status`
      );
      expect(method).toBe("PUT");
    });

    it("应正确传递状态数据", async () => {
      await suggestionsApi.updateSuggestionStatus(
        "token-123",
        "brand-abc",
        "suggestion-xyz",
        "completed"
      );

      const options = mockFetch.mock.calls[0][1];
      expect(JSON.parse(options.body)).toEqual({ status: "completed" });
    });
  });
});
