# api/views_combined.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404
from payments.models import PaymentTransaction, RechargePaymentSummary
from recharge.models import RechargeTransaction
from .serializers import (
    PaymentTransactionSerializer,
    RechargePaymentSummarySerializer,
    RechargeTransactionSerializer,
)
from .permissions import IsRoleAdminForWrite
from .utils import parse_range, add_range

class TransactionsViewAllAPI(APIView):
    permission_classes = [IsRoleAdminForWrite]

    def get(self, request):
        order_id = request.query_params.get("order_id")
        mobile = request.query_params.get("mobile") or request.query_params.get("mobile_number")
        start = request.query_params.get("start_date")
        end = request.query_params.get("end_date")
        start_dt, end_dt = parse_range(start, end)

        # PaymentTransaction
        p_qs = PaymentTransaction.objects.select_related("user").all()
        if order_id:
            p_qs = p_qs.filter(order_id=order_id)
        if mobile:
            p_qs = p_qs.filter(user__mobile_number=mobile)
        p_qs = add_range(p_qs, "created_at", start_dt, end_dt).order_by("-created_at")

        # RechargePaymentSummary (uses updated_at)
        s_qs = RechargePaymentSummary.objects.select_related("user").all()
        if order_id:
            s_qs = s_qs.filter(order_id=order_id)
        if mobile:
            s_qs = s_qs.filter(user__mobile_number=mobile)
        s_qs = add_range(s_qs, "updated_at", start_dt, end_dt).order_by("-updated_at")

        # RechargeTransaction
        r_qs = RechargeTransaction.objects.select_related("user").all()
        if order_id:
            r_qs = r_qs.filter(order_id=order_id)
        if mobile:
            r_qs = r_qs.filter(user__mobile_number=mobile)
        r_qs = add_range(r_qs, "created_at", start_dt, end_dt).order_by("-created_at")

        # Optional simple pagination applied uniformly
        try:
            limit = int(request.query_params.get("limit", 50))
            offset = int(request.query_params.get("offset", 0))
        except ValueError:
            limit, offset = 50, 0

        resp = {
            "payment_transactions": {
                "count": p_qs.count(),
                "results": PaymentTransactionSerializer(p_qs[offset:offset+limit], many=True).data
            },
            "recharge_payment_summaries": {
                "count": s_qs.count(),
                "results": RechargePaymentSummarySerializer(s_qs[offset:offset+limit], many=True).data
            },
            "recharge_transactions": {
                "count": r_qs.count(),
                "results": RechargeTransactionSerializer(r_qs[offset:offset+limit], many=True).data
            },
        }
        return Response(resp, status=status.HTTP_200_OK)

    def patch(self, request):
        """
        Body:
        {
          "target": "payment" | "summary" | "recharge",
          "order_id": "ORD123",
          "patch": { ...fields to update... }
        }
        """
        target = request.data.get("target")
        order_id = request.data.get("order_id")
        patch = request.data.get("patch") or {}

        if target not in ("payment", "summary", "recharge"):
            return Response({"detail": "Invalid 'target'."}, status=status.HTTP_400_BAD_REQUEST)
        if not order_id:
            return Response({"detail": "'order_id' is required."}, status=status.HTTP_400_BAD_REQUEST)

        if target == "payment":
            obj = get_object_or_404(PaymentTransaction, order_id=order_id)
            ser = PaymentTransactionSerializer(obj, data=patch, partial=True)
        elif target == "summary":
            obj = get_object_or_404(RechargePaymentSummary, order_id=order_id)
            ser = RechargePaymentSummarySerializer(obj, data=patch, partial=True)
        else:
            obj = get_object_or_404(RechargeTransaction, order_id=order_id)
            ser = RechargeTransactionSerializer(obj, data=patch, partial=True)

        ser.is_valid(raise_exception=True)
        ser.save()
        return Response(ser.data, status=status.HTTP_200_OK)
