from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from organization.models import Organization, SyncLog, SyncConfiguration


class ContentTypeAdmin(admin.ModelAdmin):
    search_fields = ['app_label', 'model']

admin.site.register(ContentType, ContentTypeAdmin)


@admin.register(Organization)
class OrganizationAdmin(admin.ModelAdmin):
    """Admin interface for Organization model."""

    list_display = [
        "name",
        "code",
        "email",
        "status",
        "external_source",
        "last_synced",
        "is_active"
    ]
    list_filter = ["status", "is_active", "external_source", "created_at"]
    search_fields = ["name", "code", "email", "external_id"]
    readonly_fields = [
        "external_id",
        "external_source",
        "external_metadata",
        "created_at",
        "updated_at",
        "last_synced"
    ]
    fieldsets = (
        ("Basic Information", {
            "fields": ("name", "code", "slug", "email", "phone", "website")
        }),
        ("Address", {
            "fields": (
                "address_line1",
                "address_line2",
                "city",
                "state",
                "postal_code",
                "country"
            ),
            "classes": ("collapse",)
        }),
        ("External API", {
            "fields": (
                "external_id",
                "external_source",
                "external_metadata",
                "description"
            ),
            "classes": ("collapse",)
        }),
        ("Status & Timestamps", {
            "fields": (
                "status",
                "is_active",
                "created_at",
                "updated_at",
                "last_synced"
            ),
            "classes": ("collapse",)
        }),
    )

    def has_add_permission(self, request):
        """Disable manual creation (only via API/sync)."""
        return False

    def has_delete_permission(self, request, obj=None):
        """Disable deletion via admin (soft delete via API)."""
        return False


@admin.register(SyncLog)
class SyncLogAdmin(admin.ModelAdmin):
    """Admin interface for SyncLog model."""

    list_display = [
        "sync_id",
        "external_source",
        "status",
        "started_at",
        "created_count",
        "updated_count",
        "error_count",
        "duration_seconds"
    ]
    list_filter = [
        "status",
        "external_source",
        "sync_type",
        "started_at"
    ]
    search_fields = ["external_source", "triggered_by", "error_message"]
    readonly_fields = [
        "sync_id",
        "started_at",
        "completed_at",
        "duration_seconds",
        "failed_records"
    ]
    fieldsets = (
        ("Sync Details", {
            "fields": (
                "sync_id",
                "external_source",
                "status",
                "sync_type",
                "triggered_by"
            )
        }),
        ("Timing", {
            "fields": ("started_at", "completed_at", "duration_seconds"),
            "classes": ("collapse",)
        }),
        ("Statistics", {
            "fields": (
                "total_fetched",
                "created_count",
                "updated_count",
                "skipped_count",
                "error_count"
            )
        }),
        ("Error Information", {
            "fields": ("error_message", "error_traceback", "failed_records"),
            "classes": ("collapse",)
        }),
        ("Additional", {
            "fields": ("notes",),
            "classes": ("collapse",)
        }),
    )

    def has_add_permission(self, request):
        """Disable manual creation."""
        return False

    def has_change_permission(self, request, obj=None):
        """Read-only."""
        return False

    def has_delete_permission(self, request, obj=None):
        """Disable deletion."""
        return False


@admin.register(SyncConfiguration)
class SyncConfigurationAdmin(admin.ModelAdmin):
    """Admin interface for SyncConfiguration model."""

    list_display = [
        "source_name",
        "base_url",
        "auth_type",
        "is_active",
        "last_tested_at",
        "last_test_successful"
    ]
    list_filter = ["is_active", "auth_type", "cache_enabled", "auto_sync_enabled"]
    search_fields = ["source_name", "base_url"]
    readonly_fields = [
        "config_id",
        "created_at",
        "updated_at",
        "last_tested_at",
        "last_test_successful",
        "full_endpoint_url"
    ]
    fieldsets = (
        ("Source Configuration", {
            "fields": ("source_name", "is_active")
        }),
        ("API Endpoint", {
            "fields": ("base_url", "api_endpoint", "full_endpoint_url")
        }),
        ("Authentication", {
            "fields": ("auth_type", "auth_key")
        }),
        ("Request Settings", {
            "fields": (
                "timeout_seconds",
                "max_retries",
                "retry_delay_seconds",
                "batch_size"
            )
        }),
        ("Caching", {
            "fields": ("cache_enabled", "cache_ttl_seconds"),
            "classes": ("collapse",)
        }),
        ("Auto-Sync", {
            "fields": (
                "auto_sync_enabled",
                "auto_sync_interval_hours"
            ),
            "classes": ("collapse",)
        }),
        ("Webhooks", {
            "fields": ("webhook_enabled", "webhook_secret"),
            "classes": ("collapse",)
        }),
        ("Field Mapping", {
            "fields": ("field_mapping",),
            "classes": ("collapse",)
        }),
        ("Connection Status", {
            "fields": (
                "last_tested_at",
                "last_test_successful"
            ),
            "classes": ("collapse",)
        }),
        ("Timestamps", {
            "fields": ("created_at", "updated_at"),
            "classes": ("collapse",)
        }),
    )

    actions = ["test_connection_action"]

    def test_connection_action(self, request, queryset):
        """Admin action to test connection."""
        for config in queryset:
            try:
                success, message = config.test_connection()
                self.message_user(
                    request,
                    f"{config.source_name}: {'Success' if success else 'Failed'} - {message}"
                )
            except Exception as e:
                self.message_user(
                    request,
                    f"{config.source_name}: Error - {str(e)}",
                    level="ERROR"
                )

    test_connection_action.short_description = "Test API Connection"


from organization.models import OrganizationModelAccess, OrganizationGroup, Membership


@admin.register(OrganizationModelAccess)
class OrganizationModelAccessAdmin(admin.ModelAdmin):
    list_display = ['organization', 'get_app_label', 'get_model_name', 'is_enabled']
    list_filter = ['is_enabled', 'content_type__app_label']
    search_fields = ['organization__name', 'content_type__model', 'content_type__app_label']
    autocomplete_fields = ['content_type']

    @admin.display(description='App')
    def get_app_label(self, obj):
        return obj.app_label

    @admin.display(description='Model')
    def get_model_name(self, obj):
        return obj.model_name


@admin.register(Membership)
class MembershipAdmin(admin.ModelAdmin):
    list_display = ['user', 'organization', 'group', 'created_at']
    list_filter = ['organization', 'group']
    search_fields = ['user__username', 'organization__name', 'group__name']


@admin.register(OrganizationGroup)
class OrganizationGroupAdmin(admin.ModelAdmin):
    list_display = ['group', 'organization', 'is_global']
    list_filter = ['organization', 'is_global']
    search_fields = ['group__name', 'organization__name']
