from django.contrib import admin
from django.urls import reverse
from djangopasswordlessknox.models import CallbackToken


class UserLinkMixin(object):
    """
    A mixin to add a linkable list_display user field.
    """

    LINK_TO_USER_FIELD = "link_to_user"

    def link_to_user(self, obj):
        link = reverse("admin:users_user_change", args=[obj.user.id])
        return "<a href={}>{}</a>".format(link, obj.user.username)

    link_to_user.allow_tags = True
    link_to_user.short_description = "User"


class AbstractCallbackTokenInline(admin.StackedInline):
    max_num = 0
    extra = 0
    readonly_fields = ("created_at", "key", "is_active")
    fields = ("created_at", "user", "key", "is_active")


class CallbackInline(AbstractCallbackTokenInline):
    model = CallbackToken


class AbstractCallbackTokenAdmin(UserLinkMixin, admin.ModelAdmin):
    readonly_fields = ("created_at", "user", "key")
    list_display = ("created_at", UserLinkMixin.LINK_TO_USER_FIELD, "key", "is_active")
    fields = ("created_at", "user", "key", "is_active")
    extra = 0