from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from django.db.models import Count, Q
from django.utils import timezone
from datetime import timedelta

from .models import (
    AppUser,
    Consultation,
    FeedPost,
    KnowledgeTopic,
    Notification,
    PeriodLog,
)


def setup_admin_groups():
    """Setup role-based admin permission groups."""
    
    # Get all content types
    user_ct = ContentType.objects.get_for_model(AppUser)
    consultation_ct = ContentType.objects.get_for_model(Consultation)
    period_ct = ContentType.objects.get_for_model(PeriodLog)
    feed_ct = ContentType.objects.get_for_model(FeedPost)
    topic_ct = ContentType.objects.get_for_model(KnowledgeTopic)
    notification_ct = ContentType.objects.get_for_model(Notification)

    # Super Admin Group - Full access
    super_admin_group, _ = Group.objects.get_or_create(name='Super Admin')
    super_admin_perms = Permission.objects.filter(
        content_type__in=[
            user_ct,
            consultation_ct,
            period_ct,
            feed_ct,
            topic_ct,
            notification_ct,
        ]
    )
    super_admin_group.permissions.set(super_admin_perms)

    # Content Admin Group - Manage knowledge content
    content_admin_group, _ = Group.objects.get_or_create(name='Content Admin')
    content_perms = Permission.objects.filter(
        content_type=topic_ct,
    ) | Permission.objects.filter(codename__in=['add_knowledgecontent', 'change_knowledgecontent', 'delete_knowledgecontent', 'view_knowledgecontent'])
    content_admin_group.permissions.set(content_perms)

    # Support Admin Group - Manage consultations and user support
    support_admin_group, _ = Group.objects.get_or_create(name='Support Admin')
    support_perms = Permission.objects.filter(
        content_type__in=[consultation_ct, notification_ct]
    ) | Permission.objects.filter(content_type=user_ct, codename__in=['view_appuser', 'change_appuser'])
    support_admin_group.permissions.set(support_perms)

    # Doctor Manager Group - Approve/reject doctors
    doctor_manager_group, _ = Group.objects.get_or_create(name='Doctor Manager')
    doctor_perms = Permission.objects.filter(
        content_type=user_ct
    )
    doctor_manager_group.permissions.set(doctor_perms)

    return {
        'super_admin': super_admin_group,
        'content_admin': content_admin_group,
        'support_admin': support_admin_group,
        'doctor_manager': doctor_manager_group,
    }


def get_admin_dashboard_stats():
    """Fetch dashboard statistics for admin home."""
    now = timezone.now()
    last_7_days = now - timedelta(days=7)
    last_30_days = now - timedelta(days=30)

    total_users = AppUser.objects.filter(role='user').count()
    total_doctors = AppUser.objects.filter(role='doctor').count()
    active_doctors = AppUser.objects.filter(role='doctor', status='active').count()
    inactive_doctors = AppUser.objects.filter(role='doctor', status='inactive').count()

    new_users_7d = AppUser.objects.filter(
        role='user', created_at__gte=last_7_days
    ).count()
    new_consultations_7d = Consultation.objects.filter(
        created_at__gte=last_7_days
    ).count()
    completed_consultations = Consultation.objects.filter(
        status='completed'
    ).count()

    pregnant_users = AppUser.objects.filter(is_pregnant=True).count()
    period_logs_30d = PeriodLog.objects.filter(
        start_date__gte=last_30_days.date()
    ).count()

    feed_posts_30d = FeedPost.objects.filter(
        created_at__gte=last_30_days
    ).count()

    pending_doctor_approvals = AppUser.objects.filter(
        role='doctor', status='inactive'
    ).count()

    unread_notifications = Notification.objects.filter(
        is_read=False
    ).count()

    return {
        'total_users': total_users,
        'total_doctors': total_doctors,
        'active_doctors': active_doctors,
        'inactive_doctors': inactive_doctors,
        'new_users_7d': new_users_7d,
        'new_consultations_7d': new_consultations_7d,
        'completed_consultations': completed_consultations,
        'pregnant_users': pregnant_users,
        'period_logs_30d': period_logs_30d,
        'feed_posts_30d': feed_posts_30d,
        'pending_doctor_approvals': pending_doctor_approvals,
        'unread_notifications': unread_notifications,
        'timestamp': now.isoformat(),
    }


def bulk_approve_doctors(doctor_ids):
    """Approve multiple doctors at once."""
    updated = AppUser.objects.filter(
        id__in=doctor_ids, role='doctor'
    ).update(status='active')
    return updated


def bulk_reject_doctors(doctor_ids):
    """Reject/deactivate multiple doctors at once."""
    updated = AppUser.objects.filter(
        id__in=doctor_ids, role='doctor'
    ).update(status='inactive')
    return updated


def bulk_ban_users(user_ids):
    """Ban multiple users at once."""
    updated = AppUser.objects.filter(
        id__in=user_ids
    ).update(status='banned')
    return updated


def bulk_unban_users(user_ids):
    """Unban multiple users at once."""
    updated = AppUser.objects.filter(
        id__in=user_ids
    ).update(status='active')
    return updated
