from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from django.db.models import Count, Avg, Q
from django.utils import timezone
from datetime import timedelta
from .models import PlaceView, SearchQuery
from places.models import Place
from bookings.models import Booking
from reviews.models import Review
from common.permissions import IsPlaceAdmin


class AnalyticsViewSet(viewsets.ViewSet):
    """Analytics ViewSet"""
    permission_classes = [IsAuthenticated, IsPlaceAdmin]
    
    @action(detail=False, methods=['get'])
    def dashboard_stats(self, request):
        """Get dashboard statistics"""
        user = request.user
        
        # Get user's place
        if not hasattr(user, 'place_admin_profile'):
            return Response(
                {'error': 'No place associated with this account'},
                status=status.HTTP_400_BAD_REQUEST
            )
        
        place = user.place_admin_profile.place
        
        # Today's bookings
        today = timezone.now().date()
        today_bookings = Booking.objects.filter(place=place, date=today).count()
        
        # Pending bookings
        pending_bookings = Booking.objects.filter(
            place=place,
            status='pending'
        ).count()
        
        # Total reviews
        total_reviews = Review.objects.filter(place=place, is_active=True).count()
        
        # Average rating
        avg_rating = Review.objects.filter(
            place=place,
            is_active=True
        ).aggregate(avg=Avg('rating'))['avg'] or 0
        
        # Active offers
        active_offers = place.offers.filter(is_active=True).count()
        
        # Views (last 7 days)
        week_ago = timezone.now() - timedelta(days=7)
        views_count = PlaceView.objects.filter(
            place=place,
            created_at__gte=week_ago
        ).count()
        
        return Response({
            'today_bookings': today_bookings,
            'pending_bookings': pending_bookings,
            'total_reviews': total_reviews,
            'avg_rating': round(avg_rating, 2),
            'active_offers': active_offers,
            'views_last_7_days': views_count,
        })
    
    @action(detail=False, methods=['get'])
    def bookings_chart(self, request):
        """Get bookings chart data"""
        user = request.user
        place = user.place_admin_profile.place
        
        # Last 7 days
        days = []
        bookings_count = []
        
        for i in range(6, -1, -1):
            date = timezone.now().date() - timedelta(days=i)
            days.append(date.strftime('%Y-%m-%d'))
            count = Booking.objects.filter(place=place, date=date).count()
            bookings_count.append(count)
        
        return Response({
            'days': days,
            'bookings': bookings_count,
        })
    
    @action(detail=False, methods=['get'])
    def reviews_distribution(self, request):
        """Get reviews rating distribution"""
        user = request.user
        place = user.place_admin_profile.place
        
        distribution = {}
        for rating in range(1, 6):
            count = Review.objects.filter(
                place=place,
                rating=rating,
                is_active=True
            ).count()
            distribution[rating] = count
        
        return Response(distribution)
