from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional
from utils.utils import get_db
from . import handler
from .schema import (
    ReportCreate,
    ReportUpdate,
    ReportResponse,
    ReportDetailResponse,
    ReportListResponse,
)

router = APIRouter(prefix="/reports", tags=["Reports"])


@router.post(
    "/",
    response_model=ReportResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Report",
    description="Creates a new report record. Validates that the generated_by_user_id references an existing user. Returns 400 if user does not exist.",
)
def create_report_route(data: ReportCreate, db: Session = Depends(get_db)):
    return handler.create_report(db, data)


@router.get(
    "/",
    response_model=ReportListResponse,
    summary="List Reports",
    description="Returns a paginated list of reports. Supports optional filters on report_type and generated_by_user_id.",
)
def list_reports_route(
    limit: int = Query(20, ge=1),
    offset: int = Query(0, ge=0),
    report_type: Optional[str] = None,
    generated_by_user_id: Optional[str] = None,
    db: Session = Depends(get_db),
):
    return handler.list_reports(db, limit, offset, report_type, generated_by_user_id)


@router.get(
    "/{report_id}",
    response_model=ReportResponse,
    summary="Get Report",
    description="Retrieves a single report by ID. Returns 404 if the report does not exist.",
)
def get_report_route(report_id: str, db: Session = Depends(get_db)):
    return handler.get_report(db, report_id)


@router.get(
    "/{report_id}/details",
    response_model=ReportDetailResponse,
    summary="Get Report Details",
    description="Retrieves a report with related user details (generated_by_user). Returns 404 if the report does not exist.",
)
def get_report_details_route(report_id: str, db: Session = Depends(get_db)):
    return handler.get_report_details(db, report_id)


@router.patch(
    "/{report_id}",
    response_model=ReportResponse,
    summary="Update Report",
    description="Updates a report with the provided fields. Only fields present in the request body are updated. Returns 404 if the report does not exist.",
)
def update_report_route(
    report_id: str, data: ReportUpdate, db: Session = Depends(get_db)
):
    return handler.update_report(db, report_id, data)


@router.delete(
    "/{report_id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Report",
    description="Deletes a report by ID. Returns 404 if the report does not exist. Returns 409 if the report is referenced by other records.",
)
def delete_report_route(report_id: str, db: Session = Depends(get_db)):
    return handler.delete_report(db, report_id)