from django.db import models
from django.template import loader, Context

from django.conf import settings
from django.core.files.storage import FileSystemStorage
fs = FileSystemStorage(location=settings.PRIVATE_FILES)

from django.core.validators import MaxValueValidator, MinValueValidator

class TheoryExamForm(models.Model):

    TYPE_CHOICES = (
        (u'application',u'Exam Application'),
        (u'resit',u'Resit Exam'),
    )

    enabled = models.BooleanField(default=False)
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=202)
    introduction = models.TextField()
    payment_amount = models.FloatField(default=0,blank=True,null=True,help_text='Amount Registration costs (&pound;), leave blank for free registration.')
    type = models.CharField(choices=TYPE_CHOICES,default='exam-application',max_length=20)

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['name',]

    def get_applicants(self):
        applicants = TheoryExamApplication.objects.filter(exam=self)
        return applicants

    def get_choices(self):
        choices = ExamChoice.objects.filter(exam_form=self)
        return choices

    def get_locations(self):
        locations = ExamLocation.objects.filter(exam_form=self)
        return locations

class ExamChoice(models.Model):

    TYPE_CHOICES = (
        (u'physics',u'Physics'),
        (u'tech',u'Tech'),
    )

    exam_form = models.ForeignKey('TheoryExamForm')
    name = models.CharField(max_length=200)
    type = models.CharField(max_length=20,choices=TYPE_CHOICES)
    order = models.IntegerField()
    payment_amount = models.FloatField(default=0,blank=True,null=True,help_text='Amount Registration costs (&pound;), leave blank for free registration.')

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['order',]

class ExamLocation(models.Model):

    exam_form = models.ForeignKey('TheoryExamForm')
    name = models.CharField(max_length=200)
    order = models.IntegerField()

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['order',]

class TheoryExamApplication(models.Model):

    TITLE_CHOICES = (
        (u'Mr',u'Mr'),
        (u'Mrs',u'Mrs'),
        (u'Miss',u'Miss'),
        (u'Ms',u'Ms'),
        (u'Doctor',u'Doctor'),
        (u'Professor',u'Professor'),
    )

    PAYMENT_TYPE_CHOICES = (
        (u'bacs',u'BACS'),
        (u'standing_order',u'Standing Order'),
        (u'cheque',u'Cheque'),
        (u'credit_card',u'Credit Card'),
    )

    exam = models.ForeignKey('TheoryExamForm')
    member = models.ForeignKey('members.Member')

    start_time      = models.DateTimeField(auto_now_add=True)
    completed_time  = models.DateTimeField(blank=True,null=True)
    paid            = models.BooleanField(default=False)
    payment_type    = models.CharField(max_length=20,blank=True,null=True,choices=PAYMENT_TYPE_CHOICES)
    complete        = models.BooleanField(default=False)

    #applicant Details
    membership_number = models.IntegerField(blank=True,null=True)
    title = models.CharField(max_length=20,blank=True,null=True,choices=TITLE_CHOICES)
    first_name = models.CharField(max_length=200,blank=True,null=True)
    surname = models.CharField(max_length=200,blank=True,null=True)
    email_address = models.EmailField(max_length=200,blank=True,null=True)
    contact_number = models.CharField(max_length=200,blank=True,null=True,verbose_name='Daytime Contact Telephone Number')
    dob = models.CharField(max_length=200,blank=True,null=True,verbose_name='Date of Birth')
    job_title = models.CharField(max_length=200,blank=True,null=True,verbose_name='Current Job Title')
    current_employer = models.CharField(max_length=200,blank=True,null=True,verbose_name='Current Employer/Hospital')
    employment_start_date = models.CharField(max_length=200,blank=True,null=True,verbose_name='Start Date of UK or Ireland Employment')

    work_address_1 = models.CharField(max_length=200,blank=True,null=True,verbose_name='Address 1')
    work_address_2 = models.CharField(max_length=200,blank=True,null=True,verbose_name='Address 2')
    work_town = models.CharField(max_length=200,blank=True,null=True,verbose_name='Town')
    work_county = models.CharField(max_length=200,blank=True,null=True,verbose_name='County')
    work_postcode = models.CharField(max_length=200,blank=True,null=True,verbose_name='Postcode')
    work_country = models.ForeignKey('members.Country',blank=True,null=True,related_name='th_work_country',verbose_name='Country')

    mailing_address_1 = models.CharField(max_length=200,blank=True,null=True,verbose_name='Address 1')
    mailing_address_2 = models.CharField(max_length=200,blank=True,null=True,verbose_name='Address 2')
    mailing_town = models.CharField(max_length=200,blank=True,null=True,verbose_name='Town')
    mailing_county = models.CharField(max_length=200,blank=True,null=True,verbose_name='County')
    mailing_postcode = models.CharField(max_length=200,blank=True,null=True,verbose_name='Postcode')
    mailing_country = models.ForeignKey('members.Country',blank=True,null=True,related_name='th_mailing_country',verbose_name='Country')

    exam_choices = models.ManyToManyField('ExamChoice',blank=True)
    exam_choice_name = models.CharField(max_length=200,blank=True,null=True)
    location = models.ForeignKey('ExamLocation',blank=True,null=True,on_delete=models.SET_NULL)
    location_name = models.CharField(max_length=200,blank=True,null=True)

    def __unicode__(self):
        return "%s - %s" % (self.exam,self.member)

    class Meta:
        ordering = ['-start_time']

    def display(self):
        year = self.exam.start_year
        years = []
        for i in range(0,6):
            years.append(year)
            year = year - 1
        t = loader.get_template('theory-exam-application-details.html')
        c = Context({ 'application': self,'years':years})
        rendered = t.render(c)

        return rendered

    def get_payment_amount(self):
        amount = 0
        for exam_choice in self.exam_choices.all():
            amount += exam_choice.payment_amount
        return amount
