"""DMS settings API.

Endpoints
---------
  GET   /dms/settings/   — return all DMS settings resolved for the current tenant
  PATCH /dms/settings/   — update one or more settings (requires dms.settings.manage)
"""

from __future__ import annotations

from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.request import Request
from rest_framework.response import Response

from simorgh.apps.iam.registry import register_permission

# ---------------------------------------------------------------------------
# Permission
# ---------------------------------------------------------------------------

PERM_SETTINGS_MANAGE = "dms.settings.manage"


def _register_settings_permission() -> None:
    register_permission(
        codename=PERM_SETTINGS_MANAGE,
        label="DMS: Manage settings",
        description="Allows reading and updating DMS tenant-level settings.",
    )


# ---------------------------------------------------------------------------
# Setting keys exposed through this API
# ---------------------------------------------------------------------------

_DMS_SETTING_KEYS = [
    "dms.max_file_size_mb",
    "dms.allowed_content_types",
    "dms.ocr_enabled",
    "dms.versioning_enabled",
    "dms.retention_enabled",
    "dms.watermark_enabled",
    "dms.require_checkout_before_edit",
    "dms.comments_enabled",
    "dms.annotations_enabled",
    "dms.preview_enabled",
    "dms.default_view_mode",
]

# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------

def _tenant(request: Request):
    tenant = getattr(request, "tenant", None)
    if tenant is None:
        from rest_framework.exceptions import PermissionDenied
        raise PermissionDenied("Tenant required.")
    return tenant


def _require_perm(request: Request, codename: str) -> None:
    from rest_framework.exceptions import PermissionDenied
    from simorgh.core.context import current_request_context

    ctx = current_request_context()
    if ctx.is_superuser:
        return
    if codename not in (ctx.permissions or set()):
        raise PermissionDenied(f"Permission required: {codename}")


# ---------------------------------------------------------------------------
# View
# ---------------------------------------------------------------------------

@api_view(["GET", "PATCH"])
@permission_classes([IsAuthenticated])
def dms_settings_view(request: Request) -> Response:
    """
    GET  — return all DMS settings resolved at tenant scope.
    PATCH — update one or more tenant-scoped settings (requires dms.settings.manage).
    """
    from simorgh.apps.app_settings import services as settings_svc

    if request.method == "PATCH":
        _require_perm(request, PERM_SETTINGS_MANAGE)

    tenant = _tenant(request)

    if request.method == "GET":
        data = {}
        for key in _DMS_SETTING_KEYS:
            data[key] = settings_svc.resolve(key, tenant_id=tenant.pk)
        return Response(data)

    # PATCH
    errors = {}
    for key, value in request.data.items():
        if key not in _DMS_SETTING_KEYS:
            errors[key] = "Unknown DMS setting key."
            continue
        try:
            settings_svc.set_value(
                key,
                value,
                scope="tenant",
                tenant_id=tenant.pk,
                updated_by_id=request.user.pk,
            )
        except Exception as exc:
            errors[key] = str(exc)

    if errors:
        return Response({"errors": errors}, status=status.HTTP_400_BAD_REQUEST)

    data = {}
    for key in _DMS_SETTING_KEYS:
        data[key] = settings_svc.resolve(key, tenant_id=tenant.pk)
    return Response(data)
