 
# vim: set fileencoding=utf-8 :
from django.contrib import admin
from backoffice.models import *
from django.contrib.auth.admin import UserAdmin
from django.db.models import Sum
from django.db.models.functions import TruncMonth
from django.contrib import admin
from django.urls import path,reverse
from django.template.response import TemplateResponse
from django.utils.html import format_html
from django_ace import AceWidget

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    
    list_display = (
        'walletAddress',
        'email',
        'stripeCustomerId',
        'organizerCompany',
        'phoneNumber',
        'timezone',
    )
    list_filter = ('accountLocked','isOrganizer','maticSent','subscription','accountFinalized',)
    raw_id_fields = ('groups', 'user_permissions')


@admin.register(Seller)
class SellerAdmin(admin.ModelAdmin):
    
    list_display = (
        'user',
        'stripe_user_id',
        'stripe_charges_enabled',
    )
     
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    
    list_display = (
        'name',
    )
    ordering =('name',)

 
@admin.register(Notification)
class NotificationAdmin(admin.ModelAdmin):
    
    list_display = (
        'refOrganizer',
        'refEvent',
        'type',
        'success'
    )
    list_filter = ('refOrganizer','refEvent','success',)
    ordering =('-createdAt',)

@admin.register(Event)
class EventAdmin(admin.ModelAdmin):
    
    list_display = (
        'name',
        'eventDate',
        'eventType',
        'currency',
    )
    list_filter = ('status','eventType','openBookings','streamWithSelltix','streamingQuality','isPrivate','isConference','mailRappelSent','ended','isFreeOfCharge',)
    ordering =('name',)
    list_select_related = ('refOrganiser','refCategory','refEventPageTemplate')

@admin.register(Content)
class ContentAmin(admin.ModelAdmin):
    list_display = (
        'name',
        'typeContent',
        'ticketPrice',
    )
    list_filter = ('typeContent','refOrganiser')     
    list_select_related = ('refOrganiser',)
    ordering =('-createdAt',)

@admin.register(ContentProtection)
class ContentProtectionAdmin(admin.ModelAdmin):
    list_display = (
        'uniqueId',
        'used',
        'nbUsed',
    )
    ordering =('-createdAt',)

@admin.register(EventPayees)
class EventPayeesAdmin(admin.ModelAdmin):
    
    list_display = (
        'refEvent',
        'walletAddress',
        'shareAmount',
    )
    list_select_related = ('refEvent',)

@admin.register(ScanUsers)
class EventScanUsersAdmin(admin.ModelAdmin):
    
    list_display = (
        'user',
        'login',
    )
    
@admin.register(TicketTypeTemplate)
class TicketTypeTemplateAdmin(admin.ModelAdmin):
    
    list_display = (
        'name',
        'image',
        'templateId',
    )
    ordering =('-createdAt','name',)
    
@admin.register(TicketType)
class TicketTypeAdmin(admin.ModelAdmin):
    
    list_display = (
        'name',
        'refEvent',
        'ticketTypeId',
    )
    list_filter = ('refEvent',)
    ordering =('name',)
    list_select_related = ('refEvent', 'refTicketTypeTemplate')


@admin.register(Ticket)
class TicketAdmin(admin.ModelAdmin):
    list_display = (
        'ticketId',
        'refTicketType',
        'refUser',
        'hasParticipated',
        'pricePaid',
        'typeTicket',
    )
    list_select_related=('refTicketType','refUser','refTicketType__refEvent',)
    list_filter = ('refTicketType__refEvent','transferedToSellTix','typeTicket','sellable',)
    ordering =('name',)
    ordering =('-createdAt',)
    

@admin.register(Payment)
class PaymentAdmin(admin.ModelAdmin):
    

    list_display = (
        'refUser',
        'toUser',
        'createdAt',
        'refTicketType',
        'typePayment',
        'amount',
        'feesSelltix',
        'feesStripeForSellTix',
        'polPrice',
        'status', 
    )
    list_select_related=('refTicketType','refUser',)
    list_filter = ('refTicketType__refEvent','status',)
    ordering =('-createdAt',)
 
    def changelist_view(self, request, extra_context=None):
        # Generate the revenue data
        from django.core.serializers.json import DjangoJSONEncoder
        
        import json
        revenue_data = Payment.objects.filter(status=1,isPackGasFees=0).annotate(month=TruncMonth('createdAt')) \
            .values('month') \
            .annotate(total_revenue=Sum('feesSelltix')) \
            .order_by('month')
        
        
        
        formatted_revenue_data = [
            {
                'month': item['month'].strftime('%B %Y'),
                'total_revenue': item['total_revenue']
            }
            for item in revenue_data
        ]
        # Serialize and attach the chart data to the template context
        as_json = json.dumps(list(formatted_revenue_data), cls=DjangoJSONEncoder)
        print("Json %s"%as_json)
        extra_context = extra_context or {"chart_data": as_json}
        # Call the superclass changelist_view
        return super().changelist_view(request, extra_context=extra_context)
    
@admin.register(Invoice)
class InvoiceAdmin(admin.ModelAdmin):
    list_display = (
        'refUser',
        'createdAt',
        'totalVATIncluded',
        'paid', 
    )
    list_filter = ('paid',)
    list_select_related=('refUser',)
    ordering =('-createdAt',)

@admin.register(TicketToMint)
class TicketToMintAdmin(admin.ModelAdmin):
    list_display = (
        'refUser',
        'refTicketType',
        'status',
    )
    list_select_related=('refTicketType','refUser','refPayment',)
    list_filter = ('refTicketType__refEvent',)
    ordering =('-createdAt',)
     

@admin.register(TicketHistory)
class TicketHistoryAdmin(admin.ModelAdmin):
    list_display = (
        'refUser',
        'wallet',
    )
    list_select_related=('refUser', )
    list_filter = ('refUser',)
    ordering =('-createdAt',)


@admin.register(WebHook)
class WebHookAdmin(admin.ModelAdmin):
    list_display = (
        'webhookId',
        'createdAt',
    )
    ordering =('-createdAt',)


@admin.register(Tasks)
class TasksAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'action',
        'status',
        'createdAt',
    )
    ordering =('-createdAt',)
    list_filter = ('status',)

@admin.register(Invitation)
class InvitationAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'refTicket',
        'code',
        'burned',
        'createdAt',
    )
    ordering =('-createdAt',)
    list_filter = ('burned','refTicket',)
    list_select_related = ('refTicket',)

@admin.register(TransactionManager)
class TransactionManagerAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'wallet',
        'transactionHashId',
        'status',
        'createdAt',
    )
    ordering =('-createdAt',)
    list_filter = ('status',)
    
@admin.register(EventParticipant)
class EventParticipantAdmin(admin.ModelAdmin):
    list_display = (
        'refEvent',
        'refUser',
        'createdAt',
    )
    ordering =('-createdAt',)
    list_select_related = ('refEvent', 'refUser',)

@admin.register(InscriptionNewsletter)
class InscriptionNewsletter(admin.ModelAdmin):
    list_display = (
        'id',
        'email',
        'createdAt',
    )
    ordering =('-createdAt',)

@admin.register(POLPrice)
class POLPriceAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'price',
        'updatedAt',
    )
    ordering =('-createdAt',)

@admin.register(BlockchainSync)
class BlockchainSyncAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'refEvent',
        'last_block',
        'updated_at',
    )
    ordering =('-createdAt',)
    list_select_related = ('refEvent',)

from mjml import mjml2html

def process_mjml(newsletter):
    newsletter.html_content = mjml2html(newsletter.mjml_content)
    newsletter.save()


@admin.register(Newsletter)
class NewsletterAdmin(admin.ModelAdmin):
    list_display = ('subject', 'status', 'created_at', 'sent_at')

    formfield_overrides = {
        models.TextField: 
         {
            'widget': AceWidget(
                mode='html',  # MJML is based on HTML
                theme='monokai',
                width='100%',
                height='500px',
                showprintmargin=False,
                toolbar=True,
                fontsize='14px'
            )
         }
    }

    def send_newsletter(modeladmin, request, queryset):
        for newsletter in queryset:
            process_mjml(newsletter)
            # Add your email sending logic here
            newsletter.status = 'sent'
            newsletter.sent_at = timezone.now()
            newsletter.save()
    send_newsletter.short_description = "Envoyer les newsletters sélectionnées"