from django.contrib import admin
from django.db.models import Count, Q, Sum
from django.urls import reverse
from django.utils import timezone
from django.utils.html import format_html

from .models import Interview, ProctorEvent, Question


class QuestionInline(admin.StackedInline):
    model = Question
    extra = 0
    can_delete = False
    ordering = ("order",)
    fields = (
        "order", "text", "answer", "score", "feedback",
        "time_taken_seconds", "distracted_seconds", "distraction_count",
        "typed_chars", "voice_chars", "paste_attempts", "tab_switches",
        "suspicious_input",
    )
    readonly_fields = fields

    def has_add_permission(self, request, obj=None):
        return False


class EventInline(admin.TabularInline):
    model = ProctorEvent
    extra = 0
    can_delete = False
    fields = ("created_at", "message", "question")
    readonly_fields = fields

    def has_add_permission(self, request, obj=None):
        return False


@admin.action(description="✅ Approve selected candidates")
def approve_candidates(modeladmin, request, queryset):
    n = queryset.update(status="approved", decided_at=timezone.now())
    modeladmin.message_user(request, f"{n} candidate(s) approved.")


@admin.action(description="❌ Reject selected candidates")
def reject_candidates(modeladmin, request, queryset):
    n = queryset.update(status="rejected", decided_at=timezone.now())
    modeladmin.message_user(request, f"{n} candidate(s) rejected.")


@admin.register(Interview)
class InterviewAdmin(admin.ModelAdmin):
    list_display = (
        "candidate_name", "overall_score", "integrity_score", "distraction",
        "paste_total", "suspicious_answers", "ai_recommendation",
        "has_video", "status_badge",
    )
    list_filter = ("status", "ai_recommendation", "terminated")
    search_fields = ("candidate_name",)
    ordering = ("-id",)
    list_per_page = 25
    actions = [approve_candidates, reject_candidates]
    inlines = [QuestionInline, EventInline]

    fieldsets = (
        ("Candidate", {"fields": ("candidate_name", "jd", "created_at")}),
        ("AI rating (sirf HR ke liye)", {"fields": (
            "overall_score", "integrity_score", "total_distracted_seconds",
            "ai_recommendation", "report_text", "report_link",
        )}),
        ("Interview recording", {"fields": ("video_player",)}),
        ("Interview end", {"fields": ("terminated", "terminated_reason", "terminated_at")}),
        ("HR decision", {"fields": ("status", "hr_note", "decided_at")}),
    )
    readonly_fields = (
        "candidate_name", "jd", "created_at", "overall_score", "integrity_score",
        "total_distracted_seconds", "ai_recommendation",
        "report_text", "report_link", "video_player",
        "terminated", "terminated_reason", "terminated_at", "decided_at",
    )

    # ---- list page ke columns (ek hi query mein, slow nahi hoga) ----
    def get_queryset(self, request):
        return super().get_queryset(request).annotate(
            _paste=Sum("questions__paste_attempts"),
            _tabs=Sum("questions__tab_switches"),
            _suspicious=Count("questions", filter=Q(questions__suspicious_input=True)),
        )

    @admin.display(description="Distracted", ordering="total_distracted_seconds")
    def distraction(self, obj):
        return f"{round(obj.total_distracted_seconds or 0)}s"

    @admin.display(description="Paste tries", ordering="_paste")
    def paste_total(self, obj):
        return obj._paste or 0

    @admin.display(description="Suspicious answers", ordering="_suspicious")
    def suspicious_answers(self, obj):
        return obj._suspicious or 0

    @admin.display(description="Video", boolean=True)
    def has_video(self, obj):
        return bool(obj.video)

    @admin.display(description="Status", ordering="status")
    def status_badge(self, obj):
        colors = {"pending": "#d98200", "approved": "#1a8a3a", "rejected": "#c62828"}
        return format_html(
            '<b style="color:{}">{}</b>',
            colors.get(obj.status, "#555"), obj.get_status_display(),
        )

    # ---- candidate ke page ke fields ----
    @admin.display(description="AI report")
    def report_text(self, obj):
        return format_html(
            '<div style="white-space:pre-wrap;max-width:900px">{}</div>',
            obj.report or "Report abhi nahi bani.",
        )

    @admin.display(description="Full report page")
    def report_link(self, obj):
        if not obj.pk:
            return "-"
        url = reverse("report", args=[obj.pk])
        return format_html('<a href="{}" target="_blank">Open report</a>', url)

    @admin.display(description="Interview recording")
    def video_player(self, obj):
        if not obj.video:
            return "No recording"
        return format_html(
            '<video src="{}" controls preload="metadata" '
            'style="max-width:560px;width:100%;border-radius:8px;background:#000"></video>',
            obj.video.url,
        )

    # ---- decision ka time apne aap set ho ----
    def save_model(self, request, obj, form, change):
        if change and "status" in form.changed_data:
            obj.decided_at = timezone.now() if obj.status != "pending" else None
        super().save_model(request, obj, form, change)