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 ReportCreate, ReportUpdate, ReportResponse, ReportDetailResponse, ReportStatus

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 for a user or listing. Either reported_user_id or reported_listing_id must be provided. Returns 404 if the reporter, reported user, or reported listing does not exist. Returns 400 if neither target is provided.",
)
def create_report_route(data: ReportCreate, db: Session = Depends(get_db)):
    return handler.create_report(db, data)


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


@router.get(
    "/",
    response_model=List[ReportResponse],
    summary="List Reports",
    description="Returns a paginated list of reports. Supports optional filters for reporter_id, reported_user_id, reported_listing_id, status, and report_type.",
)
def list_reports_route(
    limit: int = Query(20, ge=1, le=100),
    offset: int = Query(0, ge=0),
    reporter_id: Optional[str] = None,
    reported_user_id: Optional[str] = None,
    reported_listing_id: Optional[str] = None,
    status: Optional[ReportStatus] = None,
    report_type: Optional[str] = None,
    db: Session = Depends(get_db),
):
    return handler.list_reports(
        db,
        limit=limit,
        offset=offset,
        reporter_id=reporter_id,
        reported_user_id=reported_user_id,
        reported_listing_id=reported_listing_id,
        status=status.value if status else None,
        report_type=report_type,
    )


@router.put(
    "/{id}",
    response_model=ReportResponse,
    summary="Update Report",
    description="Updates an existing report. Returns 404 if the report, reported user, reported listing, or reviewer does not exist.",
)
def update_report_route(id: str, data: ReportUpdate, db: Session = Depends(get_db)):
    return handler.update_report(db, id, data)


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


@router.post(
    "/{id}/review",
    response_model=ReportResponse,
    summary="Review Report",
    description="Allows a moderator or admin to review a report and mark it as resolved or dismissed. Returns 404 if the report or reviewer does not exist. Returns 400 if the report is not in a reviewable state or if the new status is invalid.",
)
def review_report_route(
    id: str,
    reviewer_id: str,
    resolution_notes: str,
    new_status: ReportStatus,
    db: Session = Depends(get_db),
):
    return handler.review_report(db, id, reviewer_id, resolution_notes, new_status)


@router.get(
    "/{id}/details",
    response_model=ReportDetailResponse,
    summary="Get Report Details",
    description="Returns detailed information about a report including reporter, reported user, reported listing, and reviewer information. Returns 404 if the report does not exist.",
)
def get_report_details_route(id: str, db: Session = Depends(get_db)):
    return handler.get_report_details(db, id)