from itertools import product from math import log import time from fastapi import HTTPException, APIRouter from fastapi.responses import JSONResponse from fudo import fudo from models.sales 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 from services.data_service import ProductDataService, UserDataService from config.mails import PRINTER_DISCONNECTED_MAIL from config.messages import ErrorResponse, SuccessResponse, UserResponse logger = getLogger(__name__) user_data_service = UserDataService() product_data_service = ProductDataService() printer_orders = [] order_router = APIRouter() @order_router.post("/send") 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, args=(PRINTER_DISCONNECTED_MAIL["subject"], PRINTER_DISCONNECTED_MAIL["body"], ["erwinjacimino2003@gmail.com"]), daemon=True ) email_thread.start() logger.error("Email sent to admin about printer issue.") return JSONResponse(status_code=424, content={"message": ErrorResponse.PRINTER_DISCONNECTED}) items = order.items table = order.table if not items or not table: return JSONResponse(status_code=400, content={"message": ErrorResponse.MISSING_FIELDS}) if not isinstance(table, int): return JSONResponse(status_code=400, content={"message": ErrorResponse.INVALID_TABLE_TYPE}) # 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": ErrorResponse.PRODUCT_ADD_ERROR, "errors": product_errors} ) user = user_data_service.get_by_id(order.customerId) if not user: return JSONResponse(status_code=404, content={"message": UserResponse.USER_NOT_FOUND.format(user_id=order.customerId)}) products = product_data_service.get_products([item.id for item in items]) # Print order printer_orders.append(Order( user=user.nombre if user else "Unknown User", items=[Item(product.name, product.price, item.quantity) for product, item in zip(products, items)] )) # Log order log_order(user.nombre, order.table, order_date=order.orderDate, items=[product.name for product in products]) return JSONResponse({"message": SuccessResponse.ORDER_SUCCESS}) 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