# coding: utf-8

from django.core.mail import send_mail
from django.contrib.contenttypes.models import ContentType

from django.contrib import admin
from django.db.models import Sum, Count
from bda2.models import Spectacle, Salle, Participant, ChoixSpectacle, Attribution

class ChoixSpectacleInline(admin.TabularInline):
    model = ChoixSpectacle
    sortable_field_name = "priority"

class AttributionInline(admin.TabularInline):
    model = Attribution

class ParticipantAdmin(admin.ModelAdmin):
    #inlines = [ChoixSpectacleInline]
    inlines = [AttributionInline]
    def get_queryset(self, request):
        return Participant.objects.annotate(nb_places = Count('attributions'),
                                            total = Sum('attributions__price'))
    def nb_places(self, obj):
        return obj.nb_places
    nb_places.admin_order_field = "nb_places"
    nb_places.short_description = "Nombre de places"
    def total(self, obj):
        tot = obj.total
        if tot: return u"%.02f €" % tot
        else: return u"0 €"
    total.admin_order_field = "total"
    total.short_description = "Total à payer"
    list_display = ("user", "nb_places", "total", "paid", "paymenttype")
    list_filter = ("paid",)
    search_fields = ('user__username', 'user__first_name', 'user__last_name')
    actions = ['send_attribs',]
    actions_on_bottom = True
    list_per_page = 400

    def send_choices(self, request, queryset):
        for member in queryset.all():
            choices = member.choixspectacle_set.order_by('priority').all()
            if len(choices) == 0:
                continue
            mail = u"""Cher(e) %s,
Voici tes choix de spectacles tels que notre système les a enregistrés :\n\n""" % member.user.get_full_name()
            next_rank = 1
            member_shows = {}
            for choice in choices:
                if choice.spectacle in member_shows: continue
                else: member_shows[choice.spectacle] = True
                extra = ""
                if choice.double:
                    extra += u" ; deux places"
                    if choice.autoquit:
                        extra += u" ; désistement automatique"
                mail += u"- Choix %d : %s%s\n" % (next_rank, choice.spectacle, extra)
                next_rank += 1
            mail += u"""\nSi cette liste est incorrecte, merci de nous contacter au plus vite (avant samedi 6 octobre 18h).

Artistiquement,
Le BdA"""
            send_mail ("Choix de spectacles (BdA du COF)", mail,
                       "bda@ens.fr", [member.user.email],
                       fail_silently = True)
        count = len(queryset.all())
        if count == 1:
            message_bit = u"1 membre a"
            plural = ""
        else:
            message_bit = u"%d membres ont" % count
            plural = "s"
        self.message_user(request, u"%s été informé%s avec succès." % (message_bit, plural))
    send_choices.short_description = u"Envoyer les choix par mail"
    
    def send_attribs(self, request, queryset):
        for member in queryset.all():
            attribs = member.attributions.all()
            if len(attribs) == 0:
                mail = u"""Cher-e %s,

Tu t'es inscrit-e pour le tirage au sort du BdA. Malheureusement, tu n'as
obtenu aucune place.

Nous sommes conscients que le nombre de places proposées lors de ce tirage
au sort est très restreint, mais nous sommes limités par les quotas que
nous imposent les théâtres.

Nous proposons cependant de nombreuses offres hors-tirage tout au long de 
l'année, et nous t'invitons à nous contacter si l'une d'entre elles t'intéresse !
--
Le (nouveau) Bureau des Arts
(Thomas, Caroline, Antonin, Cécile, Hugo)

"""
                name = member.user.get_full_name()
                mail = mail % name
            else:
                mail = u"""Cher-e %s,

Tu t'es inscrit-e pour le tirage au sort du BdA. Tu as été sélectionné-e
pour les spectacles suivants :

%s

Nous sommes conscients que le nombre de places proposées lors de ce tirage
au sort est très restreint, mais nous sommes limités par les quotas que
nous imposent les théâtres.

*Paiement*
L'intégralité de ces places de spectacles est à régler à partir du lundi
18 janvier et AVANT le vendredi 22 janvier, au bureau du COF pendant les
heures de permanences (du lundi au vendredi entre 12h et 14h, et entre 18h
et 20h). Des facilités de paiement sont bien évidemment possibles : nous
pouvons ne pas encaisser le chèque immédiatement, ou bien découper votre 
paiement en deux fois. Il est possible de payer par carte, chèque ou en espèces.

*Mode de retrait des places*
Lors du paiement, nous vous donnerons les places physiques que nous possédons, et vous indiquerons
quelles places sont sur listing, à retirer le soir même de la représentation. Nous vous enverrons un mail de rappel quelques jours avant les spectacles.

Nous vous rappelons que l'obtention de places du BdA vous engage à
respecter les règles de fonctionnement :
http://www.cof.ens.fr/bda/?page_id=1370
Le système de revente des places via les mails BdA-revente est accessible 
directement sur votre compte GestioCOF.

En vous souhaitant de belles représentations,
--
Le (nouveau) Bureau des Arts
(Thomas, Caroline, Antonin, Cécile, Hugo)
"""
                attribs_text = ""
                name = member.user.get_full_name()
                for attrib in attribs:
                    attribs_text += u"- 1 place pour %s\n" % attrib
                mail = mail % (name, attribs_text)

            send_mail ("[BdA] Résultats du tirage au sort", mail,
                       "bda@ens.fr", [member.user.email],
                       fail_silently = True)
        count = len(queryset.all())
        if count == 1:
            message_bit = u"1 membre a"
            plural = ""
        else:
            message_bit = u"%d membres ont" % count
            plural = "s"
        self.message_user(request, u"%s été informé%s avec succès." % (message_bit, plural))
    send_attribs.short_description = u"Envoyer les résultats par mail"

class AttributionAdmin(admin.ModelAdmin):
    def paid(self, obj):
        return obj.participant.paid
    paid.short_description = 'A payé'
    paid.boolean = True
    list_display = ("id", "spectacle", "participant", "given", "paid")
    search_fields = ('spectacle__title', 'participant__user__username', 'participant__user__first_name', 'participant__user__last_name')

import autocomplete_light
class ChoixSpectacleAdmin(admin.ModelAdmin):
    form = autocomplete_light.modelform_factory(ChoixSpectacle, exclude=[])
    list_display = ("participant", "spectacle", "priority", "double", "autoquit")
    list_filter = ("double", "autoquit")
    search_fields = ('participant__user__username', 'participant__user__first_name', 'participant__user__last_name')

class SpectacleAdmin(admin.ModelAdmin):
    model = Spectacle
    list_display = ("title", "date", "location", "slots", "price")
    list_filter = ("location",)
    search_fields = ("title", "location__name")

admin.site.register(Spectacle, SpectacleAdmin)
admin.site.register(Salle)
admin.site.register(Participant, ParticipantAdmin)
admin.site.register(Attribution, AttributionAdmin)
admin.site.register(ChoixSpectacle, ChoixSpectacleAdmin)