from rest_framework import generics
from rest_framework.response import Response
from rest_framework import status
from django.db import transaction
from .models import Balance
from .serializers import BalanceSerializer
import logging

logger = logging.getLogger(__name__)

class BalanceListCreateView(generics.ListCreateAPIView):
    queryset = Balance.objects.all()
    serializer_class = BalanceSerializer

    def create(self, request, *args, **kwargs):
        try:
            with transaction.atomic():
                serializer = self.get_serializer(data=request.data)
                serializer.is_valid(raise_exception=True)
                self.perform_create(serializer)
                return Response(serializer.data, status=status.HTTP_201_CREATED)
        except Exception as e:
            logger.error(f"Error creating balance record: {str(e)}")
            return Response(
                {"error": "Failed to create balance record"},
                status=status.HTTP_400_BAD_REQUEST
            )

class BalanceDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Balance.objects.all()
    serializer_class = BalanceSerializer
    lookup_field = 'pk'

    def update(self, request, *args, **kwargs):
        try:
            with transaction.atomic():
                instance = self.get_object()
                serializer = self.get_serializer(instance, data=request.data, partial=True)
                serializer.is_valid(raise_exception=True)
                self.perform_update(serializer)
                return Response(serializer.data)
        except Exception as e:
            logger.error(f"Error updating balance record: {str(e)}")
            return Response(
                {"error": "Failed to update balance record"},
                status=status.HTTP_400_BAD_REQUEST
            )

    def destroy(self, request, *args, **kwargs):
        try:
            with transaction.atomic():
                instance = self.get_object()
                self.perform_destroy(instance)
                return Response(status=status.HTTP_204_NO_CONTENT)
        except Exception as e:
            logger.error(f"Error deleting balance record: {str(e)}")
            return Response(
                {"error": "Failed to delete balance record"},
                status=status.HTTP_400_BAD_REQUEST
            ) 