from rest_framework import viewsets, permissions, status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Order
from .serializers import OrderSerializer
from .services.order_query_service import OrderQueryService


class OrderViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer


@api_view(['GET'])
@permission_classes([permissions.IsAuthenticated])
def get_user_orders(request):
    """
    Get all orders for the authenticated user.
    """
    user = request.user
    orders = Order.objects.filter(user=user).order_by('-created_at')
    serializer = OrderSerializer(orders, many=True)
    return Response({
        'success': True,
        'data': serializer.data,
        'count': orders.count(),
    }, status=status.HTTP_200_OK)


@api_view(['GET'])
@permission_classes([permissions.IsAuthenticated])
def get_user_order_detail(request, order_id):
    """Get a single order for the authenticated user."""
    order = Order.objects.filter(user=request.user, id=order_id).first()
    if not order:
        return Response({
            'success': False,
            'message': 'Order not found',
        }, status=status.HTTP_404_NOT_FOUND)

    serializer = OrderSerializer(order)
    return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)


# ────────────────────────────────────────────────────────────────────────────
# USER ORDER CENTER ENDPOINTS
# ────────────────────────────────────────────────────────────────────────────

class UserOrderCenterListView(APIView):
    """
    Enhanced order list with tabs and filtering for the order center dashboard.
    
    Query parameters:
    - tab: 'all', 'bundle', 'retail', 'pending', 'shipped', 'delivered', 'cancelled'
    - status: Order status filter
    - page: Page number (default 1)
    - page_size: Results per page (default 20)
    """
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        tab = request.query_params.get('tab', 'all')
        status_filter = request.query_params.get('status')
        page = int(request.query_params.get('page', 1))
        page_size = int(request.query_params.get('page_size', 20))
        
        result = OrderQueryService.get_user_orders(
            request.user,
            tab=tab if tab != 'all' else None,
            status_filter=status_filter,
            page=page,
            page_size=page_size,
        )
        
        return Response({'success': True, 'data': result}, status=status.HTTP_200_OK)


class UserOrderDetailView(APIView):
    """
    Comprehensive order detail with shipment tracking, wallet breakdown, and distribution info.
    """
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request, order_id):
        result = OrderQueryService.get_order_detail(request.user, order_id)
        
        if not result:
            return Response({
                'success': False,
                'error': 'Order not found',
            }, status=status.HTTP_404_NOT_FOUND)
        
        return Response({'success': True, 'data': result}, status=status.HTTP_200_OK)


class UserOrderShipmentTrackingView(APIView):
    """Get shipment tracking timeline for an order."""
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request, order_id):
        # Verify order belongs to user
        order = Order.objects.filter(id=order_id, user=request.user).first()
        if not order:
            return Response({
                'success': False,
                'error': 'Order not found',
            }, status=status.HTTP_404_NOT_FOUND)
        
        result = OrderQueryService.get_order_shipment_tracking(order_id)
        
        return Response({'success': True, 'data': result}, status=status.HTTP_200_OK)


class UserOrderWalletBreakdownView(APIView):
    """Get detailed wallet usage breakdown for an order."""
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request, order_id):
        # Verify order belongs to user
        order = Order.objects.filter(id=order_id, user=request.user).first()
        if not order:
            return Response({
                'success': False,
                'error': 'Order not found',
            }, status=status.HTTP_404_NOT_FOUND)
        
        result = OrderQueryService.get_order_wallet_breakdown(order_id)
        
        return Response({'success': True, 'data': result}, status=status.HTTP_200_OK)


class UserOrderStatsView(APIView):
    """Get user order statistics for dashboard."""
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        result = OrderQueryService.get_user_order_stats(request.user)
        
        return Response({'success': True, 'data': result}, status=status.HTTP_200_OK)
