import json import logging from typing import Dict, Any, Tuple from fastapi import FastAPI, HTTPException from pydantic import BaseModel from formats import print_bill, print_customer_order # Configurar logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = FastAPI( title="Print Server FastAPI", description="Server that receive request for printing", version="0.0.1" ) class PrintRequest(BaseModel): content: str ip_printer: str user_name: str class PrintResponse(BaseModel): message: str success: bool print_type: str def _parse_request_data(info: PrintRequest) -> Tuple[Dict[str, Any], str, str]: """Parse and validate request data with better error handling""" try: content_clean = info.content.replace("'", "\"") data = json.loads(content_clean) logger.info( f"Print request from {info.user_name} to {info.ip_printer}") return data, info.ip_printer, info.user_name except json.JSONDecodeError as e: logger.error(f"JSON decode error: {str(e)}") raise HTTPException(status_code=400, detail="Invalid JSON format") except ValueError as e: logger.error(f"Validation error: {str(e)}") raise HTTPException(status_code=400, detail=str(e)) except Exception as e: logger.error(f"Unexpected error parsing request: {str(e)}") raise HTTPException(status_code=400, detail="Error processing request") @app.post("/print_bill", response_model=PrintResponse) def print_ticket_bill(info: PrintRequest) -> PrintResponse: """Print bill ticket""" try: data, address, waiter = _parse_request_data(info) print_bill(data, address, waiter) logger.info(f"Bill printed successfully for {waiter}") return PrintResponse( message="✅ Impresión de cuenta realizada exitosamente!", success=True, print_type="bill" ) except Exception as e: logger.error(f"Error printing bill: {str(e)}") raise HTTPException(status_code=500, detail="Error printing bill") @app.post("/order_kitchen", response_model=PrintResponse) def print_ticket_kitchen(info: PrintRequest) -> PrintResponse: """Print kitchen order""" try: data, address, waiter = _parse_request_data(info) print_customer_order(data, address, waiter) logger.info(f"Kitchen order printed successfully for {waiter}") return PrintResponse( message="✅ Pedido de cocina impreso exitosamente!", success=True, print_type="kitchen" ) except Exception as e: logger.error(f"Error printing kitchen order: {str(e)}") raise HTTPException( status_code=500, detail="Error printing kitchen order") @app.post("/order_bar", response_model=PrintResponse) def print_ticket_bar(info: PrintRequest) -> PrintResponse: """Print bar order""" try: data, address, waiter = _parse_request_data(info) print_customer_order(data, address, waiter) logger.info(f"Bar order printed successfully for {waiter}") return PrintResponse( message="✅ Pedido de barra impreso exitosamente!", success=True, print_type="bar" ) except Exception as e: logger.error(f"Error printing bar order: {str(e)}") raise HTTPException(status_code=500, detail="Error printing bar order") @app.get("/health") def health_check() -> Dict[str, str]: return { "status": "healthy", "service": "print_server", "version": "0.0.1" } @app.get("/") def root() -> Dict[str, str]: return {"message": "Print Server API is running"}