from django.contrib import admin
from django.contrib.admin.models import LogEntry, ADDITION
from django.contrib.contenttypes.models import ContentType
from .models import Vendor, Product, Order, OrderProduct, ContaBasica, SefazCaptchaSample


class ProductAdmin(admin.ModelAdmin):
    list_display = ('description_text', 'ncm')
    search_fields = ['description_text', 'ncm']
    list_filter = ('description_text', 'ncm')

    def get_queryset(self, request):
        # Mostra todos os produtos para todos os usuários
        return super().get_queryset(request)

    def has_change_permission(self, request, obj=None):
        if not obj:  # Permite acesso à página de edição sem objeto específico
            return True
        if request.user.is_superuser:
            return True
        # Verifica se o usuário criou o registro
        content_type = ContentType.objects.get(app_label='notas', model='product')
        return LogEntry.objects.filter(
            user_id=request.user.id,
            action_flag=ADDITION,
            content_type_id=content_type.id,
            object_id=str(obj.id)
        ).exists()

    def has_delete_permission(self, request, obj=None):
        # Mesma lógica para exclusão
        return self.has_change_permission(request, obj)


class OrderProductInline(admin.TabularInline):
    model = OrderProduct
    extra = 0
    autocomplete_fields = ('product',)


class OrderAdmin(admin.ModelAdmin):
    list_display = ('id', 'formatted_sale_date', 'vendor__nomefantasia_text', 'total_paid')
    fieldsets = (
        ('Importar', {
            'fields': ('key_sefaz',)
        }),
        ('Compra', {
            'fields': ('vendor', 'sale_date', 'total_discount', 'total_price', 'total_paid', 'total_taxes', 'payment_form', 'total_quantity')
        }),
    )
    ordering = ('-id',)
    inlines = [OrderProductInline]
    
    def formatted_sale_date(self, obj):
        return obj.sale_date.strftime('%d/%m/%Y') if obj.sale_date else '-'
    formatted_sale_date.short_description = 'Sale Date'
    formatted_sale_date.admin_order_field = 'sale_date'

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs  # Superusuários veem todos os registros
        # Obtém o content_type_id para Order (1)
        content_type = ContentType.objects.get(app_label='notas', model='order')
        # Filtra LogEntry para criações feitas pelo usuário logado
        user_log_entries = LogEntry.objects.filter(
            user_id=request.user.id,
            action_flag=ADDITION,
            content_type_id=content_type.id
        ).values_list('object_id', flat=True)
        # Converte object_id para inteiros
        user_log_entries = [int(obj_id) for obj_id in user_log_entries]
        # Filtra as ordens pelos IDs encontrados
        return qs.filter(id__in=user_log_entries)

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.base_fields['key_sefaz'].widget.attrs['style'] = 'width: 75%;'
        return form

    class Media:
        js = (
            "js/libs/qrcode-html5.min.js",
            'https://cdn.jsdelivr.net/npm/sweetalert2@11',
            "js/custom1.js",
        )
        css = {
            'all': (
                'css/custom1.css',
                'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css',
            ),
        }


class VendorAdmin(admin.ModelAdmin):
    list_display = ('nomerazaosocial_text', 'nomefantasia_text', 'cpfcnpj_text')
    search_fields = ['nomerazaosocial_text', 'nomefantasia_text', 'cpfcnpj_text']

    def get_queryset(self, request):
        # Mostra todos os vendors para todos os usuários
        return super().get_queryset(request)

    def has_change_permission(self, request, obj=None):
        if not obj:  # Permite acesso à página de edição sem objeto específico
            return True
        if request.user.is_superuser:
            return True
        # Verifica se o usuário criou o registro
        content_type = ContentType.objects.get(app_label='notas', model='vendor')
        return LogEntry.objects.filter(
            user_id=request.user.id,
            action_flag=ADDITION,
            content_type_id=content_type.id,
            object_id=str(obj.id)
        ).exists()

    def has_delete_permission(self, request, obj=None):
        # Mesma lógica para exclusão
        return self.has_change_permission(request, obj)


class ContaBasicaAdmin(admin.ModelAdmin):
    list_display = ('tipo', 'valor_devido', 'valor_pago', 'data_vencimento', 'data_pagamento')
    list_filter = ('tipo',)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        content_type = ContentType.objects.get(app_label='notas', model='contabasica')
        user_ids = LogEntry.objects.filter(
            user_id=request.user.id,
            action_flag=ADDITION,
            content_type_id=content_type.id,
        ).values_list('object_id', flat=True)
        return qs.filter(id__in=[int(i) for i in user_ids])

    def has_change_permission(self, request, obj=None):
        if not obj:
            return True
        if request.user.is_superuser:
            return True
        content_type = ContentType.objects.get(app_label='notas', model='contabasica')
        return LogEntry.objects.filter(
            user_id=request.user.id,
            action_flag=ADDITION,
            content_type_id=content_type.id,
            object_id=str(obj.id),
        ).exists()

    def has_delete_permission(self, request, obj=None):
        return self.has_change_permission(request, obj)


# Registra os modelos no admin
admin.site.register(Product, ProductAdmin)
admin.site.register(Order, OrderAdmin)
admin.site.register(Vendor, VendorAdmin)
admin.site.register(ContaBasica, ContaBasicaAdmin)


class SefazCaptchaSampleAdmin(admin.ModelAdmin):
    list_display = ('texto', 'tamanho', 'tentativa', 'chave_sefaz', 'created_at')
    search_fields = ['texto', 'chave_sefaz']
    list_filter = ('tamanho', 'tentativa')
    readonly_fields = (
        'texto', 'tamanho', 'tentativa', 'chave_sefaz', 'import_job', 'created_at',
    )
    exclude = ('png',)


admin.site.register(SefazCaptchaSample, SefazCaptchaSampleAdmin)