# views_admin_txns.py
# views_admin_txns.py
from django.db.models import OuterRef, Subquery, Value, F
from django.db.models.functions import Coalesce, Concat
from rest_framework.permissions import IsAdminUser
from rest_framework.generics import ListAPIView
from rest_framework.pagination import PageNumberPagination

from accounts.serializers_admin_txns import AdminTransactionRowSerializer
from payments.models import PaymentTransaction
from recharge.models import RechargeTransaction
from payments.models import RechargePaymentSummary
from accounts.permissions import IsRoleAdmin, IsRoleAdminForWrite
from rest_framework.permissions import IsAuthenticated

class AdminTxnPagination(PageNumberPagination):
    page_size = 25
    page_size_query_param = "page_size"
    max_page_size = 200

class AdminTransactionListAPI(ListAPIView):
    # permission_classes = [IsAdminUser]
    permission_classes = [IsAuthenticated, IsRoleAdmin]
    serializer_class = AdminTransactionRowSerializer
    pagination_class = AdminTxnPagination

    def get_queryset(self):
        q = RechargePaymentSummary.objects.select_related("user")

        pay_qs  = PaymentTransaction.objects.filter(order_id=OuterRef("order_id"))
        rchg_qs = RechargeTransaction.objects.filter(order_id=OuterRef("order_id"))

        # NOTE: use ONLY alias names that do NOT exist on RechargePaymentSummary
        q = q.annotate(
            uid=F("user_id"),  # alias for user_id
            user_name=Coalesce(
                Concat(F("user__first_name"), Value(" "), F("user__last_name")),
                Value("")
            ),
            user_mobile=F("user__mobile_number"),

            # PaymentTransaction aliases (pay_)
            pay_service=Subquery(pay_qs.values("service")[:1]),
            pay_status=Subquery(pay_qs.values("status")[:1]),
            pay_razorpay_order_id=Subquery(pay_qs.values("razorpay_order_id")[:1]),

            # RechargeTransaction aliases (rchg_)
            rchg_operator=Subquery(rchg_qs.values("operator__name")[:1]),
            rchg_circle=Subquery(rchg_qs.values("circle__name")[:1]),
            rchg_provider_order_id=Subquery(rchg_qs.values("provider_order_id")[:1]),
            rchg_status=Subquery(rchg_qs.values("status")[:1]),
            rchg_service_type=Subquery(rchg_qs.values("service_type")[:1]),
            rchg_refund_status=Subquery(rchg_qs.values("refund_status")[:1]),
            rchg_operator_ref_id=Subquery(rchg_qs.values("operator_ref_id")[:1]),
        )

        p = self.request.query_params

        # Filters
        mobile = p.get("mobile")
        if mobile:
            q = q.filter(user__mobile_number__iexact=mobile)

        order_id = p.get("order_id")
        if order_id:
            q = q.filter(order_id__icontains=order_id)

        recharge_status = p.get("recharge_status")
        if recharge_status:
            q = q.filter(recharge_status__iexact=recharge_status)

        is_refunded = p.get("is_refunded")
        if is_refunded is not None:
            s = is_refunded.lower()
            if s in ("1", "true", "yes"):
                q = q.filter(is_refunded=True)
            elif s in ("0", "false", "no"):
                q = q.filter(is_refunded=False)

        # Optional date range
        df = p.get("date_from")
        dt = p.get("date_to")
        if df:
            q = q.filter(updated_at__date__gte=df)
        if dt:
            q = q.filter(updated_at__date__lte=dt)

        # Ordering
        ordering = p.get("ordering", "-updated_at")
        allowed = {
            "updated_at", "-updated_at",
            "recharge_amount", "-recharge_amount",
            "recharge_status", "-recharge_status",
            "user_mobile", "-user_mobile",
            "order_id", "-order_id",
        }
        q = q.order_by(ordering if ordering in allowed else "-updated_at")

        # IMPORTANT: Only include the aliases or base fields; do NOT repeat colliding names.
        return q.values(
            "order_id",
            "uid",                 # alias for user_id
            "user_name",
            "user_mobile",
            "recharge_amount",
            "recharge_status",
            "is_refunded",
            "provider_commission",  # base model field ok
            # payment (aliased)
            "pay_service",
            "pay_status",
            "pay_razorpay_order_id",
            # recharge (aliased)
            "rchg_operator",
            "rchg_circle",
            "rchg_provider_order_id",
            "rchg_status",
            "rchg_service_type",
            "rchg_refund_status",
            "rchg_operator_ref_id",
            "updated_at",
        )


# from django.db.models import OuterRef, Subquery, Value, F
# from django.db.models.functions import Coalesce, Concat
# from rest_framework.permissions import IsAdminUser
# from rest_framework.generics import ListAPIView
# from rest_framework.pagination import PageNumberPagination

# from accounts.serializers_admin_txns import AdminTransactionRowSerializer
# from payments.models import PaymentTransaction   # adjust import paths to your app layout
# from recharge.models import RechargeTransaction  # "
# from payments.models import RechargePaymentSummary  # "

# class AdminTxnPagination(PageNumberPagination):
#     page_size = 25
#     page_size_query_param = "page_size"
#     max_page_size = 200

# class AdminTransactionListAPI(ListAPIView):
#     """
#     GET /api/admin/transactions/?mobile=8096...&order_id=VP...&recharge_status=Success&is_refunded=true
#     Optional: ?date_from=2025-10-01&date_to=2025-10-08&ordering=-updated_at
#     """
#     permission_classes = [IsAdminUser]
#     serializer_class = AdminTransactionRowSerializer
#     pagination_class = AdminTxnPagination

#     def get_queryset(self):
#         q = RechargePaymentSummary.objects.select_related("user")

#         pay_qs = PaymentTransaction.objects.filter(order_id=OuterRef("order_id"))
#         rchg_qs = RechargeTransaction.objects.filter(order_id=OuterRef("order_id"))

#         # DO NOT annotate "user_id" (it exists on the model)
#         q = q.annotate(
#             user_name=Coalesce(
#                 Concat(F("user__first_name"), Value(" "), F("user__last_name")),
#                 Value("")
#             ),
#             user_mobile=F("user__mobile_number"),

#             payment_service=Subquery(pay_qs.values("service")[:1]),
#             payment_status=Subquery(pay_qs.values("status")[:1]),
#             razorpay_order_id=Subquery(pay_qs.values("razorpay_order_id")[:1]),

#             operator=Subquery(rchg_qs.values("operator__name")[:1]),
#             circle=Subquery(rchg_qs.values("circle__name")[:1]),
#             provider_order_id=Subquery(rchg_qs.values("provider_order_id")[:1]),
#             recharge_txn_status=Subquery(rchg_qs.values("status")[:1]),
#             service_type=Subquery(rchg_qs.values("service_type")[:1]),
#             refund_status=Subquery(rchg_qs.values("refund_status")[:1]),
#             operator_ref_id=Subquery(rchg_qs.values("operator_ref_id")[:1]),
#         )

#         # Filters
#         p = self.request.query_params
#         mobile = p.get("mobile")
#         if mobile:
#             q = q.filter(user__mobile_number__iexact=mobile)

#         order_id = p.get("order_id")
#         if order_id:
#             q = q.filter(order_id__icontains=order_id)

#         recharge_status = p.get("recharge_status")
#         if recharge_status:
#             q = q.filter(recharge_status__iexact=recharge_status)

#         is_refunded = p.get("is_refunded")
#         if is_refunded is not None:
#             s = is_refunded.lower()
#             if s in ("1", "true", "yes"):
#                 q = q.filter(is_refunded=True)
#             elif s in ("0", "false", "no"):
#                 q = q.filter(is_refunded=False)

#         df = p.get("date_from")
#         dt = p.get("date_to")
#         if df:
#             q = q.filter(updated_at__date__gte=df)
#         if dt:
#             q = q.filter(updated_at__date__lte=dt)

#         ordering = p.get("ordering", "-updated_at")
#         allowed = {
#             "updated_at", "-updated_at",
#             "recharge_amount", "-recharge_amount",
#             "recharge_status", "-recharge_status",
#             "user_mobile", "-user_mobile",
#             "order_id", "-order_id",
#         }
#         q = q.order_by(ordering if ordering in allowed else "-updated_at")

#         # Note: include the real DB field "user_id" here (no annotation needed)
#         return q.values(
#             "order_id",
#             # "user_id",
#             "user_name",
#             "user_mobile",
#             "recharge_amount",
#             "recharge_status",
#             "is_refunded",
#             "provider_commission",
#             "payment_service",
#             "payment_status",
#             "razorpay_order_id",
#             "operator",
#             "circle",
#             # "provider_order_id",
#             "recharge_txn_status",
#             "service_type",
#             "refund_status",
#             "operator_ref_id",
#             "updated_at",
#         )
