from django.contrib import admin
from .models import *
from bson import ObjectId
from django.forms import ModelForm, PasswordInput, SelectMultiple


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_accounts_app(self):
        return self.model._meta.app_label == 'accounts'



class UsuarioAdminForm(ModelForm):
    class Meta:	
        model = Usuario
        fields = '__all__'
        widgets = {
            'password': PasswordInput(),
        }

@admin.register(Usuario)
class UsuarioAdmin(CustomModelAdmin):
    form = UsuarioAdminForm
    

    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 'nivel' in request.POST:
                request.POST['nivel'] = ObjectId(request.POST['nivel'])
            # if 'password' in request.POST:
            #     request.POST['password'] = make_password(request.POST['password'])
            # set mutable flag back
            request.POST._mutable = _mutable
            #print(f"DEBUG: POST: {request.POST}")
        return super().get_form(request, obj=obj,  **kwargs)

    # def get_readonly_fields(self, request, obj=None):
    #     if obj:
    #         queryset = self.model.objects.get(id=obj.id)
    #     #readonly_fields = super().get_readonly_fields(request, obj)
    #     readonly_fields = []
    #     # if isinstance(readonly_fields, tuple):
    #     #     readonly_fields = list(readonly_fields)
        
    #     if not self.has_change_permission(request, obj):
    #         model_fields = self.model._meta.get_fields()
    #         for field in model_fields:
    #             if not isinstance(field, models.ArrayReferenceField):
    #                 readonly_fields.append(field.name)
    #     readonly_fields.pop(readonly_fields.index('password'))
    #     ## remove longentry
    #     #readonly_fields.pop(readonly_fields.index('longentry'))
    #     print(readonly_fields)
        
    #     return readonly_fields
    
    # def get_readonly_fields(self, request, obj=None):
    #     return ["email", 'telefone']


# from .forms import NivelForm
# @admin.register(Nivel)
# class NivelAdmin(CustomModelAdmin):
#     form = NivelForm



from .forms import NivelForm
@admin.register(Nivel)
class NivelAdmin(CustomModelAdmin):
    
    form = NivelForm
    
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        if request.method == 'POST':
            
            #print(request.POST['permissions'])
            
            # remember old state
            _mutable = request.POST._mutable
            request.POST._mutable = True

            # Process 'agencias' field
            permissions = request.POST.getlist('permissions')
            #print(permissions)
            request.POST.setlist('permissions', [permission for permission in permissions])

            # set mutable flag back
            request.POST._mutable = _mutable
        return form





# from django.contrib.auth.models import Group
# admin.site.unregister(Group)
# @admin.register(Group)
# class GroupAdmin(CustomModelAdmin):
#     def is_accounts_app(self):
#         return self.model._meta.app_label == 'auth'





