"""
Custom Admin Dashboard with Statistics and Graphs
"""
from django.contrib import admin
from django.shortcuts import render
from django.contrib.admin.views.decorators import staff_member_required
from django.db.models import Count, Avg, Q
from django.utils import timezone
from datetime import timedelta
from django.contrib.auth import get_user_model

from .models import Business, Review, ChatRoom, ChatMessage, Notification, Category
from authentication.models import User


@staff_member_required
def admin_dashboard(request):
    """
    Custom admin dashboard with statistics and graphs
    """
    # Date ranges
    today = timezone.now().date()
    last_30_days = today - timedelta(days=30)
    last_7_days = today - timedelta(days=7)

    # ==================== Overall Statistics ====================
    total_users = User.objects.count()
    total_businesses = Business.objects.count()
    total_reviews = Review.objects.count()
    total_chats = ChatRoom.objects.count()
    active_businesses = Business.objects.filter(is_active=True).count()
    verified_businesses = Business.objects.filter(is_verified=True).count()

    # New registrations (last 30 days)
    new_users_30d = User.objects.filter(date_joined__gte=last_30_days).count()
    new_businesses_30d = Business.objects.filter(created_at__gte=last_30_days).count()
    new_reviews_30d = Review.objects.filter(created_at__gte=last_30_days).count()

    # Average ratings
    avg_rating = Review.objects.aggregate(avg=Avg('rating'))['avg'] or 0

    # ==================== Category Statistics ====================
    # Business -> SubCategory -> Category, so we count via sub_categories__businesses
    category_stats = Category.objects.annotate(
        business_count=Count('sub_categories__businesses', distinct=True)
    ).order_by('-business_count')[:10]

    # ==================== Top Rated Businesses ====================
    top_businesses = Business.objects.filter(
        total_reviews__gte=3
    ).order_by('-average_rating')[:5]

    # ==================== Recent Activities ====================
    recent_businesses = Business.objects.order_by('-created_at')[:5]
    recent_reviews = Review.objects.select_related('business', 'user').order_by('-created_at')[:5]
    recent_users = User.objects.order_by('-date_joined')[:5]

    # ==================== Unread Notifications ====================
    unread_notifications = Notification.objects.filter(is_read=False).count()

    # ==================== Active Chats ====================
    active_chats = ChatRoom.objects.filter(
        Q(unread_count_user__gt=0) | Q(unread_count_business__gt=0)
    ).count()

    # ==================== Daily Statistics (Last 7 Days) ====================
    daily_stats = []
    for i in range(6, -1, -1):
        date = today - timedelta(days=i)
        users_count = User.objects.filter(date_joined__date=date).count()
        businesses_count = Business.objects.filter(created_at__date=date).count()
        reviews_count = Review.objects.filter(created_at__date=date).count()

        daily_stats.append({
            'date': date.strftime('%b %d'),
            'users': users_count,
            'businesses': businesses_count,
            'reviews': reviews_count,
        })

    # ==================== Business Status Distribution ====================
    business_status = {
        'active': active_businesses,
        'inactive': total_businesses - active_businesses,
        'verified': verified_businesses,
        'unverified': total_businesses - verified_businesses,
    }

    # ==================== Rating Distribution ====================
    rating_distribution = []
    for rating in range(1, 6):
        count = Review.objects.filter(rating=rating).count()
        rating_distribution.append({
            'rating': rating,
            'count': count
        })

    context = {
        'title': 'Dashboard',
        'site_header': 'Discovr Admin',
        'site_title': 'Admin Dashboard',

        # Overall stats
        'total_users': total_users,
        'total_businesses': total_businesses,
        'total_reviews': total_reviews,
        'total_chats': total_chats,
        'active_businesses': active_businesses,
        'verified_businesses': verified_businesses,
        'avg_rating': round(avg_rating, 2),

        # 30-day stats
        'new_users_30d': new_users_30d,
        'new_businesses_30d': new_businesses_30d,
        'new_reviews_30d': new_reviews_30d,

        # Notifications and chats
        'unread_notifications': unread_notifications,
        'active_chats': active_chats,

        # Charts data
        'category_stats': category_stats,
        'daily_stats': daily_stats,
        'business_status': business_status,
        'rating_distribution': rating_distribution,

        # Recent activities
        'top_businesses': top_businesses,
        'recent_businesses': recent_businesses,
        'recent_reviews': recent_reviews,
        'recent_users': recent_users,
    }

    return render(request, 'admin/dashboard.html', context)
