from fastapi import APIRouter, HTTPException from app.problems.grade_1 import ( compose_and_decompose_numbers, join_pictures_with_quantity, sum_with_image_reference, where_are_more_items, ) from app.schemas.grade_1 import ( ComposeAndDecomposeNumbersProblem, ComposeAndDecomposeNumbersRequest, JoinPicturesWithQuantityProblem, JoinPicturesWithQuantityRequest, SumWithImageReferenceProblem, SumWithImageReferenceRequest, WhereAreMoreItemsProblem, WhereAreMoreItemsRequest, ) router = APIRouter(prefix="/grade_1", tags=["Grade 1"]) @router.post( "/compose_and_decompose_numbers", response_model=ComposeAndDecomposeNumbersProblem, ) def create_compose_and_decompose_numbers_problem( request: ComposeAndDecomposeNumbersRequest, ) -> dict: try: return compose_and_decompose_numbers( picture=request.picture.model_dump(), whole=request.whole, randomize_rows=request.randomize_rows, seed=request.seed, ) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc @router.post( "/join_pictures_with_quantity", response_model=JoinPicturesWithQuantityProblem, ) def create_join_pictures_with_quantity_problem( request: JoinPicturesWithQuantityRequest, ) -> dict: try: return join_pictures_with_quantity( available_pictures=[ picture.model_dump() for picture in request.available_pictures ], container_count_per_side=request.container_count_per_side, min_quantity=request.min_quantity, max_quantity=request.max_quantity, seed=request.seed, ) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc @router.post( "/sum_with_image_reference", response_model=SumWithImageReferenceProblem, ) def create_sum_with_image_reference_problem( request: SumWithImageReferenceRequest, ) -> dict: try: return sum_with_image_reference( first_quantity=request.first_quantity, second_quantity=request.second_quantity, first_description=request.first_description, second_description=request.second_description, common_object=request.common_object, first_picture=request.first_picture.model_dump(), second_picture=request.second_picture.model_dump(), option_count=request.option_count, min_option_quantity=request.min_option_quantity, max_option_quantity=request.max_option_quantity, seed=request.seed, ) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc @router.post( "/where_are_more_items", response_model=WhereAreMoreItemsProblem, ) def create_where_are_more_items_problem( request: WhereAreMoreItemsRequest, ) -> dict: try: return where_are_more_items( available_pictures=[ picture.model_dump() for picture in request.available_pictures ], comparison_count=request.comparison_count, min_quantity=request.min_quantity, max_quantity=request.max_quantity, seed=request.seed, ) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc