"""Router for Laporan (report export) endpoints."""

from datetime import date

from fastapi import APIRouter, Depends, HTTPException, Query, status
from fastapi.responses import StreamingResponse
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.database import get_db
from app.dependencies import get_current_user
from app.models.user import User
from app.services import dashboard_service

router = APIRouter(
    prefix="/spbus/{spbu_id}/laporan",
    tags=["laporan"],
)


@router.get("/summary", response_model=dict)
async def get_report_summary(
    spbu_id: int,
    tanggal_mulai: date = Query(...),
    tanggal_akhir: date = Query(...),
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(get_current_user),
) -> dict:
    """Get report summary data for a date range (reuses dashboard aggregation)."""
    if tanggal_mulai > tanggal_akhir:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="tanggal_mulai harus sebelum atau sama dengan tanggal_akhir",
        )
    try:
        summary = await dashboard_service.get_summary(
            db, spbu_id, tanggal_mulai, tanggal_akhir
        )
    except ValueError as e:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
    return {"data": summary.model_dump()}


@router.get("/export/csv", response_class=StreamingResponse)
async def export_csv(
    spbu_id: int,
    tanggal_mulai: date = Query(...),
    tanggal_akhir: date = Query(...),
    tipe: str = Query(default="penjualan", regex="^(penjualan|expenses|penyetoran|stok)$"),
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(get_current_user),
) -> StreamingResponse:
    """Export report data as CSV."""
    import csv
    import io

    summary = await dashboard_service.get_summary(
        db, spbu_id, tanggal_mulai, tanggal_akhir
    )

    output = io.StringIO()
    writer = csv.writer(output)

    if tipe == "penjualan":
        writer.writerow(["Produk", "Kode", "Volume (L)", "Nilai (Rp)"])
        for p in summary.produk_sales:
            writer.writerow([p.produk_nama, p.produk_kode, str(p.total_volume), str(p.total_nilai)])
        writer.writerow([])
        writer.writerow(["TOTAL", "", str(summary.total_penjualan_volume), str(summary.total_penjualan_nilai)])
    elif tipe == "stok":
        writer.writerow(["Tangki", "Produk", "Kapasitas (L)", "Volume Terakhir (L)", "% Isi"])
        for t in summary.tangki_status:
            writer.writerow([t.tangki_nama, t.produk_nama or "", str(t.kapasitas_liter), str(t.volume_terakhir or ""), str(t.persen_isi or "")])
    else:
        writer.writerow(["Periode", f"{tanggal_mulai} s/d {tanggal_akhir}"])
        writer.writerow(["Total Penjualan", str(summary.total_penjualan_nilai)])
        writer.writerow(["Total Expenses", str(summary.total_expenses)])
        writer.writerow(["Total Penyetoran", str(summary.total_penyetoran)])

    output.seek(0)
    filename = f"laporan_{tipe}_{tanggal_mulai}_{tanggal_akhir}.csv"
    return StreamingResponse(
        iter([output.getvalue()]),
        media_type="text/csv",
        headers={"Content-Disposition": f"attachment; filename={filename}"},
    )
