"""Registration Views
"""
from django.conf import settings
from django.http import HttpResponseRedirect
from django.shortcuts import *
from django import template
from django.template import RequestContext
from django.contrib.auth.decorators import *
from django.contrib.auth.models import Group
from django import forms
from pycon.features.decorators import *
from pycon.propmgr.models import Proposal
from models import *
import csv
import itertools

CSV_ROW = [('badge_name',  None),
           ('keynote',     'K'),
           ('speaker',     'S'),
           ('vendor',      'V'),
           ('chair',       'C'),
           ('sponsor',     'G'),
           ('vendor_only', 'X'),]

def record2col(record, name, val):
    col = getattr(record, name)
    if val is None: val = col
    if not col:     val = ''
    return val

def record2row(record):
    return [ record2col(record, name, val) for name, val in CSV_ROW ]

@login_required
@user_passes_test(lambda u: u.is_staff and u.has_perm('registration.edit_record'))
@feature_required('ViewRegistration', auto_create_feat=True)
def view_info(request, **extra_context):
    
    extra_context['csv_format'] = CSV_ROW

    ## Attendee breakdown
    num_pub  = Record.objects.filter(public=True).count()
    num_vend = Record.objects.filter(vendor_only=True).count()
    num_rec  = Record.objects.all().count()
    num_priv = num_rec - num_vend - num_pub
    extra_context['reg'] = {'public': num_pub,
                            'private': num_priv,
                            'vendor': num_vend,
                            'total': num_rec}
    
    ## Food options breakdown
    num_vegan = Record.objects.filter(vegan=True).count()
    extra_context['num_vegan'] = num_vegan
    
    ## Shirt Sizes
    tshirts = [ { 'name': name,
                  'count': Record.objects.filter(shirt_size=size).count() }
                 for size, name in SHIRT_SIZES ]
    extra_context['tshirts'] = tshirts
    
    ## Badge flag breakdown
    flags = [
        {'name': 'Keynote',        'count': Record.objects.filter(keynote=True).count()},
        {'name': 'Speaker',        'count': Record.objects.filter(speaker=True).count()},
        {'name': 'Vendor',         'count': Record.objects.filter(vendor=True).count()},
        {'name': 'Session Chair',  'count': Record.objects.filter(chair=True).count()},
        {'name': 'Sponsor',        'count': Record.objects.filter(sponsor=True).count()},
        {'name': 'Non-Reg Vendor', 'count': Record.objects.filter(vendor_only=True).count()},
            ]
    extra_context['flags'] = flags
    
    ## tutorials_am
    tutorials_am = [
        {'name': disp, 'count': Record.objects.filter(tutorial_am=name).count()}
            for name, disp in TUTORIALS_AM ]
    tutorials_am.append({'name': 'total',
                         'count': Record.objects.exclude(tutorial_am='').count()})
    extra_context['tutorials_am'] = tutorials_am
    
    ## tutorials_pm
    tutorials_pm = [
        {'name': disp, 'count': Record.objects.filter(tutorial_pm=name).count()}
            for name, disp in TUTORIALS_PM ]
    tutorials_pm.append({'name': 'total',
                         'count': Record.objects.exclude(tutorial_pm='').count()})
    extra_context['tutorials_pm'] = tutorials_pm

    ## Unique tutorial attendees
    extra_context['tutorial_attendance_count'] = Record.objects.exclude(tutorial_am='', tutorial_pm='').count()

    ## Speakers not reged
    uids = set(ent['submitter']
                for ent in Proposal.objects.filter(status='A', published=True).values('submitter') )
    for prop in Proposal.objects.filter(status='A', published=True):
        uids |= set(ent['id'] for ent in prop.coauthors.values('id'))
    res = uids - set(ent['user'] for ent in Record.objects.filter(user__in=list(uids)).values('user'))
    spkrs_not_reg = User.objects.filter(pk__in=list(res))
    extra_context['spkrs_not_reg'] = spkrs_not_reg
    
    ## Presenters (w/o user) not reged
    pids = set(ent['id'] for ent in Presenter.objects.filter(user__isnull=True).values('id'))
    res = pids - set(ent['presenter'] for ent in Record.objects.filter(presenter__in=list(pids)).values('presenter'))
    pres_not_reg = Presenter.objects.filter(pk__in=list(res))
    extra_context['pres_not_reg'] = pres_not_reg
    
    ## Chairs not reged
    cg = Group.objects.get(name='Session Chairs')
    uids = set(ent['id'] for ent in cg.user_set.all().values('id'))
    res = uids - set(ent['user'] for ent in Record.objects.filter(user__in=list(uids)).values('user'))
    chairs_not_reg = User.objects.filter(pk__in=list(res))
    extra_context['chairs_not_reg'] = chairs_not_reg
    
    return render_to_response('registration/info.html', extra_context,
                              context_instance=RequestContext(request))

@login_required
@user_passes_test(lambda u: u.is_staff and u.has_perm('registration.edit_record'))
@feature_required('ViewRegistration', auto_create_feat=True)
def csv_file(request):
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=registration.csv'

    csvdata = csv.writer(response)
    for record in Record.objects.all():
        csvdata.writerow(record2row(record))
    return response

@login_required
@user_passes_test(lambda u: u.is_staff and u.has_perm('registration.edit_record'))
@feature_required('ViewRegistration', auto_create_feat=True)
def print_roster(request, **extra_context):
    extra_context['vendors_only'] = Record.objects.filter(vendor_only=True)
    extra_context['attendees']    = Record.objects.all()
    return render_to_response('registration/roster.html', extra_context,
                              context_instance=RequestContext(request))
