import asyncio from math import log import time from fastapi import HTTPException from fastapi.responses import JSONResponse from fudo import fudo from models.schemas import OrderWeb from services.fudo_service import add_product_to_fudo from services.email_service import send_email from services.logging_service import log_order from impresora.printer import PrinterUSB from impresora.order import Order, Item from logging import getLogger from threading import Thread logger = getLogger(__name__) printer_orders = [] async def printer_order(order: OrderWeb): """Process printer order""" logger.info("Printer order received") logger.info(order) if not PrinterUSB.check_usb_port(0xfe6, 0x811e): logger.error("Printer is not connected.") email_thread = Thread( target=send_email, daemon=True) email_thread.start() logger.error("Email sent to admin about printer issue.") return JSONResponse(status_code=424, content={"message": "Printer is not connected."}) items = order.items table = order.table if not items or not table: return JSONResponse(status_code=400, content={"message": "Items and table are required."}) if not isinstance(table, int): return JSONResponse(status_code=400, content={"message": "Table must be an integer."}) # Add products to Fudo product_errors = [] for item in items: fudo.get_token() # product = add_product_to_fudo(item.id, item.quantity, table) # if not product: # product_errors.append(f"Error adding product {item.id} to table {table}.") if product_errors: return JSONResponse( status_code=424, content={"message": "Error adding products to table.", "errors": product_errors} ) # Print order printer_orders.append(Order( order.customerName, [Item(item.name, item.price, item.quantity) for item in items] )) # Log order log_order(order, items) return JSONResponse({"message": "Order processed successfully"}) def order_thread(): """Thread to process orders""" logger.info("Starting order thread") while True: if printer_orders: order = printer_orders.pop(0) logger.info(f"Processing order: {order}") try: printer = PrinterUSB(0xfe6, 0x811e) if not printer.is_connected(): logger.error("Printer is not connected.") continue # printer.print_order(order) logger.info(f"Order printed: {order}") except Exception as e: logger.error(f"Error printing order: {e}") time.sleep(1) # Sleep to avoid busy waiting