from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response
from django.db import transaction
from decimal import Decimal
from apps.core.views.base import BaseViewSet
from .models import Withdraw
from apps.profiles.models import Profile
from .serializers import WithdrawSerializer

class WithdrawViewSet(BaseViewSet):
    serializer_class = WithdrawSerializer
    permission_app_name = 'withdraw'
    permission_model_name = 'withdraw'
    view_permissions = ["list", "create", "update", "retrieve", "destroy", "approve", "reject"]
    search_fields = ['user__name', 'user__email', 'phone_number', 'pay_id']

    def get_queryset(self):
        user = self.request.user
        
        if not user.is_authenticated:
            return Withdraw.objects.none()

        if user.is_superuser or getattr(user, 'role', '') == 'admin':
            return Withdraw.objects.all().order_by('-created_at')
        return Withdraw.objects.filter(user=user).order_by('-created_at')

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)

        try:
            with transaction.atomic():
                amount = serializer.validated_data['amount']
                
                # ১০% ফি ক্যালকুলেশন
                fee = amount * Decimal('0.10')
                final_amount = amount - fee
                
                profile = Profile.objects.select_for_update().get(user=request.user)

                if profile.balance < amount:
                    return Response({"success": False, "message": "Insufficient balance."}, status=400)

                # উইথড্র রিকোয়েস্ট সেভ করা
                withdraw = serializer.save(
                    user=request.user,
                    fee=fee,
                    final_amount=final_amount
                )

                # সাথে সাথে ইউজার ব্যালেন্স থেকে পুরো টাকা কেটে নেওয়া
                profile.balance -= amount
                profile.save()

                return Response({
                    "success": True,
                    "message": "Withdrawal request submitted.",
                    "data": serializer.data
                }, status=status.HTTP_201_CREATED)

        except Exception as e:
            return Response({"success": False, "message": str(e)}, status=500)

    # --- ১. Approve Action (এটি আপনার কোডে ছিল না) ---
    @action(detail=True, methods=['post'])
    def approve(self, request, pk=None):
        try:
            with transaction.atomic():
                withdraw = self.get_object()
                if withdraw.status != 'pending':
                    return Response({"success": False, "message": "This request is already processed."}, status=400)

                withdraw.status = 'approved'
                withdraw.save()

            return Response({"success": True, "message": "Withdrawal approved successfully."}, status=200)
        except Exception as e:
            return Response({"success": False, "message": str(e)}, status=500)

    # --- ২. Reject Action ---
    @action(detail=True, methods=['post'])
    def reject(self, request, pk=None):
        try:
            with transaction.atomic():
                withdraw = self.get_object()
                if withdraw.status != 'pending':
                    return Response({"success": False, "message": "Already processed"}, status=400)

                withdraw.status = 'rejected'
                withdraw.save()
                
                # রিজেক্ট করলে ইউজারের টাকা ফেরত দেওয়া (Refund)
                profile = Profile.objects.select_for_update().get(user=withdraw.user)
                profile.balance += withdraw.amount
                profile.save()

            return Response({"success": True, "message": "Withdraw rejected and balance refunded."}, status=200)
        except Exception as e:
            return Response({"success": False, "message": str(e)}, status=500)