from fastapi import APIRouter, Depends, status
from sqlalchemy.orm import Session
from utils.utils import get_db
from . import handler
from .schema import CalculatordefaultsCreate, CalculatordefaultsUpdate, CalculatordefaultsResponse

router = APIRouter(prefix="/calculator-defaults", tags=["Calculator Configuration"])


@router.get(
    "/",
    response_model=CalculatordefaultsResponse,
    summary="Get Calculator Defaults",
    description="Retrieves the current calculator defaults and validation constraints. Returns the singleton configuration record used to populate default values and validate loan calculation inputs.",
)
def get_calculator_defaults_route(db: Session = Depends(get_db)):
    return handler.get_calculator_defaults(db)


@router.get(
    "/{defaults_id}",
    response_model=CalculatordefaultsResponse,
    summary="Get Calculator Defaults By ID",
    description="Retrieves calculator defaults by unique identifier. Returns 404 if the specified defaults record does not exist.",
)
def get_calculator_defaults_by_id_route(defaults_id: str, db: Session = Depends(get_db)):
    return handler.get_calculator_defaults_by_id(db, defaults_id)


@router.put(
    "/{defaults_id}",
    response_model=CalculatordefaultsResponse,
    summary="Update Calculator Defaults",
    description="Updates calculator defaults and validation constraints. Validates that minimum values do not exceed maximum values for principal, interest rate, and term. Returns 404 if the defaults record does not exist, 400 for constraint violations.",
)
def update_calculator_defaults_route(defaults_id: str, data: CalculatordefaultsUpdate, db: Session = Depends(get_db)):
    return handler.update_calculator_defaults(db, defaults_id, data)


@router.post(
    "/",
    response_model=CalculatordefaultsResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Calculator Defaults",
    description="Creates a new calculator defaults configuration record. Validates that minimum values do not exceed maximum values for principal, interest rate, and term. Returns 400 for constraint violations.",
)
def create_calculator_defaults_route(data: CalculatordefaultsCreate, db: Session = Depends(get_db)):
    return handler.create_calculator_defaults(db, data)