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 ExamForm(models.Model):

    TYPE_CHOICES = (
        (u'exam-application',u'Exam Application'),
        (u're-validation',u'Re-Validation'),
    )

    enabled = models.BooleanField(default=False)
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=202)
    introduction = models.TextField()
    start_year = models.IntegerField()
    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_modality_categories(self):
        categories = ModalityCategory.objects.filter(exam_form=self)
        return categories

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

    def get_years(self):
        year = self.start_year
        years = []
        for i in range(0,6):
            years.append(year)
            year = year - 1

        return years

class ModalityCategory(models.Model):

    exam_form = models.ForeignKey('ExamForm')
    title = models.CharField(max_length=200)
    subtitle = models.CharField(max_length=200)
    order = models.IntegerField()
    minimum_scans = models.IntegerField()
    upload_disabled = models.BooleanField(default=False)

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ['order',]

    def get_items(self):
        items = ModalityItem.objects.filter(category=self)
        return items

    def get_compulsory_items(self):
        items = ModalityItem.objects.filter(category=self,type='compulsory')
        return items

    def get_optional_items(self):
        items = ModalityItem.objects.filter(category=self,type='optional')
        return items

class ModalityItem(models.Model):

    TYPE_CHOICES = (
        (u'compulsory',u'Compulsory Element'),
        (u'optional',u'Optional Element'),
    )

    name = models.CharField(max_length=200)
    category = models.ForeignKey('ModalityCategory')
    type = models.CharField(max_length=200,choices=TYPE_CHOICES)
    order = models.IntegerField()
    minimum = models.IntegerField(blank=True,null=True)
    maximum = models.IntegerField(blank=True,null=True)

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['order',]


class ExamApplication(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'),
    )

    STATUS_CHOICES = (
        (0,u'Not Started'),
        (1,u'Applicant Details'),
        (2,u'Academic Details'),
        (3,u'Theory Exams / CPD'),
        (4,u'Core Modalities and Required Numbers'),
        (5,u'Number of Years Experience'),
        (6,u'Nominated Internal Examiner'),
        (7,u'References'),
        (8,u'Declaration'),
        (9,u'Payment'),
    )

    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('ExamForm')
    member = models.ForeignKey('members.Member')

    start_time      = models.DateTimeField(auto_now_add=True)
    completed_time  = models.DateTimeField(blank=True,null=True)
    status          = models.IntegerField(default=1,choices=STATUS_CHOICES)
    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
    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='work_country',verbose_name='Country')
    other_sites_worked = models.TextField(blank=True,null=True,verbose_name='Please detail all locations and dates of any other sites where you have worked during your training')

    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='mailing_country',verbose_name='Country')

    modality_1_scans = models.IntegerField(blank=True,null=True,verbose_name='Core Modality 1 - Carotid duplex')
    modality_2_scans = models.IntegerField(blank=True,null=True,verbose_name='Core Modality 2 - Peripheral Arterial duplex')
    modality_3_scans = models.IntegerField(blank=True,null=True,verbose_name='Core Modality 3 - Peripheral Venous duplex')

    #academic details
    university_name = models.CharField(max_length=200,blank=True,null=True,verbose_name='Name of University')
    degree_title = models.CharField(max_length=200,blank=True,null=True,verbose_name='Title of Degree')
    degree_class = models.CharField(max_length=200,blank=True,null=True,verbose_name='Class of Degree')
    year_awarded = models.IntegerField(blank=True,null=True,verbose_name='Year Degree Awarded')
    degree_certificate = models.FileField(storage=fs,upload_to='exam_applications',blank=True,null=True)

    pg_university_name = models.CharField(max_length=200,blank=True,null=True,verbose_name='Name of University')
    pg_degree_title = models.CharField(max_length=200,blank=True,null=True,verbose_name='Title of Degree')
    pg_year_awarded = models.IntegerField(blank=True,null=True,verbose_name='Year Degree Awarded')

    non_degree_applicant = models.BooleanField(default=False,verbose_name='Please tick if you are a Non-Degree Applicant')
    non_degree_evidence = models.FileField(storage=fs,upload_to='exam_applications',blank=True,null=True)

    #theory exam results
    phi_y1 = models.IntegerField(blank=True,null=True)
    phi_y2 = models.IntegerField(blank=True,null=True)
    phi_y3 = models.IntegerField(blank=True,null=True)
    phi_y4 = models.IntegerField(blank=True,null=True)
    phi_y5 = models.IntegerField(blank=True,null=True)
    phi_y6 = models.IntegerField(blank=True,null=True)
    vt_y1 = models.IntegerField(blank=True,null=True)
    vt_y2 = models.IntegerField(blank=True,null=True)
    vt_y3 = models.IntegerField(blank=True,null=True)
    vt_y4 = models.IntegerField(blank=True,null=True)
    vt_y5 = models.IntegerField(blank=True,null=True)
    vt_y6 = models.IntegerField(blank=True,null=True)
    cpd_y1 = models.IntegerField(blank=True,null=True)
    cpd_y2 = models.IntegerField(blank=True,null=True)
    cpd_y3 = models.IntegerField(blank=True,null=True)
    cpd_y4 = models.IntegerField(blank=True,null=True)
    cpd_y5 = models.IntegerField(blank=True,null=True)
    cpd_y6 = models.IntegerField(blank=True,null=True)
    exam_results_letter = models.FileField(storage=fs,upload_to='exam_applications',blank=True,null=True, verbose_name='Exam result letters/certificates')

    #modalities (foreign key linked)

    #experience
    three_years_experience = models.BooleanField(default=False,verbose_name='I confirm that I have the required 3 years\' experience.')

    #internal examiner
    examiner_title = models.CharField(max_length=200,blank=True,null=True,verbose_name='Title',choices=TITLE_CHOICES)
    examiner_first_name = models.CharField(max_length=200,blank=True,null=True,verbose_name='First Name')
    examiner_surname = models.CharField(max_length=200,blank=True,null=True,verbose_name='Surname')
    examiner_email = models.CharField(max_length=200,blank=True,null=True,verbose_name='Email')
    examiner_unable_reason = models.TextField(blank=True,null=True,verbose_name='If you are unable to nominate a suitable internal examiner please explain why')

    #references (foreign key linked)
    reference_upload = models.FileField(storage=fs,upload_to='exam_applications',blank=True,null=True)

    #declaration
    ordinary_member = models.BooleanField(default=False,verbose_name='I am an ordinary member of the SVT')
    currently_employed = models.BooleanField(default=False,verbose_name='I am currently employed in the UK or Ireland to perform vascular diagnostic investigations')
    six_month_employed = models.BooleanField(default=False,verbose_name='I have been employed in the UK or Ireland to perform vascular diagnostic investigations for at least 6 months.')
    scans_completed = models.BooleanField(default=False,verbose_name='I have carried out at least 25 scans from each of core modalities 1-3 in the 3 months prior to applying to sit the practical exam and have ensured that local protocols and all of these anonymised reports are attached to this application.')
    copy_degree_certificate = models.BooleanField(default=False,verbose_name='A copy of my degree certificate is included')
    theory_exams_passed = models.BooleanField(default=False,verbose_name='I have passed both theory exams in the last 5 years.')
    exam_results_letters = models.BooleanField(default=False,verbose_name='Copies of my exam results letters are included.')
    duplex_scans_completed = models.BooleanField(default=False,verbose_name='I have performed at least 600 scans in each of the 3 core duplex modalities (including a minimum number of compulsory elements) and 200 ABPIs and will ensure supporting evidence is available to the examiners.')
    vascular_scanning_experience = models.BooleanField(default=False,verbose_name='I have at least 3 years full-time diagnostic vascular scanning experience (or part-time equivalent) in each of the core modalities')
    suitable_avs_assessor = models.BooleanField(default=False,verbose_name='I have nominated a suitable AVS internal assessor')
    referees_provided = models.BooleanField(default=False,verbose_name='I have provided the names of at least two referees')
    understand_retake = models.BooleanField(default=False,verbose_name='I understand if I fail the exam I will not be able to apply to retake it for at least 6months.')


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

    class Meta:
        ordering = ['-start_time']

    def get_app_item(self,modality_item):
        try:
            item = ExamApplicationModalityItem.objects.get(exam_application=self,modality_item=modality_item)
        except:
            item = False
        return item

    def get_app_category(self,modality_category):
        try:
            category = ExamApplicationModalityCategory.objects.get(exam_application=self,modality_category=modality_category)
        except:
            category = False
        return category

    def get_modality_items(self):
        items = ExamApplicationModalityItem.objects.filter(exam_application=self)
        return items

    def get_modality_categories(self):
        categories = ExamApplicationModalityCategory.objects.filter(exam_application=self)
        return categories

    def get_references(self):
        references = ExamApplicationReference.objects.filter(exam_application=self)
        return references

    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('exam-application-details.html')
        c = Context({ 'application': self,'years':years})
        rendered = t.render(c)

        return rendered

class ExamApplicationModalityCategory(models.Model):

    exam_application = models.ForeignKey('ExamApplication')
    modality_category = models.ForeignKey('ModalityCategory')
    total_scans = models.IntegerField(blank=True,null=True)
    training_began = models.DateField(blank=True,null=True)
    scans_file = models.FileField(storage=fs,upload_to='exam_applications', blank=True, null=True)

    def __unicode__(self):
        return "%s %s" % (self.exam_application,self.modality_category)

class ExamApplicationModalityItem(models.Model):

    exam_application = models.ForeignKey('ExamApplication')
    modality_item = models.ForeignKey('ModalityItem')
    complete = models.BooleanField(default=False)

    def __unicode__(self):
        return "%s %s" % (self.exam_application,self.modality_item)

class ExamApplicationReference(models.Model):

    exam_application = models.ForeignKey('ExamApplication')
    type = models.CharField(max_length=200)
    order = models.IntegerField()

    name = models.CharField(max_length=200)
    address_1 = models.CharField(max_length=200)
    address_2 = models.CharField(max_length=200,blank=True,null=True)
    town = models.CharField(max_length=200)
    county = models.CharField(max_length=200,blank=True,null=True)
    postcode = models.CharField(max_length=200)
    country = models.ForeignKey('members.Country')
    email = models.EmailField(max_length=200)
    telephone = models.CharField(max_length=20)
    job_role = models.CharField(max_length=200)

    def __unicode__(self):
        return "%s %s" % (self.exam_application,self.name)
