from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from program.models import (
    Category,
    FundingCategory,
    Language,
    LicenseType,
    LinkType,
    MusicFocus,
    RRule,
    Topic,
    Type,
    UserProfile,
)


class AdminWithNameSlugIsActive(admin.ModelAdmin):
    list_display = ("name", "slug", "is_active")


class AdminWithNameType(admin.ModelAdmin):
    list_display = ("name", "type")


class LanguageAdmin(admin.ModelAdmin):
    list_display = ("name", "is_active")


class RRuleAdmin(admin.ModelAdmin):
    list_display = ("name", "freq", "interval", "by_set_pos", "by_weekdays", "count")


class UserProfileInline(admin.StackedInline):
    model = UserProfile
    fields = ("cba_username", "cba_user_token")
    can_delete = False
    verbose_name_plural = "Profile"
    fk_name = "user"


class UserProfileUserAdmin(UserAdmin):
    inlines = (UserProfileInline,)

    def get_queryset(self, request):
        """Let common users only edit their own profile"""
        if not request.user.is_superuser:
            return super(UserAdmin, self).get_queryset(request).filter(pk=request.user.id)

        return super(UserAdmin, self).get_queryset(request)

    def get_readonly_fields(self, request, obj=None):
        """Limit field access for common users"""
        if not request.user.is_superuser:
            return (
                "username",
                "is_staff",
                "is_superuser",
                "is_active",
                "date_joined",
                "last_login",
                "groups",
                "user_permissions",
            )
        return list()

    def get_inline_instances(self, request, obj=None):
        """Append profile fields to UserAdmin"""
        if not obj:
            return list()

        return super(UserProfileUserAdmin, self).get_inline_instances(request, obj)


admin.site.unregister(User)
admin.site.register(User, UserProfileUserAdmin)

admin.site.register(Category, AdminWithNameSlugIsActive)
admin.site.register(FundingCategory, AdminWithNameSlugIsActive)
admin.site.register(Language, LanguageAdmin)
admin.site.register(LinkType, AdminWithNameType)
admin.site.register(LicenseType, AdminWithNameType)
admin.site.register(MusicFocus, AdminWithNameSlugIsActive)
admin.site.register(RRule, RRuleAdmin)
admin.site.register(Topic, AdminWithNameSlugIsActive)
admin.site.register(Type, AdminWithNameSlugIsActive)