from django.contrib import admin
from django.urls import path
from django.utils import timezone
from django.contrib import messages
from .models import (
    Service, Testimonial, BlogPost,
    CareerPosition, Enquiry, CareerApplication,
    CareRequest, CaregiverProfile, CareAssignment,
    SupportTicket, SupportMessage, StaffNotification,
    TelehealthBooking, TelehealthProvider, TelehealthAvailabilitySlot,
    PaymentTransaction, Patient, EMRNote, ActivityLog,
)

@admin.register(Service)
class ServiceAdmin(admin.ModelAdmin):
    list_display = ("title", "is_featured", "sort_order")
    list_editable = ("is_featured", "sort_order")
    prepopulated_fields = {"slug": ("title",)}

@admin.register(Testimonial)
class TestimonialAdmin(admin.ModelAdmin):
    list_display = ("name", "is_published", "created_at")
    list_filter = ("is_published",)

@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
    list_display = ("title", "is_published", "published_at")
    list_filter = ("is_published",)
    prepopulated_fields = {"slug": ("title",)}

@admin.register(CareerPosition)
class CareerPositionAdmin(admin.ModelAdmin):
    list_display = ("title", "role_type", "is_open")
    list_filter = ("role_type", "is_open")

@admin.register(Enquiry)
class EnquiryAdmin(admin.ModelAdmin):
    list_display = ("full_name", "enquiry_type", "phone", "is_resolved", "created_at")
    list_filter = ("enquiry_type", "is_resolved")
    search_fields = ("full_name", "phone", "email")

@admin.register(CareerApplication)
class CareerApplicationAdmin(admin.ModelAdmin):
    list_display = ("full_name", "email", "phone", "position", "created_at")


@admin.register(CareRequest)
class CareRequestAdmin(admin.ModelAdmin):
    list_display = ("created_at", "full_name", "request_type", "status", "phone", "location")
    list_filter = ("request_type", "status")
    search_fields = ("full_name", "phone", "email", "location", "care_needs")

@admin.register(TelehealthBooking)
class TelehealthBookingAdmin(admin.ModelAdmin):
    list_display = ("created_at", "full_name", "consultation_mode", "preferred_date", "preferred_time", "status", "phone")
    list_filter = ("consultation_mode", "status")
    search_fields = ("full_name", "phone", "email", "symptoms_or_reason")


@admin.register(CaregiverProfile)
class CaregiverProfileAdmin(admin.ModelAdmin):
    list_display = ("user", "phone", "location", "is_active")
    list_filter = ("is_active",)
    search_fields = ("user__username", "user__first_name", "user__last_name", "phone", "location", "skills")

@admin.register(CareAssignment)
class CareAssignmentAdmin(admin.ModelAdmin):
    list_display = ("created_at", "care_request", "caregiver", "status", "start_date", "end_date")
    list_filter = ("status",)
    search_fields = ("care_request__full_name", "caregiver__user__username")


from .models import (
    Service, Testimonial, BlogPost,
    CareerPosition, Enquiry, CareerApplication,
    CareRequest, CaregiverProfile, CareAssignment,
    SupportTicket, SupportMessage, StaffNotification,
    TelehealthBooking, TelehealthProvider, TelehealthAvailabilitySlot,
    PaymentTransaction, Patient, EMRNote, ActivityLog,
)

@admin.register(SupportTicket)
class SupportTicketAdmin(admin.ModelAdmin):
    list_display = ("public_id","full_name","subject","status","created_at")
    list_filter = ("status",)
    search_fields = ("public_id","full_name","phone","email","subject")

@admin.register(SupportMessage)
class SupportMessageAdmin(admin.ModelAdmin):
    list_display = ("ticket","sender","created_at")
    search_fields = ("ticket__public_id","message")


@admin.register(StaffNotification)
class StaffNotificationAdmin(admin.ModelAdmin):
    list_display = ("user","title","is_read","created_at")
    list_filter = ("is_read","kind")
    search_fields = ("title","body","user__username","user__email")


@admin.register(TelehealthProvider)
class TelehealthProviderAdmin(admin.ModelAdmin):
    list_display = ("full_name", "role", "specialization", "is_active", "sort_order")
    list_filter = ("role", "is_active")
    search_fields = ("full_name", "specialization")
    list_editable = ("is_active", "sort_order")

def get_urls(self):
    urls = super().get_urls()
    custom = [
        path(
            "generate-slots/<int:days>/",
            self.admin_site.admin_view(self.generate_slots_view),
            name="website_telehealthprovider_generate_slots",
        ),
    ]
    return custom + urls

def generate_slots_view(self, request, days: int):
    """Bulk-generate availability slots for all active providers for the next N days.

    Defaults:
    - 30-minute slots
    - 09:00 to 17:00 local time
    - capacity=1 (editable later in Slots admin)
    """
    from datetime import timedelta, time

    if days not in (7, 14, 30):
        messages.error(request, "Invalid range. Choose 7, 14, or 30 days.")
        from django.shortcuts import redirect
        return redirect("..")

    providers = TelehealthProvider.objects.filter(is_active=True).order_by("sort_order", "full_name")
    if not providers.exists():
        messages.warning(request, "No active providers found. Add and activate providers first.")
        from django.shortcuts import redirect
        return redirect("..")

    start_date = timezone.localdate()
    created = 0
    skipped = 0

    SLOT_MINUTES = 30
    START_HOUR = 9
    END_HOUR = 17

    for d in range(days):
        day = start_date + timedelta(days=d)
        start_dt = timezone.make_aware(
            timezone.datetime.combine(day, time(hour=START_HOUR, minute=0))
        )
        end_day_dt = timezone.make_aware(
            timezone.datetime.combine(day, time(hour=END_HOUR, minute=0))
        )

        t = start_dt
        while t < end_day_dt:
            t_end = t + timedelta(minutes=SLOT_MINUTES)
            for p in providers:
                # prevent duplicates
                if TelehealthAvailabilitySlot.objects.filter(provider=p, start_at=t).exists():
                    skipped += 1
                    continue
                TelehealthAvailabilitySlot.objects.create(
                    provider=p,
                    start_at=t,
                    end_at=t_end,
                    is_active=True,
                    capacity=1,
                    booked_count=0,
                )
                created += 1
            t = t_end

    messages.success(
        request,
        f"Generated {created} slots for next {days} days across {providers.count()} provider(s). "
        f"Skipped {skipped} existing slot(s).",
    )
    from django.shortcuts import redirect
    return redirect("..")


@admin.register(TelehealthAvailabilitySlot)
class TelehealthAvailabilitySlotAdmin(admin.ModelAdmin):
    list_display = ("provider", "start_at", "end_at", "is_active", "capacity", "booked_count")
    list_filter = ("provider", "is_active")
    search_fields = ("provider__full_name",)
    date_hierarchy = "start_at"
    list_editable = ("is_active", "capacity")
    ordering = ("-start_at",)


@admin.register(PaymentTransaction)
class PaymentTransactionAdmin(admin.ModelAdmin):
    list_display = ("purpose", "amount_ngn", "status", "reference", "created_at")
    list_filter = ("purpose", "status")
    search_fields = ("reference", "email")

@admin.register(Patient)
class PatientAdmin(admin.ModelAdmin):
    list_display = ("full_name", "phone", "email", "updated_at")
    search_fields = ("full_name", "phone", "email")

@admin.register(EMRNote)
class EMRNoteAdmin(admin.ModelAdmin):
    list_display = ("patient", "title", "created_by", "created_at")
    search_fields = ("patient__full_name", "patient__phone", "title")

@admin.register(ActivityLog)
class ActivityLogAdmin(admin.ModelAdmin):
    list_display = ("action", "summary", "created_at")
    search_fields = ("action", "summary")
