from datetime import date

from fastapi import APIRouter, Depends, Query
from fastapi.responses import Response
from sqlalchemy.orm import Session

from app.api.deps import get_current_user
from app.db.session import get_db
from app.schemas.reports import ReportFilters, ReportResponse, ReportTypeInfo
from app.schemas.user_context import CurrentUser
from app.services.report_service import ReportService
from app.utils.report_export import export_report_pdf, export_report_xlsx

router = APIRouter()


def _build_filters(
    date_from: date | None = None,
    date_to: date | None = None,
    company_id: int | None = None,
    payment_status: str | None = None,
    expiry_days: int = Query(30, ge=1, le=365),
    agent_id: int | None = None,
) -> ReportFilters:
    return ReportFilters(
        date_from=date_from,
        date_to=date_to,
        company_id=company_id,
        payment_status=payment_status,
        expiry_days=expiry_days,
        agent_id=agent_id,
    )


@router.get("/types", response_model=list[ReportTypeInfo])
def list_report_types(
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return ReportService(db).list_types()


@router.get("/{report_type}", response_model=ReportResponse)
def get_report(
    report_type: str,
    date_from: date | None = None,
    date_to: date | None = None,
    company_id: int | None = None,
    payment_status: str | None = None,
    expiry_days: int = Query(30, ge=1, le=365),
    agent_id: int | None = None,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    filters = _build_filters(date_from, date_to, company_id, payment_status, expiry_days, agent_id)
    return ReportService(db).generate(current_user.agency_id, report_type, filters)


@router.get("/{report_type}/export")
def export_report(
    report_type: str,
    format: str = Query("xlsx", pattern="^(xlsx|pdf)$"),
    date_from: date | None = None,
    date_to: date | None = None,
    company_id: int | None = None,
    payment_status: str | None = None,
    expiry_days: int = Query(30, ge=1, le=365),
    agent_id: int | None = None,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    filters = _build_filters(date_from, date_to, company_id, payment_status, expiry_days, agent_id)
    report = ReportService(db).generate(current_user.agency_id, report_type, filters)

    if format == "pdf":
        content = export_report_pdf(report)
        media_type = "application/pdf"
        filename = f"{report_type}-report.pdf"
    else:
        content = export_report_xlsx(report)
        media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        filename = f"{report_type}-report.xlsx"

    return Response(
        content=content,
        media_type=media_type,
        headers={"Content-Disposition": f'attachment; filename="{filename}"'},
    )
