import { apiClient } from './client';
import { ApiResponse, Document, DocumentFilters, DocumentOperationResult } from '@/types';

/**
 * Funciones de API para documentos
 * 
 * Todas las llamadas al backend para documentos pasan por aquí.
 */

/**
 * Obtener lista de documentos con filtros
 */
export async function getDocuments(filters?: DocumentFilters): Promise<Document[]> {
  const params: Record<string, string> = {};
  
  if (filters?.query) params.q = filters.query;
  if (filters?.ownerId) params.ownerId = filters.ownerId;
  if (filters?.categoryId) params.categoryId = filters.categoryId;
  
  const response = await apiClient.get<{ documents: Document[] }>('/api/documents', params);
  return response.data?.documents || [];
}

/**
 * Obtener un documento por ID
 */
export async function getDocumentById(id: string): Promise<Document | null> {
  const response = await apiClient.get<Document>(`/api/documents/${id}`);
  return response.data || null;
}

/**
 * Crear un nuevo documento
 */
export async function createDocument(
  fileName: string,
  fileData: string,
  mimeType: string,
  extractedData: Record<string, unknown>,
  ownerId: string,
  categoryId?: string
): Promise<{ documentId: string }> {
  const response = await apiClient.post<{
    success: boolean;
    documentId: string;
    fileName: string;
  }>('/api/documents', {
    fileName,
    fileData,
    mimeType,
    extractedData,
    ownerId,
    categoryId,
  });
  
  if (!response.data) {
    throw new Error('Failed to create document');
  }
  
  return { documentId: response.data.documentId };
}

/**
 * Actualizar datos extraídos de un documento
 */
export async function updateDocument(
  id: string,
  extractedData: Record<string, unknown>
): Promise<void> {
  await apiClient.put(`/api/documents/${id}`, { extractedData });
}

/**
 * Eliminar un documento
 */
export async function deleteDocument(id: string): Promise<void> {
  const response = await apiClient.delete<DocumentOperationResult>(`/api/documents/${id}`);
  
  if (!response.data?.success) {
    throw new Error(response.data?.error || 'Failed to delete document');
  }
}

/**
 * Eliminar todos los documentos (solo desarrollo)
 */
export async function deleteAllDocuments(): Promise<number> {
  const response = await apiClient.delete<DocumentOperationResult>('/api/documents/all');
  
  if (!response.data?.success) {
    throw new Error(response.data?.error || 'Failed to delete all documents');
  }
  
  return response.data.count || 0;
}
