"""Django admin registrations for the workflow engine.

Provides read-friendly views of:
  * WorkflowInstance — FSM runtime state per subject
  * WorkflowTransitionLog — append-only transition audit
  * WorkflowApproval — approval records
  * ProcessDefinition — tenant-scoped automation rules (process engine)
  * ProcessExecutionLog — append-only process execution audit
"""

from django.contrib import admin

from simorgh.apps.workflow.models import (
    ProcessDefinition,
    ProcessExecutionLog,
    WorkflowApproval,
    WorkflowInstance,
    WorkflowTransitionLog,
)


# ---------------------------------------------------------------------------
# WorkflowInstance
# ---------------------------------------------------------------------------


class TransitionLogInline(admin.TabularInline):
    model = WorkflowTransitionLog
    extra = 0
    readonly_fields = ("transition_name", "from_state", "to_state", "actor", "trigger", "created_at")
    fields = ("transition_name", "from_state", "to_state", "actor", "trigger", "created_at")
    ordering = ("-created_at",)
    can_delete = False


class ApprovalInline(admin.TabularInline):
    model = WorkflowApproval
    extra = 0
    readonly_fields = ("transition_name", "decision", "actor", "role_code", "note", "consumed_at", "created_at")
    fields = ("transition_name", "decision", "actor", "role_code", "note", "consumed_at", "created_at")
    ordering = ("-created_at",)
    can_delete = False


@admin.register(WorkflowInstance)
class WorkflowInstanceAdmin(admin.ModelAdmin):
    list_display = (
        "public_id", "definition_name", "definition_version",
        "current_state", "status", "tenant", "started_by", "created_at",
    )
    list_filter = ("status", "definition_name", "tenant")
    search_fields = ("public_id", "definition_name", "object_id")
    readonly_fields = (
        "public_id", "definition_name", "definition_version",
        "subject_type", "content_type", "object_id",
        "current_state", "status", "data",
        "tenant", "organization_node", "started_by",
        "closed_at", "created_at", "updated_at",
    )
    inlines = [TransitionLogInline, ApprovalInline]

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False


@admin.register(WorkflowTransitionLog)
class WorkflowTransitionLogAdmin(admin.ModelAdmin):
    list_display = ("instance", "transition_name", "from_state", "to_state", "actor", "created_at")
    list_filter = ("tenant", "from_state", "to_state")
    search_fields = ("instance__public_id", "transition_name")
    readonly_fields = ("instance", "transition_name", "from_state", "to_state", "actor", "trigger", "payload", "created_at")

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False


@admin.register(WorkflowApproval)
class WorkflowApprovalAdmin(admin.ModelAdmin):
    list_display = ("instance", "transition_name", "decision", "actor", "role_code", "consumed_at", "created_at")
    list_filter = ("tenant", "decision")
    search_fields = ("instance__public_id", "transition_name")
    readonly_fields = ("instance", "transition_name", "decision", "actor", "role_code", "note", "consumed_at", "created_at")

    def has_add_permission(self, request):
        return False


# ---------------------------------------------------------------------------
# ProcessDefinition
# ---------------------------------------------------------------------------


class ProcessExecutionLogInline(admin.TabularInline):
    model = ProcessExecutionLog
    extra = 0
    readonly_fields = ("trigger_event", "object_id", "actions_fired", "success", "error_message", "created_at")
    fields = ("trigger_event", "object_id", "actions_fired", "success", "error_message", "created_at")
    ordering = ("-created_at",)
    can_delete = False


@admin.register(ProcessDefinition)
class ProcessDefinitionAdmin(admin.ModelAdmin):
    list_display = (
        "name", "trigger_event", "is_active", "sort_order",
        "run_count", "last_run_at", "seed_key", "tenant",
    )
    list_filter = ("is_active", "trigger_event", "tenant")
    search_fields = ("name", "seed_key", "description")
    readonly_fields = ("public_id", "run_count", "last_run_at", "created_at", "updated_at")
    fieldsets = (
        (None, {
            "fields": ("public_id", "name", "description", "tenant", "organization_node"),
        }),
        ("Trigger & Logic", {
            "fields": ("trigger_event", "conditions", "actions"),
        }),
        ("Configuration", {
            "fields": ("is_active", "sort_order", "seed_key"),
        }),
        ("Statistics", {
            "fields": ("run_count", "last_run_at", "created_at", "updated_at"),
            "classes": ("collapse",),
        }),
    )
    inlines = [ProcessExecutionLogInline]


@admin.register(ProcessExecutionLog)
class ProcessExecutionLogAdmin(admin.ModelAdmin):
    list_display = (
        "process", "trigger_event", "object_id",
        "success", "created_at", "tenant",
    )
    list_filter = ("success", "trigger_event", "tenant")
    search_fields = ("process__name", "object_id", "error_message")
    readonly_fields = (
        "public_id", "process", "trigger_event",
        "subject_ct", "object_id", "actions_fired",
        "success", "error_message",
        "tenant", "organization_node", "created_at",
    )

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False
