from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from backend.app.api.deps import get_logistics_service from backend.app.db import get_db_session from backend.app.schemas.common import success_payload from backend.app.schemas.logistics import CreateLogisticsTaskRequest from backend.app.services.logistics_service import LogisticsService router = APIRouter(tags=["logistics"]) @router.get("/api/logistics/tasks") def list_logistics_tasks( order_id: int | None = Query(default=None), task_no: str | None = Query(default=None), status: str | None = Query(default=None), driver_id: int | None = Query(default=None), factory_id: int | None = Query(default=None), logistics_service: LogisticsService = Depends(get_logistics_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload( logistics_service.list_tasks( session=session, filters={ "order_id": order_id, "task_no": task_no, "status": status, "driver_id": driver_id, "factory_id": factory_id, }, ) ) @router.post("/api/logistics/tasks") def create_logistics_task( payload: CreateLogisticsTaskRequest, logistics_service: LogisticsService = Depends(get_logistics_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(logistics_service.create_task(payload.model_dump(), session)) @router.get("/api/logistics/tasks/{task_id}") def get_logistics_task( task_id: int, logistics_service: LogisticsService = Depends(get_logistics_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(logistics_service.get_task(task_id, session)) @router.get("/api/driver/tasks") def list_driver_tasks( logistics_service: LogisticsService = Depends(get_logistics_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(logistics_service.list_driver_tasks(session)) @router.get("/api/driver/tasks/{task_id}") def get_driver_task( task_id: int, logistics_service: LogisticsService = Depends(get_logistics_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(logistics_service.get_driver_task(task_id, session)) @router.post("/api/driver/tasks/{task_id}/accept") def accept_driver_task( task_id: int, logistics_service: LogisticsService = Depends(get_logistics_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(logistics_service.accept_task(task_id, session)) @router.post("/api/driver/tasks/{task_id}/pickup") def pickup_driver_task( task_id: int, logistics_service: LogisticsService = Depends(get_logistics_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(logistics_service.pickup_task(task_id, session)) @router.post("/api/driver/tasks/{task_id}/deliver") def deliver_driver_task( task_id: int, logistics_service: LogisticsService = Depends(get_logistics_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(logistics_service.deliver_task(task_id, session)) @router.get("/api/logistics/{order_id}/trace") def get_logistics_trace( order_id: int, logistics_service: LogisticsService = Depends(get_logistics_service), ) -> dict: return success_payload(logistics_service.get_trace(order_id)) @router.post("/api/logistics/{order_id}/trace") def create_logistics_trace( order_id: int, logistics_service: LogisticsService = Depends(get_logistics_service), ) -> dict: return success_payload(logistics_service.create_trace(order_id))