# app_admin/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.admin import AdminSite
from django.contrib.admin.models import ADDITION, CHANGE, DELETION
from django.contrib.contenttypes.models import ContentType
from app_admin.models import AdminLogEntry, AdminUser, AdminToken


class AdminLogMixin:
    """Mixin das Django's Standard-LogEntry durch AdminLogEntry ersetzt."""
    
    def log_addition(self, request, obj, message):
        AdminLogEntry.objects.create(
            user=request.user,
            content_type=ContentType.objects.get_for_model(obj),
            object_id=str(obj.pk),
            object_repr=str(obj),
            action_flag=ADDITION,
            change_message=message if isinstance(message, str) else str(message),
        )

    def log_change(self, request, obj, message):
        AdminLogEntry.objects.create(
            user=request.user,
            content_type=ContentType.objects.get_for_model(obj),
            object_id=str(obj.pk),
            object_repr=str(obj),
            action_flag=CHANGE,
            change_message=message if isinstance(message, str) else str(message),
        )

    def log_deletion(self, request, obj, object_repr):
        AdminLogEntry.objects.create(
            user=request.user,
            content_type=ContentType.objects.get_for_model(obj),
            object_id=str(obj.pk),
            object_repr=object_repr,
            action_flag=DELETION,
            change_message='',
        )




# ── 1. Custom AdminSite ────────────────────────────────────────────────────────

class AdminUserSite(AdminLogMixin, AdminSite):
    site_header = 'Verbrauchsportal Administration'
    index_template = 'app_admin/index.html'

    def get_urls(self):
        """Eigene Admin-Seiten vor die Standard-URLs haengen
        (super().get_urls() endet mit einem Catch-All)."""
        from django.urls import path
        from app_admin import views as admin_views

        custom_urls = [
            path(
                'nutzer-suche/',
                self.admin_view(admin_views.nutzer_suche_view),
                name='nutzer_suche',
            ),
        ]
        return custom_urls + super().get_urls()

admin_site = AdminUserSite(name='portal-admin')


# ── 2. AdminUser ───────────────────────────────────────────────────────────────

class AdminUserAdmin(AdminLogMixin, UserAdmin):
    model = AdminUser
    list_display = ['name', 'email',  'is_active', 'is_staff']
    ordering = ['email']
    fieldsets = (
        (None,             {'fields': ('email', 'password')}),
        ('Info',           {'fields': ('name',)}),
        ('Berechtigungen', {'fields': ('is_staff', 'is_active', 'is_superuser')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2'),
        }),
    )
    search_fields = ['email']
    filter_horizontal = []

admin_site.register(AdminUser, AdminUserAdmin)


# ── 3. AdminToken ──────────────────────────────────────────────────────────────

class AdminTokenAdmin(AdminLogMixin, admin.ModelAdmin):
    list_display = ['user', 'label', 'created']
    readonly_fields = ['key_hash', 'created', 'plain_token_display']
    fields = ['user', 'label', 'plain_token_display', 'key_hash', 'created']

    def plain_token_display(self, obj):
        """Wird nur beim Erstellen befüllt, danach leer."""
        return obj._plain_token if hasattr(obj, '_plain_token') else '(nur beim Erstellen sichtbar)'
    plain_token_display.short_description = 'Token (einmalig)'

    def save_model(self, request, obj, form, change):
        if not change:  # ← nur beim Erstellen, nicht beim Bearbeiten
            plain_token = AdminToken.generate_token()
            obj.set_token(plain_token)
            obj._plain_token = plain_token  # temporär für Anzeige merken
        obj.save()

    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        return super().change_view(request, object_id, form_url, extra_context)

    def response_add(self, request, obj, post_url_continue=None):
        """Nach dem Erstellen: Token einmalig anzeigen."""
        from django.contrib import messages
        if hasattr(obj, '_plain_token'):
            messages.warning(
                request,
                f'⚠️ Token einmalig sichtbar – jetzt kopieren: {obj._plain_token}'
            )
        return super().response_add(request, obj, post_url_continue)

admin_site.register(AdminToken, AdminTokenAdmin)


# ── 4. AdminLogEntry ───────────────────────────────────────────────────────────

class AdminLogEntryAdmin(admin.ModelAdmin):
    list_display = ['action_time', 'user', 'object_repr', 'action_flag']
    readonly_fields = ['action_time', 'user', 'content_type', 'object_id',
                       'object_repr', 'action_flag', 'change_message']

admin_site.register(AdminLogEntry, AdminLogEntryAdmin)


# app_admin/admin.py - ganz unten hinzufügen

from django.contrib import admin as default_admin

# Alle registrierten Models vom Standard-Admin-Site übernehmen
for model, model_admin in default_admin.site._registry.items():
    if model not in admin_site._registry:
        admin_site.register(model, type(model_admin))