"""HttpNfcLease-compatible upload endpoints for OVF/VMDK lab transfers."""

from __future__ import annotations

from typing import Any

from fastapi import APIRouter, Depends, Request, Response
from fastapi.responses import JSONResponse

from app.db.pool import Database
from app.dependencies import get_database
from app.vsphere.domain import platform_surface
from app.vsphere.errors import not_found
from app.vsphere.security.authz import require_privilege, require_read
from app.vsphere.security.session import SessionInfo

router = APIRouter(tags=["vSphere NFC"])


@router.get("/nfc/{lease_id}")
async def nfc_lease_status(
    lease_id: str,
    database: Database = Depends(get_database),
    _: SessionInfo = Depends(require_read),
) -> dict[str, Any]:
    lease = await platform_surface.get_nfc_lease(database, lease_id)
    if lease is None:
        raise not_found(f"NFC lease {lease_id} not found")
    return lease


@router.post("/nfc/{lease_id}/complete")
async def nfc_lease_complete(
    lease_id: str,
    database: Database = Depends(get_database),
    _: SessionInfo = Depends(require_privilege("VirtualMachine.Provisioning.DeployTemplate")),
) -> dict[str, Any]:
    lease = await platform_surface.complete_nfc_lease(database, lease_id)
    if lease is None:
        raise not_found(f"NFC lease {lease_id} not found")
    return lease


@router.put("/nfc/{lease_id}/files/{filename:path}")
@router.post("/nfc/{lease_id}/files/{filename:path}")
async def nfc_upload_file(
    lease_id: str,
    filename: str,
    request: Request,
    database: Database = Depends(get_database),
    _: SessionInfo = Depends(require_privilege("VirtualMachine.Provisioning.DeployTemplate")),
) -> JSONResponse:
    body = await request.body()
    lease = await platform_surface.upload_nfc_file(database, lease_id, filename, len(body))
    if lease is None:
        raise not_found(f"NFC lease {lease_id} not found")
    return JSONResponse(
        content={
            "lease": lease_id,
            "filename": filename,
            "bytes": len(body),
            "state": lease.get("state"),
            "transferProgress": lease.get("transferProgress"),
        },
        status_code=200,
    )


@router.get("/nfc/{lease_id}/files/{filename:path}")
async def nfc_download_file(
    lease_id: str,
    filename: str,
    database: Database = Depends(get_database),
    _: SessionInfo = Depends(require_read),
) -> Response:
    lease = await platform_surface.get_nfc_lease(database, lease_id)
    if lease is None:
        raise not_found(f"NFC lease {lease_id} not found")
    content = f"# lab nfc placeholder for {filename} on {lease_id}\n".encode()
    return Response(content=content, media_type="application/octet-stream")
