from django.contrib import admin
from django.utils.html import format_html

from .models import Comment, Rating, Reaction


def _link(obj):
    t = obj.target
    if t is None:
        return '(deleted)'
    return format_html('<a href="{}" target="_blank" rel="noopener">{}</a>', t.get_absolute_url(), str(t)[:60])


@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    list_display = ('short', 'user', 'on', 'status', 'created_at')
    list_filter = ('status', 'content_type', 'created_at')
    search_fields = ('body', 'user__email', 'user__username')
    list_editable = ('status',)
    readonly_fields = ('user', 'content_type', 'object_id', 'created_at')
    actions = ('show', 'hide')

    @admin.display(description='Comment')
    def short(self, obj):
        return obj.body[:80]

    @admin.display(description='On')
    def on(self, obj):
        return _link(obj)

    @admin.action(description='Show selected comments')
    def show(self, request, qs):
        qs.update(status='visible')

    @admin.action(description='Hide selected comments')
    def hide(self, request, qs):
        qs.update(status='hidden')

    def has_add_permission(self, request):
        return False


@admin.register(Rating)
class RatingAdmin(admin.ModelAdmin):
    list_display = ('stars', 'user', 'on', 'updated_at')
    list_filter = ('stars', 'content_type')
    readonly_fields = ('user', 'content_type', 'object_id', 'stars', 'created_at', 'updated_at')

    @admin.display(description='On')
    def on(self, obj):
        return _link(obj)

    def has_add_permission(self, request):
        return False


@admin.register(Reaction)
class ReactionAdmin(admin.ModelAdmin):
    list_display = ('kind', 'user', 'on', 'created_at')
    list_filter = ('kind', 'content_type')
    readonly_fields = ('user', 'content_type', 'object_id', 'kind', 'created_at')

    @admin.display(description='On')
    def on(self, obj):
        return _link(obj)

    def has_add_permission(self, request):
        return False
