from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, status

from app.api.deps import require_session
from app.services.push_notification_service import send_report_created_notification
from app.services.reports_google_sheet_service import sync_reports_google_sheet_safely
from app.services.tenant_store import (
    ReportCreatePayload,
    ReportStatusUpdatePayload,
    SessionIdentity,
    get_tenant_store,
)


router = APIRouter()


def _raise_reports_error(exc: ValueError) -> None:
    detail = str(exc)
    status_code = status.HTTP_403_FORBIDDEN if "non puo" in detail.lower() or "solo l'admin" in detail.lower() else status.HTTP_400_BAD_REQUEST
    raise HTTPException(status_code=status_code, detail=detail) from exc


@router.get("")
def list_reports(
    status_filter: str | None = Query(default=None, alias="status"),
    limit: int = Query(default=200, ge=1, le=500),
    session: SessionIdentity = Depends(require_session),
) -> dict[str, object]:
    try:
        return get_tenant_store().list_reports(session, status_filter=status_filter, limit=limit)
    except ValueError as exc:
        _raise_reports_error(exc)


@router.post("")
def create_report(
    payload: ReportCreatePayload,
    background_tasks: BackgroundTasks,
    session: SessionIdentity = Depends(require_session),
) -> dict[str, object]:
    try:
        result = get_tenant_store().create_report(session, payload)
    except ValueError as exc:
        _raise_reports_error(exc)
    background_tasks.add_task(send_report_created_notification, session, result["report"])
    background_tasks.add_task(sync_reports_google_sheet_safely, session, result["report"])
    return result


@router.patch("/{report_id}/status")
def update_report_status(
    report_id: str,
    payload: ReportStatusUpdatePayload,
    background_tasks: BackgroundTasks,
    session: SessionIdentity = Depends(require_session),
) -> dict[str, object]:
    try:
        result = get_tenant_store().update_report_status(session, report_id, payload)
    except KeyError as exc:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=exc.args[0] if exc.args else str(exc)) from exc
    except ValueError as exc:
        _raise_reports_error(exc)
    background_tasks.add_task(sync_reports_google_sheet_safely, session, result["report"])
    return result
