import { apiGet, apiPost, apiPut, apiDelete, apiGetPaginated, apiSearch } from './client';
import type { Tag, TagFilters, TagFormData } from '@/types';

// Obtener todas las etiquetas con paginación
export const getTags = async (page: number = 1, limit: number = 10, filters?: TagFilters) => {
  return apiGetPaginated<Tag>('/api/tags', page, limit, filters);
};

// Obtener todas las etiquetas (sin paginación para selectores)
export const getAllTags = async () => {
  return apiGet<Tag[]>('/api/tags/all');
};

// Obtener una etiqueta por ID
export const getTagById = async (id: number) => {
  return apiGet<Tag>(`/api/tags/${id}`);
};

// Crear una nueva etiqueta
export const createTag = async (data: TagFormData) => {
  return apiPost<Tag>('/api/tags', data);
};

// Actualizar una etiqueta existente
export const updateTag = async (id: number, data: TagFormData) => {
  return apiPut<Tag>(`/api/tags/${id}`, data);
};

// Eliminar una etiqueta
export const deleteTag = async (id: number) => {
  return apiDelete(`/api/tags/${id}`);
};

// Buscar etiquetas
export const searchTags = async (query: string, filters?: TagFilters) => {
  return apiSearch<Tag>('/api/tags', query, filters);
};

// Obtener etiquetas más usadas
export const getPopularTags = async (limit: number = 10) => {
  return apiGet<Tag[]>(`/api/tags/popular?limit=${limit}`);
};

// Obtener etiquetas por juego
export const getTagsByGame = async (gameId: number) => {
  return apiGet<Tag[]>(`/api/tags/game/${gameId}`);
};

// Asignar etiquetas a un juego
export const assignTagsToGame = async (gameId: number, tagIds: number[]) => {
  return apiPost(`/api/games/${gameId}/tags`, { tagIds });
};

// Eliminar etiquetas de un juego
export const removeTagsFromGame = async (gameId: number, tagIds: number[]) => {
  return apiPost(`/api/games/${gameId}/tags/remove`, { tagIds });
};

// Obtener estadísticas de etiquetas
export const getTagStats = async () => {
  return apiGet<{
    totalTags: number;
    totalTaggedGames: number;
    averageTagsPerGame: number;
    mostUsedTag: string;
    leastUsedTag: string;
  }>('/api/tags/stats');
};
