from __future__ import annotations

from contextlib import asynccontextmanager
from datetime import datetime, timezone

from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware

from app.config import get_settings
from app.models import NimitSevakReceiptRequest, ReceiptResponse
from app.services.firebase_storage import upload_pdf_bytes
from app.services.pdf_generator import generate_nimit_sevak_pdf, generate_receipt_number


@asynccontextmanager
async def lifespan(_: FastAPI):
    get_settings()
    yield


app = FastAPI(
    title="SDM Receipt Service",
    version="1.0.0",
    lifespan=lifespan,
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
def root():
    return {"service": "sdm-receipt", "status": "ok"}


@app.get("/health")
def health():
    return {"status": "ok", "timestamp": datetime.now(timezone.utc).isoformat()}


@app.post("/receipts/nimit-sevak", response_model=ReceiptResponse)
def create_nimit_sevak_receipt(payload: NimitSevakReceiptRequest):
    try:
        receipt_number = payload.receipt_number or generate_receipt_number()
        pdf_bytes = generate_nimit_sevak_pdf(payload, receipt_number)
        uploaded = upload_pdf_bytes(pdf_bytes, receipt_number)
        generated_at = datetime.now(timezone.utc)

        return ReceiptResponse(
            receipt_number=receipt_number,
            pdf_url=uploaded.url,
            storage_path=uploaded.storage_path,
            generated_at=generated_at,
        )
    except RuntimeError as exc:
        raise HTTPException(status_code=500, detail=str(exc)) from exc
    except Exception as exc:
        raise HTTPException(status_code=500, detail=f"Receipt generation failed: {exc}") from exc
