from django.contrib import admin
from simple_history.admin import SimpleHistoryAdmin

from apps.mel.indicators.models import (
    DataPoint,
    ImpactDatapoint,
    ImpactEvaluation,
    Indicator,
    IndicatorTarget,
    IndicatorVariance,
    LogFrame,
    LogFrameRow,
    RagThreshold,
)


class LogFrameRowInline(admin.TabularInline):
    model = LogFrameRow
    extra = 0
    fields = ("level", "title", "parent", "order")
    autocomplete_fields = ("parent",)


@admin.register(LogFrame)
class LogFrameAdmin(SimpleHistoryAdmin):
    list_display = ("name", "slug", "programme", "active", "updated_at")
    list_filter = ("active",)
    search_fields = ("name", "slug", "programme")
    prepopulated_fields = {"slug": ("name",)}
    inlines = [LogFrameRowInline]


@admin.register(LogFrameRow)
class LogFrameRowAdmin(SimpleHistoryAdmin):
    list_display = ("logframe", "level", "title", "parent", "order")
    list_filter = ("logframe", "level")
    search_fields = ("title",)
    autocomplete_fields = ("parent",)


class IndicatorTargetInline(admin.TabularInline):
    model = IndicatorTarget
    extra = 0


@admin.register(Indicator)
class IndicatorAdmin(SimpleHistoryAdmin):
    list_display = ("code", "name", "logframe_row", "frequency", "source_module", "is_active")
    list_filter = ("frequency", "source_module", "is_active")
    search_fields = ("code", "name", "data_source")
    autocomplete_fields = ("logframe_row", "responsible")
    inlines = [IndicatorTargetInline]


@admin.register(IndicatorTarget)
class IndicatorTargetAdmin(SimpleHistoryAdmin):
    list_display = ("indicator", "period_label", "baseline_value", "target_value", "period_start", "period_end")
    list_filter = ("period_label",)
    search_fields = ("indicator__code", "indicator__name")


@admin.register(DataPoint)
class DataPointAdmin(admin.ModelAdmin):
    list_display = ("indicator", "period_label", "value", "status", "source_module", "source_event", "reported_at")
    list_filter = ("status", "source_module", "source_event")
    search_fields = ("indicator__code", "indicator__name", "source_object_id")
    readonly_fields = ("source_module", "source_event", "source_object_id", "created_at")


@admin.register(RagThreshold)
class RagThresholdAdmin(admin.ModelAdmin):
    list_display = ("logframe", "green_min", "amber_min", "updated_at")
    search_fields = ("logframe__name", "logframe__slug")


@admin.register(IndicatorVariance)
class IndicatorVarianceAdmin(SimpleHistoryAdmin):
    list_display = ("indicator", "period_label", "target_value", "actual_value", "variance_pct", "computed_at")
    list_filter = ("period_label",)
    search_fields = ("indicator__code", "indicator__name")
    readonly_fields = ("target_value", "actual_value", "variance_pct", "computed_at", "created_at")


class ImpactDatapointInline(admin.TabularInline):
    model = ImpactDatapoint
    extra = 0
    fields = ("group", "value", "recorded_at", "recorded_by", "notes")
    autocomplete_fields = ("recorded_by",)


@admin.register(ImpactEvaluation)
class ImpactEvaluationAdmin(SimpleHistoryAdmin):
    list_display = ("title", "logframe", "evaluator", "peer_review_status", "completed_on")
    list_filter = ("peer_review_status", "logframe")
    search_fields = ("title", "logframe__name", "logframe__slug")
    autocomplete_fields = ("logframe", "evaluator")
    inlines = [ImpactDatapointInline]


@admin.register(ImpactDatapoint)
class ImpactDatapointAdmin(SimpleHistoryAdmin):
    list_display = ("evaluation", "group", "value", "recorded_at", "recorded_by")
    list_filter = ("group",)
    search_fields = ("evaluation__title", "notes")
    autocomplete_fields = ("evaluation", "recorded_by")
