from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional, List
from utils.utils import get_db
from . import handler
from .schema import CalculationsessionCreate, CalculationsessionUpdate, CalculationsessionResponse

router = APIRouter(prefix="/calculation-sessions", tags=["Calculation Sessions"])


@router.post(
    "/",
    response_model=CalculationsessionResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Calculation Session",
    description="Creates a new calculation session record for tracking user activity. Returns 409 if the session_id already exists.",
)
def create_calculation_session_route(
    data: CalculationsessionCreate,
    db: Session = Depends(get_db)
):
    return handler.create_calculation_session(db, data)


@router.get(
    "/",
    response_model=List[CalculationsessionResponse],
    summary="List Calculation Sessions",
    description="Returns a paginated list of calculation sessions ordered by last activity. Supports optional filtering by session_id.",
)
def list_calculation_sessions_route(
    limit: int = Query(20, ge=1, le=100),
    offset: int = Query(0, ge=0),
    session_id: Optional[str] = Query(None),
    db: Session = Depends(get_db)
):
    return handler.list_calculation_sessions(db, limit, offset, session_id)


@router.get(
    "/by-session-id/{session_id}",
    response_model=CalculationsessionResponse,
    summary="Get Session By Session ID",
    description="Retrieves a calculation session by its session_id. Returns 404 if not found.",
)
def get_calculation_session_by_session_id_route(
    session_id: str,
    db: Session = Depends(get_db)
):
    return handler.get_calculation_session_by_session_id(db, session_id)


@router.get(
    "/{id}",
    response_model=CalculationsessionResponse,
    summary="Get Calculation Session",
    description="Retrieves a calculation session by its unique ID. Returns 404 if not found.",
)
def get_calculation_session_route(
    id: str,
    db: Session = Depends(get_db)
):
    return handler.get_calculation_session(db, id)


@router.patch(
    "/{id}",
    response_model=CalculationsessionResponse,
    summary="Update Calculation Session",
    description="Updates a calculation session. Only provided fields are modified. Returns 404 if session not found, 409 if session_id conflicts with another session.",
)
def update_calculation_session_route(
    id: str,
    data: CalculationsessionUpdate,
    db: Session = Depends(get_db)
):
    return handler.update_calculation_session(db, id, data)


@router.delete(
    "/{id}",
    status_code=status.HTTP_204_NO_CONTENT,
    summary="Delete Calculation Session",
    description="Deletes a calculation session by ID. Returns 404 if not found.",
)
def delete_calculation_session_route(
    id: str,
    db: Session = Depends(get_db)
):
    handler.delete_calculation_session(db, id)


@router.post(
    "/by-session-id/{session_id}/increment",
    response_model=CalculationsessionResponse,
    summary="Increment Calculation Count",
    description="Increments the calculation count for a session and updates last activity timestamp. Returns 404 if session not found.",
)
def increment_calculation_count_route(
    session_id: str,
    db: Session = Depends(get_db)
):
    return handler.increment_calculation_count(db, session_id)