"""
Admin Marketplace Analytics API.
Provides platform-wide stats for orders, revenue, products, vendors, categories.
"""
from datetime import timedelta
from decimal import Decimal

from django.db import models as db_models
from django.utils import timezone
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated, IsAdminUser


class AdminMarketplaceAnalyticsView(APIView):
    """
    GET /api/v1/admin/marketplace-analytics/
    Platform-wide analytics for the admin dashboard.
    Query params:
      period: 7d | 30d | 90d | 365d (default: 30d)
    """
    permission_classes = [IsAuthenticated, IsAdminUser]

    def get(self, request):
        period = request.query_params.get('period', '30d')
        DAYS = {'7d': 7, '30d': 30, '90d': 90, '365d': 365}
        days = DAYS.get(period, 30)
        since = timezone.now() - timedelta(days=days)

        try:
            from apps.business.orders.models import Order
            from apps.business.marketplace.models_part2 import OrderItem, ShoppingCart
            from apps.business.marketplace.models_part3 import ProductReview
        except ImportError as exc:
            return Response({'detail': f'Import error: {exc}'}, status=500)

        # ── Order stats ────────────────────────────────────────────────────
        orders_qs = Order.objects.filter(
            order_type='RETAIL',
            created_at__gte=since,
        )
        total_orders = orders_qs.count()
        total_revenue = orders_qs.filter(status='COMPLETED').aggregate(
            r=db_models.Sum('amount')
        )['r'] or Decimal('0')
        pending_orders = orders_qs.filter(status__in=['PENDING', 'CONFIRMED']).count()
        delivered_orders = orders_qs.filter(status='COMPLETED').count()
        cancelled_orders = orders_qs.filter(status='CANCELLED').count()

        # ── Monthly trend (last 6 months) ──────────────────────────────────
        monthly_data = []
        for i in range(5, -1, -1):
            month_start = (timezone.now().replace(day=1, hour=0, minute=0, second=0, microsecond=0)
                           - timedelta(days=30 * i))
            month_end = month_start + timedelta(days=32)
            month_end = month_end.replace(day=1)
            month_orders = Order.objects.filter(
                order_type='RETAIL',
                created_at__gte=month_start,
                created_at__lt=month_end,
            )
            monthly_data.append({
                'month': month_start.strftime('%b %Y'),
                'orders': month_orders.count(),
                'revenue': float(
                    month_orders.filter(status='COMPLETED').aggregate(
                        r=db_models.Sum('amount')
                    )['r'] or 0
                ),
            })

        # ── Top products by revenue ─────────────────────────────────────────
        top_products = []
        try:
            items_qs = OrderItem.objects.all()
            if hasattr(OrderItem, 'created_at'):
                items_qs = items_qs.filter(created_at__gte=since)

            items_agg = (
                items_qs.values('product_id')
                .annotate(
                    total_revenue=db_models.Sum(
                        db_models.ExpressionWrapper(
                            db_models.F('unit_price') * db_models.F('quantity'),
                            output_field=db_models.DecimalField()
                        )
                    ),
                    total_qty=db_models.Sum('quantity'),
                )
                .order_by('-total_revenue')[:10]
            )
            from apps.business.products.models import Product
            for row in items_agg:
                try:
                    p = Product.objects.get(id=row['product_id'])
                    top_products.append({
                        'product_id': str(row['product_id']),
                        'name': p.name,
                        'revenue': float(row['total_revenue'] or 0),
                        'qty': row['total_qty'] or 0,
                    })
                except Product.DoesNotExist:
                    pass
        except Exception:
            pass

        # ── Review stats ────────────────────────────────────────────────────
        reviews_in_period = ProductReview.objects.filter(created_at__gte=since).count()
        avg_rating = ProductReview.objects.filter(created_at__gte=since).aggregate(
            avg=db_models.Avg('rating')
        )['avg']

        # ── Cart abandonment (carts with items but no order in period) ──────
        try:
            carts_with_items = ShoppingCart.objects.filter(
                updated_at__gte=since,
            ).exclude(items__isnull=True).count()
        except Exception:
            carts_with_items = 0

        return Response({
            'period': period,
            'orders': {
                'total': total_orders,
                'revenue': float(total_revenue),
                'pending': pending_orders,
                'delivered': delivered_orders,
                'cancelled': cancelled_orders,
            },
            'monthly_trend': monthly_data,
            'top_products': top_products,
            'reviews': {
                'count': reviews_in_period,
                'avg_rating': round(float(avg_rating), 2) if avg_rating else None,
            },
            'carts_with_items': carts_with_items,
        })
