import logging
from rest_framework import viewsets
import stripe
from api.producers_api.orders.filters.filters import OrderFilter
from api.producers_api.orders.models import Order
from api.producers_api.orders.serializers.order import OrderSerializer
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated,IsAdminUser
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from django.utils import timezone


from django.shortcuts import render, get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from drf_yasg.utils import swagger_auto_schema
from django.db.models import Q
from producers_products_variants.models.products_vairants import ProductsVariants
from producers_products.serializers.producers_products_serializer import ProducersProductsSerializer


class OrderViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    permission_classes = [IsAuthenticated]
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = OrderFilter
    search_fields = [
        'id', 
        'status',
        'tracking_number', 
        'customer__email',
        'items__product_variant__product__name',
        'coupon__code'
    ]

    
    def get_queryset(self):
        queryset = (Order.objects.prefetch_related('items__product_variant')
                   .select_related('coupon', 'shipping_method', 'payments', 'shipping_address', 'created_by')
                   .order_by('-id'))
        
        user = self.request.user
        if user.role == 'admin':
            return queryset
        else:
            # Filter orders where user is either the customer OR created the products
            return queryset.filter(
                Q(customer=user) | Q(items__product_variant__product__created_by=user)
            ).distinct()
    
    @action(detail=False, methods=['get'], url_path='me', url_name='my-orders')
    def my_orders(self, request):
        if not request.user.is_authenticated:
            return Response(
                {"detail": "Authentication credentials were not provided."},
                status=status.HTTP_401_UNAUTHORIZED
            )
        orders = Order.objects.filter(customer=request.user)
        serializer = self.get_serializer(orders, many=True)
        return Response(serializer.data)

    def perform_create(self, serializer):
        # Additional logic before saving the order, if needed
        serializer.save(created_by=self.request.user)




class ProductDetailByVariantAPIView(APIView):
    @swagger_auto_schema(
        operation_description="Get product details by product_variant ID",
        responses={
            200: ProducersProductsSerializer,
            404: "Product or Variant not found"
        }
    )
    def get(self, request, variant_id):
        variant = get_object_or_404(ProductsVariants.objects.select_related('product'), pk=variant_id)
        product = variant.product
        serializer = ProducersProductsSerializer(product, context={'request': request})
        return Response(serializer.data, status=status.HTTP_200_OK)
    




stripe.api_key = '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'

logger = logging.getLogger(__name__)

class CreateProductCheckoutSessionView(APIView):
    permission_classes = [IsAuthenticated]
    
    @swagger_auto_schema(request_body=OrderSerializer)
    def post(self, request):
        try:
            serializer = OrderSerializer(data=request.data, context={'request': request})
            if not serializer.is_valid():
                return Response(
                    serializer.errors,
                    status=status.HTTP_400_BAD_REQUEST
                )
            
            order = serializer.save(created_by=request.user, status='pending')
            
            product_name = f"Order #{order.id}"
            amount = int(order.final_total * 100)  # Convert to cents
            currency = request.data.get('currency', 'usd')

            if amount <= 0:
                order.delete()  
                return Response(
                    {'error': 'Valid order amount is required'},
                    status=status.HTTP_400_BAD_REQUEST
                )

            checkout_session = stripe.checkout.Session.create(
                payment_method_types=['card'],
                line_items=[{
                    'price_data': {
                        'currency': currency,
                        'product_data': {'name': product_name},
                        'unit_amount': amount,
                    },
                    'quantity': 1,
                }],
                mode='payment',
                success_url=f'https://api.panjabiz.com/api/order/payment-success?session_id={{CHECKOUT_SESSION_ID}}',
                cancel_url=f'https://panjabiz.com/cancel?order_id={order.id}',
                metadata={'order_id': str(order.id)},
            )

            order.tracking_number = checkout_session.id
            order.save()
           
            return Response({
                'url': checkout_session.url,
                'order_id': order.id,
                'session_id': checkout_session.id
            }, status=status.HTTP_201_CREATED)

        except Exception as e:
            logger.error(f"Checkout error: {str(e)}")
            return Response(
                {'error': 'Failed to create checkout session', 'detail': str(e)},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )


class PaymentSuccessView(APIView):
    """
    Auto-verify payment and redirect to frontend
    GET /api/orders/payment-success?session_id=xxx
    This is called automatically by Stripe after successful payment
    """
    permission_classes = []  
    
    def get(self, request):
        from django.shortcuts import redirect
        
        session_id = request.query_params.get('session_id')
        
        if not session_id:
            return redirect(f'https://panjabiz.com/payment-error?error=missing_session')
        
        try:
            session = stripe.checkout.Session.retrieve(session_id)
            order_id = session.metadata.get('order_id')
            
            if not order_id:
                return redirect(f'https://panjabiz.com/payment-error?error=invalid_order')

            order = Order.objects.get(id=order_id)
            
            if session.payment_status == 'paid':
                if order.status != 'completed':
                    order.status = 'paid'
                    order.save()
                    
                    if hasattr(order, 'payments') and order.payments:
                        order.payments.status = 'paid'
                        order.payments.paid_at = timezone.now()
                        order.payments.save()
                    
                    logger.info(f"Order {order_id} automatically marked as paid")
                
                return redirect(f'https://panjabiz.com/order-success?order_id={order.id}&status=paid')
            
            else:
                logger.warning(f"Payment not completed for order {order_id}, status: {session.payment_status}")
                return redirect(f'https://panjabiz.com/payment-pending?order_id={order.id}&status={session.payment_status}')
                
        except stripe.error.StripeError as e:
            logger.error(f"Stripe error during auto-verification: {str(e)}")
            return redirect(f'https://panjabiz.com/payment-error?error=stripe_error')
            
        except Order.DoesNotExist:
            logger.error(f"Order {order_id} not found during auto-verification")
            return redirect(f'https://your-frontend.com/payment-error?error=order_not_found')
            
        except Exception as e:
            logger.error(f"Auto-verification error: {str(e)}")
            return redirect(f'https://panjabiz.com/payment-error?error=unknown')
