import httpx from typing import Optional, Dict, List, Any import asyncio from datetime import datetime, date class APIClient: def __init__(self, base_url: str, auth_token: Optional[str] = None): self.base_url = base_url.rstrip('/') self.auth_token = auth_token self.client = httpx.AsyncClient(timeout=30.0, follow_redirects=True) def set_auth_token(self, token: str): """Set authentication token""" self.auth_token = token @property def headers(self) -> Dict[str, str]: """Get headers with authentication""" headers = {"Content-Type": "application/json"} if self.auth_token: headers["Authorization"] = f"Bearer {self.auth_token}" return headers async def _request(self, method: str, endpoint: str, **kwargs) -> Dict[str, Any]: """Make HTTP request""" url = f"{self.base_url}{endpoint}" kwargs.setdefault('headers', {}).update(self.headers) try: response = await self.client.request(method, url, **kwargs) response.raise_for_status() return response.json() except httpx.HTTPError as e: raise Exception(f"API request failed: {str(e)}") # Pietanze endpoints async def get_pietanze(self, skip: int = 0, limit: int = 100, search: str = None, allergeni: List[str] = None) -> Dict[str, Any]: """Get pietanze with optional filters""" params = {"skip": skip, "limit": limit} if search: params["search"] = search if allergeni: params["allergeni"] = ",".join(allergeni) return await self._request("GET", "/api/v1/pietanze", params=params) async def get_pietanza(self, pietanza_id: int) -> Dict[str, Any]: """Get single pietanza by ID""" return await self._request("GET", f"/api/v1/pietanze/{pietanza_id}") async def create_pietanza(self, pietanza_data: Dict[str, Any]) -> Dict[str, Any]: """Create new pietanza""" return await self._request("POST", "/api/v1/pietanze", json=pietanza_data) async def update_pietanza(self, pietanza_id: int, pietanza_data: Dict[str, Any]) -> Dict[str, Any]: """Update existing pietanza""" return await self._request("PUT", f"/api/v1/pietanze/{pietanza_id}", json=pietanza_data) async def delete_pietanza(self, pietanza_id: int) -> None: """Delete pietanza""" await self._request("DELETE", f"/api/v1/pietanze/{pietanza_id}") # Dashboard/stats endpoints async def get_dashboard_stats(self) -> Dict[str, Any]: """Get dashboard statistics""" return await self._request("GET", "/api/v1/stats/dashboard") async def get_prenotazioni_today(self) -> List[Dict[str, Any]]: """Get today's prenotazioni""" today = date.today().isoformat() return await self._request("GET", f"/api/v1/prenotazioni/by-date/{today}") async def get_pasti_disponibili(self) -> List[Dict[str, Any]]: """Get available pasti""" return await self._request("GET", "/api/v1/pasti", params={"disponibile": True}) def __del__(self): """Cleanup client""" try: asyncio.create_task(self.client.aclose()) except: pass