from django.contrib import admin
from django.contrib.admin import ModelAdmin
from django.http import HttpResponse
from django.utils.html import format_html
from django.utils import timezone
from datetime import timedelta
import csv

from .models import (
    AdminAuditLog,
    AdminReport,
    AdminWorkflow,
    AppUser,
    Consultation,
    FeedPost,
    FeedPostComment,
    FeedPostLike,
    KnowledgeContent,
    KnowledgeTopic,
    Notification,
    PeriodLog,
    PregnancyTracking,
    UserFeedback,
    UserOnboarding,
    UserSetting,
)
from .admin_utils import (
    bulk_approve_doctors,
    bulk_reject_doctors,
    bulk_ban_users,
    bulk_unban_users,
    get_admin_dashboard_stats,
    setup_admin_groups,
)


# Custom admin site with enhanced dashboard
class NarinestAdminSite(admin.AdminSite):
    site_header = 'Narinest Admin Control Panel'
    site_title = 'Narinest Admin'
    index_title = 'Dashboard'
    
    def index(self, request, extra_context=None):
        """Custom dashboard with stats."""
        stats = get_admin_dashboard_stats()
        extra_context = extra_context or {}
        extra_context['stats'] = stats
        extra_context['admin_groups'] = ['Super Admin', 'Content Admin', 'Support Admin', 'Doctor Manager']
        return super().index(request, extra_context)


# Replace default admin site BEFORE any @admin.register decorators
_custom_site = NarinestAdminSite()
admin.site = _custom_site
# Also patch the apps registry so Django's autodiscover uses our site
from django.contrib.admin import apps as _admin_apps  # noqa: E402
_admin_apps.AdminConfig.default_auto_field  # touch to ensure loaded


@admin.register(AppUser)
class AppUserAdmin(ModelAdmin):
    list_display = ('id', 'name', 'email', 'role', 'status_badge', 'is_pregnant', 'created_at')
    list_filter = ('role', 'status', 'is_pregnant')
    search_fields = ('name', 'email', 'phone')
    list_per_page = 50
    actions = [
        'approve_doctors',
        'reject_doctors',
        'ban_users',
        'unban_users',
        'export_users_csv',
    ]

    def status_badge(self, obj):
        """Display status as colored badge."""
        colors = {
            'active': '#28a745',
            'inactive': '#ffc107',
            'banned': '#dc3545',
        }
        color = colors.get(obj.status, '#6c757d')
        return format_html(
            '<span style="background-color: {}; color: white; padding: 3px 8px; border-radius: 3px;">{}</span>',
            color,
            obj.get_status_display() if hasattr(obj, 'get_status_display') else obj.status,
        )
    status_badge.short_description = 'Status'

    def approve_doctors(self, request, queryset):
        """Bulk approve doctor accounts."""
        doctors = queryset.filter(role='doctor')
        updated = bulk_approve_doctors(list(doctors.values_list('id', flat=True)))
        self.message_user(request, f'{updated} doctors approved.')
    approve_doctors.short_description = 'Approve selected doctors'

    def reject_doctors(self, request, queryset):
        """Bulk reject doctor accounts."""
        doctors = queryset.filter(role='doctor')
        updated = bulk_reject_doctors(list(doctors.values_list('id', flat=True)))
        self.message_user(request, f'{updated} doctors deactivated.')
    reject_doctors.short_description = 'Deactivate selected doctors'

    def ban_users(self, request, queryset):
        """Bulk ban users."""
        updated = bulk_ban_users(list(queryset.values_list('id', flat=True)))
        self.message_user(request, f'{updated} users banned.')
    ban_users.short_description = 'Ban selected users'

    def unban_users(self, request, queryset):
        """Bulk unban users."""
        updated = bulk_unban_users(list(queryset.values_list('id', flat=True)))
        self.message_user(request, f'{updated} users unbanned.')
    unban_users.short_description = 'Unban selected users'

    def export_users_csv(self, request, queryset):
        """Export selected users to CSV."""
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="users.csv"'
        writer = csv.writer(response)
        writer.writerow(['ID', 'Name', 'Email', 'Phone', 'Role', 'Status', 'Created'])
        for user in queryset:
            writer.writerow([
                user.id,
                user.name,
                user.email,
                user.phone or '',
                user.role,
                user.status,
                user.created_at,
            ])
        return response
    export_users_csv.short_description = 'Export selected to CSV'
@admin.register(UserOnboarding)
class UserOnboardingAdmin(ModelAdmin):
	list_display = ('id', 'user', 'is_married', 'first_period_age', 'is_planning_baby', 'updated_at')
	list_filter = ('is_married', 'is_planning_baby')
	search_fields = ('user__name', 'user__email')


@admin.register(PeriodLog)
class PeriodLogAdmin(ModelAdmin):
	list_display = ('id', 'user', 'start_date', 'end_date', 'flow_intensity', 'mood', 'created_at')
	list_filter = ('flow_intensity', 'mood')
	search_fields = ('user__name', 'user__email', 'notes')


@admin.register(PregnancyTracking)
class PregnancyTrackingAdmin(ModelAdmin):
	list_display = ('id', 'user', 'start_date', 'due_date', 'current_week', 'status', 'updated_at')
	list_filter = ('status',)
	search_fields = ('user__name', 'user__email')


@admin.register(Consultation)
class ConsultationAdmin(ModelAdmin):
	list_display = ('id', 'user', 'doctor', 'topic', 'appointment_time', 'status', 'updated_at')
	list_filter = ('status',)
	search_fields = ('topic', 'user__name', 'doctor__name', 'user__email', 'doctor__email')


@admin.register(FeedPost)
class FeedPostAdmin(ModelAdmin):
	list_display = ('id', 'user', 'content_preview', 'created_at')
	search_fields = ('content', 'user__name', 'user__email')

	@staticmethod
	def content_preview(obj):
		return (obj.content or '')[:80]


@admin.register(FeedPostLike)
class FeedPostLikeAdmin(ModelAdmin):
	list_display = ('id', 'post', 'user', 'created_at')
	search_fields = ('user__name', 'user__email')


@admin.register(FeedPostComment)
class FeedPostCommentAdmin(ModelAdmin):
	list_display = ('id', 'post', 'user', 'text_preview', 'created_at')
	search_fields = ('text', 'user__name', 'user__email')

	@staticmethod
	def text_preview(obj):
		return (obj.text or '')[:80]


@admin.register(Notification)
class NotificationAdmin(ModelAdmin):
	list_display = ('id', 'user', 'title', 'type', 'is_read', 'created_at')
	list_filter = ('type', 'is_read')
	search_fields = ('title', 'message', 'user__name', 'user__email')


@admin.register(UserSetting)
class UserSettingAdmin(ModelAdmin):
	list_display = ('id', 'user', 'language', 'notifications_enabled', 'updated_at')
	list_filter = ('language', 'notifications_enabled')
	search_fields = ('user__name', 'user__email')


@admin.register(KnowledgeTopic)
class KnowledgeTopicAdmin(ModelAdmin):
	list_display = ('id', 'title', 'status', 'created_by', 'updated_at')
	list_filter = ('status',)
	search_fields = ('title', 'description')


@admin.register(KnowledgeContent)
class KnowledgeContentAdmin(ModelAdmin):
	list_display = ('id', 'topic', 'title', 'status', 'updated_at')
	list_filter = ('status',)
	search_fields = ('title', 'content')


@admin.register(AdminAuditLog)
class AdminAuditLogAdmin(ModelAdmin):
	list_display = ('id', 'admin', 'action', 'target_user', 'created_at')
	search_fields = ('action', 'description', 'admin__name', 'target_user__name')


@admin.register(AdminReport)
class AdminReportAdmin(ModelAdmin):
	list_display = ('id', 'report_type', 'title', 'generated_by', 'generated_at')
	list_filter = ('report_type',)
	search_fields = ('title',)


@admin.register(UserFeedback)
class UserFeedbackAdmin(ModelAdmin):
	list_display = ('id', 'user', 'feedback_type', 'rating', 'status', 'created_at')
	list_filter = ('status', 'feedback_type')
	search_fields = ('message', 'user__name', 'user__email')

@admin.register(AdminWorkflow)
class AdminWorkflowAdmin(ModelAdmin):
    list_display = ('id', 'workflow_type', 'target_user', 'status', 'assigned_to', 'created_at')
    list_filter = ('workflow_type', 'status')
    search_fields = ('target_user__name', 'target_user__email', 'description')
    actions = ['mark_approved', 'mark_rejected', 'mark_in_review']
    list_per_page = 30

    def mark_approved(self, request, queryset):
        """Bulk approve workflows."""
        updated = queryset.update(status='approved', completed_at=timezone.now())
        self.message_user(request, f'{updated} workflows marked as approved.')
    mark_approved.short_description = 'Mark selected as approved'

    def mark_rejected(self, request, queryset):
        """Bulk reject workflows."""
        updated = queryset.update(status='rejected', completed_at=timezone.now())
        self.message_user(request, f'{updated} workflows marked as rejected.')
    mark_rejected.short_description = 'Mark selected as rejected'

    def mark_in_review(self, request, queryset):
        """Mark workflows as in review."""
        updated = queryset.update(status='in_review')
        self.message_user(request, f'{updated} workflows marked as in review.')
    mark_in_review.short_description = 'Mark selected as in review'