"""FastAPI Dependency: Lizenzpruefung vor mutiernden Endpoints."""
from fastapi import Depends, HTTPException, status
from auth import get_current_user
from database import db_dependency
from services.license_service import check_license
import aiosqlite


async def require_active_license(
    current_user: dict = Depends(get_current_user),
    db: aiosqlite.Connection = Depends(db_dependency),
) -> dict:
    """Dependency die sicherstellt, dass die Lizenz der Org aktiv ist.

    Blockiert mutierende Operationen bei abgelaufener/widerrufener Lizenz.
    Gibt den current_user zurueck (angereichert mit Lizenz-Info).
    """
    tenant_id = current_user.get("tenant_id")
    if not tenant_id:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Keine Organisation zugeordnet",
        )

    lic = await check_license(db, tenant_id)

    if not lic["valid"]:
        if lic["status"] == "org_disabled":
            raise HTTPException(
                status_code=status.HTTP_403_FORBIDDEN,
                detail="Organisation deaktiviert. Bitte kontaktieren Sie den Support.",
            )

    current_user["license"] = lic
    return current_user


async def require_writable_license(
    current_user: dict = Depends(require_active_license),
) -> dict:
    """Dependency die sicherstellt, dass die Lizenz Schreibzugriff erlaubt.

    Blockiert neue Lagen/Refreshes bei abgelaufener Lizenz, deaktivierter Org
    oder aufgebrauchtem Token-Budget (Hard-Stop).
    """
    lic = current_user.get("license", {})
    if lic.get("read_only"):
        reason = lic.get("read_only_reason") or "expired"
        if reason == "budget_exceeded":
            detail = "Token-Budget aufgebraucht. Für Aufstockung oder Upgrade bitte info@aegis-sight.de kontaktieren."
        elif reason == "expired":
            detail = "Lizenz abgelaufen. Nur Lesezugriff moeglich."
        elif reason == "no_license":
            detail = "Keine aktive Lizenz. Bitte Verwaltung kontaktieren."
        elif reason == "org_disabled":
            detail = "Organisation deaktiviert. Bitte Support kontaktieren."
        else:
            detail = lic.get("message") or "Nur Lesezugriff moeglich."
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail=detail,
            headers={"X-License-Status": reason},
        )
    return current_user
