# apps/feature/views/deposit.py
from rest_framework import status, viewsets
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 Deposit
from apps.profiles.models import Profile
from .serializers import DepositSerializer

class DepositViewSet(BaseViewSet):
    queryset = Deposit.objects.all().order_by('-created_at')
    serializer_class = DepositSerializer

    permission_app_name = 'deposit'
    permission_model_name = 'deposit'
    view_permissions = ["list", "create", "update", "toggle_status", "partial_update", "retrieve", "destroy",'approve','reject']  

    search_fields = ['transaction_id']

    def get_queryset(self):
        user = self.request.user
        if user.is_superuser or getattr(user, 'role', None) == 'admin':
            return Deposit.objects.all().order_by('-created_at')
        return Deposit.objects.filter(user=user).order_by('-created_at')

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

    @action(detail=True, methods=['get','post'], url_path='approve')
    def approve(self, request, pk=None):
        if not (request.user.is_superuser or getattr(request.user, 'role', None) == 'admin'):
            return Response({"success": False, "message": "Access denied"}, status=status.HTTP_403_FORBIDDEN)

        try:
            deposit = Deposit.objects.get(pk=pk, status='pending')
            
            conversion_rate = Decimal('125.00')
            amount_in_usd = deposit.amount / conversion_rate

            with transaction.atomic():
                deposit.status = 'approved'
                deposit.save()

                profile = Profile.objects.get(user=deposit.user)
                profile.balance += amount_in_usd
                profile.save()

            return Response({
                "success": True, 
                "message": f"Successfully approved. ${amount_in_usd} USD added to balance."
            }, status=status.HTTP_200_OK)

        except Deposit.DoesNotExist:
            return Response({"success": False, "message": "Pending deposit not found"}, status=status.HTTP_404_NOT_FOUND)

    @action(detail=True, methods=['get','post'], url_path='reject')
    def reject(self, request, pk=None):
       
        if not (request.user.is_superuser or getattr(request.user, 'role', None) == 'admin'):
            return Response({"success": False, "message": "Access denied"}, status=status.HTTP_403_FORBIDDEN)
            
        try:
            deposit = Deposit.objects.get(pk=pk, status='pending')
            reason = request.data.get('note', 'Invalid Transaction ID or Amount')
            
            deposit.status = 'rejected'
            deposit.admin_note = reason
            deposit.save()
            
            return Response({
                "success": True, 
                "message": "Deposit request rejected."
            }, status=status.HTTP_200_OK)
        except Deposit.DoesNotExist:
            return Response({"success": False, "message": "Pending deposit not found"}, status=status.HTTP_404_NOT_FOUND)