"""JWT + role-gated admin endpoints for the mobile Ops (admin/moderator) shell.

These are distinct from the web portal's staff-session admin API: here the actor
is a core.User (phone account) whose `role` is admin or moderator. Read-only
platform overview + user list for the mobile rapid-response experience.
"""

from decimal import Decimal

from django.db.models import Count, Sum
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from disputes.models import Dispute
from escrow.models import Deal, Transaction

from .models import User
from .views import _get_authenticated_user

_ADMIN_ROLES = {User.Role.ADMIN, User.Role.MODERATOR}
_HELD = [Deal.Status.FUNDED, Deal.Status.IN_TRANSIT, Deal.Status.CONFIRMING, Deal.Status.DISPUTED]


def _require_role(request):
    user, err = _get_authenticated_user(request)
    if err:
        return None, Response({"detail": err}, status=status.HTTP_401_UNAUTHORIZED)
    if user.role not in _ADMIN_ROLES:
        return None, Response({"detail": "Staff access required."}, status=status.HTTP_403_FORBIDDEN)
    return user, None


@api_view(["GET"])
def mobile_admin_stats(request):
    _, err = _require_role(request)
    if err:
        return err
    volume = Transaction.objects.aggregate(t=Sum("amount"))["t"] or Decimal("0")
    fees = Deal.objects.filter(status=Deal.Status.COMPLETED).aggregate(t=Sum("fee"))["t"] or Decimal("0")
    return Response({
        "total_users": User.objects.count(),
        "total_deals": Deal.objects.count(),
        "active_deals": Deal.objects.filter(status__in=_HELD).count(),
        "open_disputes": Dispute.objects.filter(
            status__in=[Dispute.Status.OPEN, Dispute.Status.UNDER_REVIEW]).count(),
        "total_volume": str(volume),
        "total_fees_collected": str(fees),
        "by_status": {row["status"]: row["n"] for row in Deal.objects.values("status").annotate(n=Count("id"))},
    })


@api_view(["GET"])
def mobile_admin_users(request):
    _, err = _require_role(request)
    if err:
        return err
    qs = User.objects.all().order_by("-created_at")[:200]
    return Response({
        "count": qs.count() if hasattr(qs, "count") else len(qs),
        "results": [
            {
                "id": str(u.id),
                "phone": u.phone,
                "name": u.name,
                "email": u.email,
                "role": u.role,
                "kyc_level": u.kyc_level,
                "is_verified": u.is_verified,
                "is_frozen": u.is_frozen,
                "reputation_score": str(u.reputation_score),
                "total_deals": u.total_deals,
                "completed_deals": u.completed_deals,
                "created_at": u.created_at,
            }
            for u in qs
        ],
    })
