import { Grove, Tree, Graft, Fruit, CultivateResponse } from './types'; const API_BASE = '/api/v1'; async function handleResponse(response: Response): Promise { if (!response.ok) { const error = await response.json().catch(() => ({ detail: 'Unknown error' })); throw new Error(error.detail || `HTTP ${response.status}`); } return response.json(); } // Grove API export async function listGroves(): Promise { const response = await fetch(`${API_BASE}/groves`); return handleResponse(response); } export async function createGrove(data: { name: string; description?: string; is_public?: boolean }): Promise { const response = await fetch(`${API_BASE}/groves`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return handleResponse(response); } export async function getGrove(name: string): Promise { const response = await fetch(`${API_BASE}/groves/${name}`); return handleResponse(response); } // Tree API export async function listTrees(groveName: string): Promise { const response = await fetch(`${API_BASE}/grove/${groveName}/trees`); return handleResponse(response); } export async function createTree(groveName: string, data: { name: string; description?: string }): Promise { const response = await fetch(`${API_BASE}/grove/${groveName}/trees`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return handleResponse(response); } // Graft API export async function listGrafts(groveName: string, treeName: string): Promise { const response = await fetch(`${API_BASE}/grove/${groveName}/${treeName}/grafts`); return handleResponse(response); } export async function createGraft(groveName: string, treeName: string, data: { name: string; fruit_id: string }): Promise { const response = await fetch(`${API_BASE}/grove/${groveName}/${treeName}/graft`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data), }); return handleResponse(response); } // Fruit API export async function getFruit(fruitId: string): Promise { const response = await fetch(`${API_BASE}/fruit/${fruitId}`); return handleResponse(response); } // Upload export async function cultivate(groveName: string, treeName: string, file: File, tag?: string): Promise { const formData = new FormData(); formData.append('file', file); if (tag) { formData.append('tag', tag); } const response = await fetch(`${API_BASE}/grove/${groveName}/${treeName}/cultivate`, { method: 'POST', body: formData, }); return handleResponse(response); } // Download URL export function getDownloadUrl(groveName: string, treeName: string, ref: string): string { return `${API_BASE}/grove/${groveName}/${treeName}/+/${ref}`; }