from fastapi import APIRouter, Depends, HTTPException, status

from app.api.deps import require_session
from app.services.push_notification_service import get_push_public_key
from app.services.tenant_store import (
    PushSubscriptionDeletePayload,
    PushSubscriptionPayload,
    SessionIdentity,
    get_tenant_store,
)


router = APIRouter()


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


@router.get("/public-key")
def get_public_key(session: SessionIdentity = Depends(require_session)) -> dict[str, object]:
    _ = session
    public_key = get_push_public_key()
    return {
        "supported": bool(public_key),
        "public_key": public_key,
    }


@router.post("/subscriptions")
def register_subscription(
    payload: PushSubscriptionPayload,
    session: SessionIdentity = Depends(require_session),
) -> dict[str, object]:
    try:
        return get_tenant_store().upsert_push_subscription(session, payload)
    except ValueError as exc:
        _raise_push_error(exc)


@router.delete("/subscriptions")
def delete_subscription(
    payload: PushSubscriptionDeletePayload,
    session: SessionIdentity = Depends(require_session),
) -> dict[str, object]:
    try:
        return get_tenant_store().delete_push_subscription(session, payload.endpoint)
    except ValueError as exc:
        _raise_push_error(exc)
