import { vi } from 'vitest';

/**
 * Mock successful API response
 */
export const mockApiSuccess = (data: any) => {
  return Promise.resolve({
    ok: true,
    status: 200,
    json: async () => ({ success: true, data }),
  } as Response);
};

/**
 * Mock failed API response
 */
export const mockApiError = (message: string, status = 400) => {
  return Promise.resolve({
    ok: false,
    status,
    json: async () => ({ success: false, message }),
  } as Response);
};

/**
 * Mock fetch implementation
 */
export const setupFetchMock = () => {
  global.fetch = vi.fn();
  return global.fetch as ReturnType<typeof vi.fn>;
};

/**
 * Reset all mocks
 */
export const resetAllMocks = () => {
  vi.clearAllMocks();
  vi.resetAllMocks();
};

/**
 * Mock cookies
 */
export const mockCookies = {
  token: 'mock-token-123',
  user: JSON.stringify({
    id: '1',
    name: 'Test User',
    email: 'test@example.com',
  }),
};

/**
 * Mock user session
 */
export const mockUserSession = {
  user: {
    id: '1',
    name: 'Test User',
    email: 'test@example.com',
    image: 'https://example.com/avatar.jpg',
  },
  expires: '2026-12-31',
};

/**
 * Mock product data
 */
export const mockProduct = {
  id: '1',
  name: 'Test Product',
  slug: 'test-product',
  price: 1999,
  image: '/products/test-product.jpg',
  description: 'A test product',
  category: 'Test Category',
  inStock: true,
};

/**
 * Mock cart item
 */
export const mockCartItem = {
  id: '1',
  productId: '1',
  name: 'Test Product',
  price: 1999,
  quantity: 1,
  image: '/products/test-product.jpg',
};

/**
 * Mock API responses
 */
export const mockApiResponses = {
  products: {
    success: true,
    data: [mockProduct],
  },
  cart: {
    success: true,
    data: {
      items: [mockCartItem],
      totalCount: 1,
      totalAmount: 1999,
    },
  },
  user: {
    success: true,
    data: mockUserSession.user,
  },
};

/**
 * Wait for async operations
 */
export const waitForAsync = () => new Promise((resolve) => setTimeout(resolve, 0));
