import client from './client'
import type {
  ShopItem,
  ShopItemType,
  InventoryItem,
  PurchaseResponse,
  UseConsumableRequest,
  UseConsumableResponse,
  CoinsBalance,
  CoinTransaction,
  ConsumablesStatus,
  UserCosmetics,
  SwapCandidate,
} from '@/types'

export const shopApi = {
  // === Каталог товаров ===

  // Получить список товаров
  getItems: async (itemType?: ShopItemType): Promise<ShopItem[]> => {
    const params = itemType ? { item_type: itemType } : {}
    const response = await client.get<ShopItem[]>('/shop/items', { params })
    return response.data
  },

  // Получить товар по ID
  getItem: async (itemId: number): Promise<ShopItem> => {
    const response = await client.get<ShopItem>(`/shop/items/${itemId}`)
    return response.data
  },

  // === Покупки ===

  // Купить товар
  purchase: async (itemId: number, quantity: number = 1): Promise<PurchaseResponse> => {
    const response = await client.post<PurchaseResponse>('/shop/purchase', {
      item_id: itemId,
      quantity,
    })
    return response.data
  },

  // === Инвентарь ===

  // Получить инвентарь пользователя
  getInventory: async (itemType?: ShopItemType): Promise<InventoryItem[]> => {
    const params = itemType ? { item_type: itemType } : {}
    const response = await client.get<InventoryItem[]>('/shop/inventory', { params })
    return response.data
  },

  // === Экипировка ===

  // Экипировать предмет
  equip: async (inventoryId: number): Promise<{ success: boolean; message: string }> => {
    const response = await client.post<{ success: boolean; message: string }>('/shop/equip', {
      inventory_id: inventoryId,
    })
    return response.data
  },

  // Снять предмет
  unequip: async (itemType: ShopItemType): Promise<{ success: boolean; message: string }> => {
    const response = await client.post<{ success: boolean; message: string }>(`/shop/unequip/${itemType}`)
    return response.data
  },

  // Получить экипированную косметику
  getCosmetics: async (): Promise<UserCosmetics> => {
    const response = await client.get<UserCosmetics>('/shop/cosmetics')
    return response.data
  },

  // === Расходуемые ===

  // Использовать расходуемый предмет
  useConsumable: async (data: UseConsumableRequest): Promise<UseConsumableResponse> => {
    const response = await client.post<UseConsumableResponse>('/shop/use', data)
    return response.data
  },

  // Получить статус расходуемых в марафоне
  getConsumablesStatus: async (marathonId: number): Promise<ConsumablesStatus> => {
    const response = await client.get<ConsumablesStatus>(`/shop/consumables/${marathonId}`)
    return response.data
  },

  // Получить кандидатов для Copycat (участники с активными заданиями)
  getCopycatCandidates: async (marathonId: number): Promise<SwapCandidate[]> => {
    const response = await client.get<SwapCandidate[]>(`/shop/copycat-candidates/${marathonId}`)
    return response.data
  },

  // === Монеты ===

  // Получить баланс и последние транзакции
  getBalance: async (): Promise<CoinsBalance> => {
    const response = await client.get<CoinsBalance>('/shop/balance')
    return response.data
  },

  // Получить историю транзакций
  getTransactions: async (limit: number = 50, offset: number = 0): Promise<CoinTransaction[]> => {
    const response = await client.get<CoinTransaction[]>('/shop/transactions', {
      params: { limit, offset },
    })
    return response.data
  },

  // === Админские функции ===

  // Получить инвентарь пользователя (админ)
  adminGetUserInventory: async (userId: number, itemType?: ShopItemType): Promise<InventoryItem[]> => {
    const params = itemType ? { item_type: itemType } : {}
    const response = await client.get<InventoryItem[]>(`/shop/admin/users/${userId}/inventory`, { params })
    return response.data
  },

  // Выдать предмет пользователю (админ)
  adminGrantItem: async (userId: number, itemId: number, quantity: number, reason: string): Promise<{ message: string }> => {
    const response = await client.post<{ message: string }>(`/shop/admin/users/${userId}/items/grant`, {
      item_id: itemId,
      quantity,
      reason,
    })
    return response.data
  },

  // Удалить предмет из инвентаря пользователя (админ)
  adminRemoveItem: async (userId: number, inventoryId: number, quantity: number = 1): Promise<{ message: string }> => {
    const response = await client.delete<{ message: string }>(`/shop/admin/users/${userId}/inventory/${inventoryId}`, {
      params: { quantity },
    })
    return response.data
  },
}
