from typing import Any, Dict, Optional, Union from fastapi import APIRouter, HTTPException, status from .schema import CalculationTimeConstrainsParametersRead, CalculationTimeConstrainsRead, CalculationTimeConstrainsParametersCreate, CalculationTimeConstrainsParametersRetrive from src.database.core import DbSession from src.models import StandardResponse from src.auth.service import CurrentUser from .service import create_param_and_data, get_calculation_result from .flows import get_create_calculation_parameters, create_calculation, get_or_create_scope_equipment_calculation from fastapi.params import Query router = APIRouter() @router.post("", response_model=StandardResponse[Union[str, CalculationTimeConstrainsRead]]) async def create_calculation_time_constrains(db_session: DbSession, current_user: CurrentUser, calculation_time_constrains_in: CalculationTimeConstrainsParametersCreate, scope_calculation_id: Optional[str] = Query(None), with_results: Optional[int] = Query(0)): """Save calculation time constrains Here""" if scope_calculation_id: results = await get_or_create_scope_equipment_calculation(db_session=db_session, scope_calculation_id=scope_calculation_id, calculation_time_constrains_in=calculation_time_constrains_in) else: results = await create_calculation(db_session=db_session, calculation_time_constrains_in=calculation_time_constrains_in, created_by=current_user.name) if not with_results: results = str(results.id) return StandardResponse(data=results, message="Data created successfully") @router.get("/parameters", response_model=StandardResponse[Union[CalculationTimeConstrainsParametersRetrive, CalculationTimeConstrainsParametersRead]]) async def get_calculation_parameters(db_session: DbSession, calculation_id: Optional[str] = Query(None)): """Get all calculation parameter.""" parameters = await get_create_calculation_parameters(db_session=db_session, calculation_id=calculation_id) return StandardResponse( data=parameters, message="Data retrieved successfully", ) @router.get("/{calculation_id}", response_model=StandardResponse[CalculationTimeConstrainsRead]) async def get_calculation_results(db_session: DbSession, calculation_id): results = await get_calculation_result(db_session=db_session, calculation_id=calculation_id) return StandardResponse( data=results, message="Data retrieved successfully", ) @router.post("/simulation", response_model=StandardResponse[Dict[str, Any]]) async def get_simulation_result(): results = { "simulation": { "intervalDays": 45, "numberOfFailures": 75, "totalCost": 550000000, }, "comparison": { "vsOptimal": { "failureDifference": 16, "costDifference": 50000000 }, } } return StandardResponse(data=results, message="Data retrieved successfully")