""" Endpoints pour les refrigerants """ from fastapi import APIRouter, HTTPException, status from typing import List from app.models.refrigerant import ( RefrigerantInfo, RefrigerantsListResponse ) from app.core.refrigerant_loader import get_manager router = APIRouter() @router.get( "/", response_model=RefrigerantsListResponse, summary="Liste des refrigerants disponibles", description="Retourne la liste de tous les refrigerants supportes avec leur disponibilite" ) async def list_refrigerants(): """ Liste tous les refrigerants disponibles dans le systeme. Retourne pour chaque refrigerant: - name: Nom du refrigerant (ex: R134a, R410A) - available: Si la bibliotheque est disponible - loaded: Si le refrigerant est actuellement charge en memoire - error: Message d'erreur si indisponible Returns: RefrigerantsListResponse: Liste des refrigerants avec statistiques """ try: manager = get_manager() refrigerants = manager.get_available_refrigerants() available_count = sum(1 for r in refrigerants if r.get("available", False)) return RefrigerantsListResponse( refrigerants=refrigerants, total=len(refrigerants), available_count=available_count ) except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Erreur lors de la recuperation des refrigerants: {str(e)}" ) @router.get( "/{refrigerant_name}", response_model=RefrigerantInfo, summary="Informations sur un refrigerant specifique", description="Retourne les informations detaillees d'un refrigerant" ) async def get_refrigerant_info(refrigerant_name: str): """ Obtient les informations d'un refrigerant specifique. Args: refrigerant_name: Nom du refrigerant (ex: R134a, R410A) Returns: RefrigerantInfo: Informations du refrigerant Raises: 404: Si le refrigerant n'existe pas 500: En cas d'erreur interne """ try: manager = get_manager() refrigerants = manager.get_available_refrigerants() # Rechercher le refrigerant refrig_info = next( (r for r in refrigerants if r["name"] == refrigerant_name), None ) if refrig_info is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Refrigerant '{refrigerant_name}' non trouve. " f"Refrigerants disponibles: {', '.join(r['name'] for r in refrigerants)}" ) return RefrigerantInfo(**refrig_info) except HTTPException: raise except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Erreur lors de la recuperation du refrigerant: {str(e)}" ) @router.post( "/{refrigerant_name}/load", response_model=RefrigerantInfo, summary="Charger un refrigerant en memoire", description="Charge explicitement un refrigerant en memoire pour accelerer les calculs" ) async def load_refrigerant(refrigerant_name: str): """ Charge un refrigerant en memoire. Utile pour precharger les refrigerants frequemment utilises et ameliorer les performances. Args: refrigerant_name: Nom du refrigerant a charger Returns: RefrigerantInfo: Informations du refrigerant charge Raises: 404: Si le refrigerant n'existe pas 500: Si le chargement echoue """ try: manager = get_manager() # Tenter de charger le refrigerant lib = manager.load_refrigerant(refrigerant_name) return RefrigerantInfo( name=refrigerant_name, available=True, loaded=True ) except ValueError as e: # Refrigerant non supporte raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=str(e) ) except Exception as e: # Erreur de chargement raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Erreur lors du chargement de {refrigerant_name}: {str(e)}" )