from rest_framework import generics, filters, status, viewsets
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend
from django.utils.dateparse import parse_date
from django.http import Http404
from .models import TransactionReceipt, ReceiptConfig
from .serializers import (
    TransactionReceiptSerializer,
    TransactionReceiptCreateSerializer,
    ReceiptConfigSerializer
)
import logging

logger = logging.getLogger(__name__)


class TransactionReceiptListView(generics.ListCreateAPIView):
    """
    LIST + CREATE receipts:
    GET  /receipts/   → list
    POST /receipts/   → create
    """
    queryset = TransactionReceipt.objects.all().order_by('-created_at')
    permission_classes = [IsAuthenticated]
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    search_fields = ['member_number', 'reference_number', 'receipt_number']
    filterset_fields = ['transaction_type', 'member_number']

    # Serializer switching: GET uses full, POST uses create serializer
    def get_serializer_class(self):
        if self.request.method == "POST":
            return TransactionReceiptCreateSerializer
        return TransactionReceiptSerializer

    def get_queryset(self):
        queryset = super().get_queryset()

        # Organization filtering
        if hasattr(self.request.user, "user_organisation_branch"):
            try:
                org_id = self.request.user.user_organisation_branch.branch_organisation.id
                queryset = queryset.filter(
                    generated_by__user_organisation_branch__branch_organisation_id=org_id
                )
            except Exception:
                queryset = queryset.none()

        # Date range filters
        start_date = self.request.query_params.get('start_date')
        end_date = self.request.query_params.get('end_date')

        if start_date:
            start_date = parse_date(start_date)
            if start_date:
                queryset = queryset.filter(created_at__date__gte=start_date)

        if end_date:
            end_date = parse_date(end_date)
            if end_date:
                queryset = queryset.filter(created_at__date__lte=end_date)

        return queryset

    def create(self, request, *args, **kwargs):
        serializer = TransactionReceiptCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        # Assign current user
        serializer.validated_data["generated_by"] = request.user

        receipt = serializer.save()

        # Return full receipt data
        response_serializer = TransactionReceiptSerializer(receipt)
        return Response(response_serializer.data, status=status.HTTP_201_CREATED)



class TransactionReceiptDetailView(generics.RetrieveDestroyAPIView):
    queryset = TransactionReceipt.objects.all()
    serializer_class = TransactionReceiptSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        queryset = super().get_queryset()

        if hasattr(self.request.user, "user_organisation_branch"):
            try:
                org_id = self.request.user.user_organisation_branch.branch_organisation.id
                queryset = queryset.filter(
                    generated_by__user_organisation_branch__branch_organisation_id=org_id
                )
            except Exception:
                queryset = queryset.none()

        return queryset

    def destroy(self, request, *args, **kwargs):
        try:
            instance = self.get_object()
            receipt_number = instance.receipt_number
            self.perform_destroy(instance)
            return Response(
                {"message": f"Receipt {receipt_number} deleted successfully"},
                status=status.HTTP_200_OK
            )
        except Http404:
            return Response(
                {"error": "Receipt not found or no permission"},
                status=status.HTTP_404_NOT_FOUND
            )



class TransactionReceiptByMemberView(generics.ListAPIView):
    serializer_class = TransactionReceiptSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        member_number = self.kwargs.get('member_number')
        queryset = TransactionReceipt.objects.filter(member_number=member_number)

        if hasattr(self.request.user, "user_organisation_branch"):
            try:
                org_id = self.request.user.user_organisation_branch.branch_organisation.id
                queryset = queryset.filter(
                    generated_by__user_organisation_branch__branch_organisation_id=org_id
                )
            except Exception:
                queryset = queryset.none()

        return queryset.order_by('-created_at')



class TransactionReceiptDetailByNumberView(generics.RetrieveDestroyAPIView):
    queryset = TransactionReceipt.objects.all()
    serializer_class = TransactionReceiptSerializer
    permission_classes = [IsAuthenticated]
    lookup_field = 'receipt_number'

    def get_queryset(self):
        queryset = super().get_queryset()

        if hasattr(self.request.user, "user_organisation_branch"):
            try:
                org_id = self.request.user.user_organisation_branch.branch_organisation.id
                queryset = queryset.filter(
                    generated_by__user_organisation_branch__branch_organisation_id=org_id
                )
            except Exception:
                queryset = queryset.none()

        return queryset



class ReceiptConfigViewSet(viewsets.ModelViewSet):
    queryset = ReceiptConfig.objects.all()
    serializer_class = ReceiptConfigSerializer
    permission_classes = [IsAuthenticated]

    @action(detail=True, methods=['post'], url_path='increment')
    def increment(self, request, pk=None):
        try:
            config = self.get_object()
            config.current_number += config.increment_by
            config.save()
            serializer = self.get_serializer(config)
            return Response({
                'message': 'Receipt number incremented',
                'current_number': config.current_number,
                'next_receipt_number': config.generate_receipt_number(),
                'data': serializer.data
            })
        except Exception as e:
            return Response(
                {'error': f'Failed to increment: {str(e)}'},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )

    @action(detail=False, methods=['get'], url_path='active')
    def active_configs(self, request):
        queryset = self.get_queryset().filter(is_active=True)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    @action(detail=True, methods=['post'], url_path='reset')
    def reset_sequence(self, request, pk=None):
        try:
            config = self.get_object()
            config.current_number = config.start_number
            config.save()
            serializer = self.get_serializer(config)
            return Response({
                'message': 'Sequence reset',
                'current_number': config.current_number,
                'data': serializer.data
            })
        except Exception as e:
            return Response(
                {'error': f'Failed to reset: {str(e)}'},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )
