from django.contrib import admin
from .models import JWTToken
from bson import ObjectId
from django.forms import ModelForm

class CustomModelAdmin(admin.ModelAdmin):
    
    def get_user_permissions(self, user):
        if user.is_superuser:
            return set()  # Allow all permissions for superusers

        user_permissions = set()
        for nivel in user.nivel.all():
            for permission in nivel.permissions:
                user_permissions.add((permission['app_label'], permission['codename']))
        
        return user_permissions

    def has_view_permission(self, request, obj=None):
        required_permission = self.get_required_permission('view', self.model)
        return self.check_permission(request.user, required_permission)

    def has_add_permission(self, request):
        required_permission = self.get_required_permission('add', self.model)
        return self.check_permission(request.user, required_permission)

    def has_change_permission(self, request, obj=None):
        required_permission = self.get_required_permission('change', self.model)
        return self.check_permission(request.user, required_permission)

    def has_delete_permission(self, request, obj=None):
        required_permission = self.get_required_permission('delete', self.model)
        return self.check_permission(request.user, required_permission)
    
    def get_required_permission(self, action, model):
        model_name = model._meta.model_name
        return f"{action}_{model_name}"

    def check_permission(self, user, required_permission):
        if user.is_superuser:
            return True  # Allow access for superusers
        
        
        user_permissions = self.get_user_permissions(user)
        app_label = self.model._meta.app_label
        
        
        # Restrict access to the 'panel' app only
        #if app_label != 'panel':
         #   return False
        
        return (app_label, required_permission) in user_permissions
    
    def is_auth_app(self):
        return self.model._meta.app_label == 'auth_app'
    



@admin.register(JWTToken)
class JWTTokenAdmin(CustomModelAdmin):
    list_display = ('user_id',   'token_type', 'created_at', 'expires','blacklisted','blacklisted_at')
    search_fields = ('user_id', 'token', 'token_type', 'created_at', 'expires' , 'blacklisted','blacklisted_at')
    list_filter = ('user_id',   'token_type', 'created_at', 'expires', 'blacklisted','blacklisted_at')

    def get_form(self, request, obj,  **kwargs):
        if request.POST:
            # remember old state
            _mutable = request.POST._mutable
            # set to mutable
            request.POST._mutable = True
            # сhange the values you want
            if 'user' in request.POST:
                #rint((request.POST['user']))
                request.POST['user'] = ObjectId(request.POST['user'])
            # set mutable flag back
            request.POST._mutable = _mutable
        return super().get_form(request, obj=obj,  **kwargs)

