from django.db import models
import random

class Early(models.Model):
    RATE_CHOICES = [
		('5','5'),
		('4', '4'),
        ('3','3'),
		('2', '2'),
        ('1', '1')
	]
    term = models.ForeignKey('management.Term', on_delete = models.SET_NULL, null=True)
    subject = models.ForeignKey('management.Subject', on_delete=models.SET_NULL, null=True, related_name='result_subject_ear')
    student = models.ForeignKey('account.Person', on_delete = models.SET_NULL, null=True)
    value = models.IntegerField(blank=True, default = 0)
    test = models.IntegerField(blank=True, default = 0, verbose_name="1ST CA")
    test2 = models.IntegerField(blank=True, default = 0, verbose_name="2ND CA")
    exam = models.IntegerField(blank=True, default = 0, verbose_name="EXAM")
    total = models.IntegerField(blank=True, default = 0)
    obtainable = models.IntegerField(blank=True, default = 0)
    all_obtainable = models.IntegerField(blank=True, default = 0)
    subject_total = models.IntegerField(blank=True, default = 0)
    subject_avg = models.FloatField(blank=True, default = 0)
    subject_pos = models.IntegerField(blank=True, default = 0)
    grade = models.CharField(max_length=1, blank=True, null=True)
    cumulative = models.IntegerField(blank=True, default = 0)
    cum_perc = models.FloatField(blank=True, default = 0)
    number_present = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Present")
    number_absent = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Absent")
    absent = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Absent")
    attentiveness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Attentiveness")
    attitude = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Attitude to School Work")
    cooperation = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Cooperation with Others")
    emotional = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Emotional Stability")
    health = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    helping = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Helping Others")
    leadership = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    neatness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    perseverance = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    politeness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    punctuality = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    speaking = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Speaking & Writing")
    drawing = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Drawing & Painting")
    handling = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Handling Tools")
    games = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    verbal = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Verbal Fluency")
    handwriting = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    music = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    sports = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    teacher_comment = models.CharField(max_length=135, blank=True, null=True, verbose_name="Class Manager's Comment")
    head_comment = models.CharField(max_length=135, blank=True, null=True, verbose_name="Head of School's Comment")
    created = models.DateTimeField(auto_now_add=True, null=True)
    updated = models.DateTimeField(auto_now=True, null=True)
    static_class = models.CharField(max_length=20, blank=True, null=True)
    static_class_teacher = models.CharField(max_length=30, blank=True, null=True)
    static_head_teacher = models.CharField(max_length=30, blank=True, null=True)
    static_teacher_signature = models.ImageField(null=True, blank=True)
    static_student_image = models.ImageField(null=True, blank=True)
    static_age = models.CharField(max_length=3, blank=True, null=True)
    static_number_in_class = models.CharField(max_length=3, blank=True, null=True)

    def __str__(self):
        try:
            return str(self.student.first_name) + " " + str(self.student.last_name) + " " + str(self.cumulative)
        except:
            return str(self.id)

    class Meta:
        ordering = ('-created',)
        verbose_name = "Nursery"
        verbose_name_plural = "Nursery"

    def grade(self):
        if self.total < 40:
            return "F9"
        elif self.total >= 40 and self.total < 45:
            return "E8"
        elif self.total >= 45 and self.total < 50:
            return "D7"
        elif self.total >= 50 and self.total < 55:
            return "C6"
        elif self.total >= 55 and self.total < 60:
            return "C5"
        elif self.total >= 60 and self.total < 65:
            return "C4"
        elif self.total >= 65 and self.total < 70:
            return "B3"
        elif self.total >= 70 and self.total < 75:
            return "B2"
        else:
            return "A1"

    def grade_remark(self):
        if self.total < 40:
            return "FAIL"
        elif self.total >= 40 and self.total < 45:
            return "PASS"
        elif self.total >= 45 and self.total < 50:
            return "PASS"
        elif self.total >= 50 and self.total < 55:
            return "CREDIT"
        elif self.total >= 55 and self.total < 60:
            return "CREDIT"
        elif self.total >= 60 and self.total < 65:
            return "GOOD"
        elif self.total >= 65 and self.total < 70:
            return "VERY GOOD"
        elif self.total >= 70 and self.total < 75:
            return "EXCELLENT"
        else:
            return "DISTINCTION"

    def grade_general(self):
        if self.cum_perc < 40:
            return "F9"
        elif self.cum_perc >= 40 and self.cum_perc < 45:
            return "E8"
        elif self.cum_perc >= 45 and self.cum_perc < 50:
            return "D7"
        elif self.cum_perc >= 50 and self.cum_perc < 55:
            return "C6"
        elif self.cum_perc >= 55 and self.cum_perc < 60:
            return "C5"
        elif self.cum_perc >= 60 and self.cum_perc < 65:
            return "C4"
        elif self.cum_perc >= 65 and self.cum_perc < 70:
            return "B3"
        elif self.cum_perc >= 70 and self.cum_perc < 75:
            return "B2"
        else:
            return "A1"


class Grade(models.Model):
    RATE_CHOICES = [
		('5','5'),
		('4', '4'),
        ('3','3'),
		('2', '2'),
        ('1', '1')
	]
    term = models.ForeignKey('management.Term', on_delete = models.SET_NULL, null=True)
    subject = models.ForeignKey('management.Subject', on_delete=models.SET_NULL, null=True, related_name='result_subject_gra')
    student = models.ForeignKey('account.Person', on_delete = models.SET_NULL, null=True)
    value = models.IntegerField(blank=True, default = 0)
    test = models.IntegerField(blank=True, default = 0, verbose_name="1ST CA")
    test2 = models.IntegerField(blank=True, default = 0, verbose_name="2ND CA")
    exam = models.IntegerField(blank=True, default = 0, verbose_name="EXAM")
    total = models.IntegerField(blank=True, default = 0)
    obtainable = models.IntegerField(blank=True, default = 0)
    all_obtainable = models.IntegerField(blank=True, default = 0)
    subject_total = models.IntegerField(blank=True, default = 0)
    subject_avg = models.FloatField(blank=True, default = 0)
    subject_pos = models.IntegerField(blank=True, default = 0)
    grade = models.CharField(max_length=1, blank=True, null=True)
    cumulative = models.IntegerField(blank=True, default = 0)
    cum_perc = models.FloatField(blank=True, default = 0)
    number_present = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Present")
    number_absent = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Absent")
    absent = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Absent")
    attentiveness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Attentiveness")
    attitude = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Attitude to School Work")
    cooperation = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Cooperation with Others")
    emotional = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Emotional Stability")
    health = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    helping = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Helping Others")
    leadership = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    neatness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    perseverance = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    politeness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    punctuality = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    speaking = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Speaking & Writing")
    drawing = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Drawing & Painting")
    handling = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Handling Tools")
    games = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    verbal = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Verbal Fluency")
    handwriting = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    music = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    sports = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    teacher_comment = models.CharField(max_length=135, blank=True, null=True, verbose_name="Class Manager's Comment")
    head_comment = models.CharField(max_length=135, blank=True, null=True, verbose_name="Head of School's Comment")
    created = models.DateTimeField(auto_now_add=True, null=True)
    updated = models.DateTimeField(auto_now=True, null=True)
    static_class = models.CharField(max_length=20, blank=True, null=True)
    static_class_teacher = models.CharField(max_length=30, blank=True, null=True)
    static_head_teacher = models.CharField(max_length=30, blank=True, null=True)
    static_teacher_signature = models.ImageField(null=True, blank=True)
    static_student_image = models.ImageField(null=True, blank=True)
    static_age = models.CharField(max_length=3, blank=True, null=True)
    static_number_in_class = models.CharField(max_length=3, blank=True, null=True)

    def __str__(self):
        try:
            return str(self.student.first_name) + " " + str(self.student.last_name) + " " + str(self.cumulative)
        except:
            return str(self.id)

    class Meta:
        ordering = ('-created',)
        verbose_name = "Primary"
        verbose_name_plural = "Primary"

    def grade(self):
        if self.total < 40:
            return "F9"
        elif self.total >= 40 and self.total < 45:
            return "E8"
        elif self.total >= 45 and self.total < 50:
            return "D7"
        elif self.total >= 50 and self.total < 55:
            return "C6"
        elif self.total >= 55 and self.total < 60:
            return "C5"
        elif self.total >= 60 and self.total < 65:
            return "C4"
        elif self.total >= 65 and self.total < 70:
            return "B3"
        elif self.total >= 70 and self.total < 75:
            return "B2"
        else:
            return "A1"

    def grade_remark(self):
        if self.total < 40:
            return "FAIL"
        elif self.total >= 40 and self.total < 45:
            return "PASS"
        elif self.total >= 45 and self.total < 50:
            return "PASS"
        elif self.total >= 50 and self.total < 55:
            return "CREDIT"
        elif self.total >= 55 and self.total < 60:
            return "CREDIT"
        elif self.total >= 60 and self.total < 65:
            return "GOOD"
        elif self.total >= 65 and self.total < 70:
            return "VERY GOOD"
        elif self.total >= 70 and self.total < 75:
            return "EXCELLENT"
        else:
            return "DISTINCTION"

    def grade_general(self):
        if self.cum_perc < 40:
            return "F9"
        elif self.cum_perc >= 40 and self.cum_perc < 45:
            return "E8"
        elif self.cum_perc >= 45 and self.cum_perc < 50:
            return "D7"
        elif self.cum_perc >= 50 and self.cum_perc < 55:
            return "C6"
        elif self.cum_perc >= 55 and self.cum_perc < 60:
            return "C5"
        elif self.cum_perc >= 60 and self.cum_perc < 65:
            return "C4"
        elif self.cum_perc >= 65 and self.cum_perc < 70:
            return "B3"
        elif self.cum_perc >= 70 and self.cum_perc < 75:
            return "B2"
        else:
            return "A1"

class Secondary(models.Model):
    RATE_CHOICES = [
		('5','5'),
		('4', '4'),
        ('3','3'),
		('2', '2'),
        ('1', '1')
	]
    term = models.ForeignKey('management.Term', on_delete = models.SET_NULL, null=True)
    subject = models.ForeignKey('management.Subject', on_delete=models.SET_NULL, null=True, related_name='result_subject_sec')
    student = models.ForeignKey('account.Person', on_delete = models.SET_NULL, null=True)
    value = models.IntegerField(blank=True, default = 0)
    test = models.IntegerField(blank=True, default = 0, verbose_name="1ST CA")
    test2 = models.IntegerField(blank=True, default = 0, verbose_name="2ND CA")
    exam = models.IntegerField(blank=True, default = 0, verbose_name="EXAM")
    total = models.IntegerField(blank=True, default = 0)
    obtainable = models.IntegerField(blank=True, default = 0)
    all_obtainable = models.IntegerField(blank=True, default = 0)
    subject_total = models.IntegerField(blank=True, default = 0)
    subject_avg = models.FloatField(blank=True, default = 0)
    subject_pos = models.IntegerField(blank=True, default = 0)
    grade = models.CharField(max_length=1, blank=True, null=True)
    cumulative = models.IntegerField(blank=True, default = 0)
    cum_perc = models.FloatField(blank=True, default = 0)
    number_present = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Present")
    number_absent = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Absent")
    absent = models.IntegerField(blank=True, default = 0, verbose_name="No of Days Absent")
    attentiveness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Attentiveness")
    attitude = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Attitude to School Work")
    cooperation = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Cooperation with Others")
    emotional = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Emotional Stability")
    health = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    helping = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Helping Others")
    leadership = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    neatness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    perseverance = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    politeness = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    punctuality = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    speaking = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Speaking & Writing")
    drawing = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Drawing & Painting")
    handling = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Handling Tools")
    games = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    verbal = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True, verbose_name="Verbal Fluency")
    handwriting = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    music = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    sports = models.CharField(max_length=1, choices=RATE_CHOICES, blank=True, null=True)
    teacher_comment = models.CharField(max_length=135, blank=True, null=True, verbose_name="Class Manager's Comment")
    head_comment = models.CharField(max_length=135, blank=True, null=True, verbose_name="Head of School's Comment")
    created = models.DateTimeField(auto_now_add=True, null=True)
    updated = models.DateTimeField(auto_now=True, null=True)
    static_class = models.CharField(max_length=20, blank=True, null=True)
    static_class_teacher = models.CharField(max_length=30, blank=True, null=True)
    static_head_teacher = models.CharField(max_length=30, blank=True, null=True)
    static_teacher_signature = models.ImageField(null=True, blank=True)
    static_student_image = models.ImageField(null=True, blank=True)
    static_age = models.CharField(max_length=3, blank=True, null=True)
    static_number_in_class = models.CharField(max_length=3, blank=True, null=True)

    def __str__(self):
        try:
            return str(self.student.first_name) + " " + str(self.student.last_name) + " " + str(self.cumulative)
        except:
            return str(self.id)

    class Meta:
        ordering = ('-created',)
        verbose_name = "Secondary"
        verbose_name_plural = "Secondary"

    def grade(self):
        if self.total < 40:
            return "F9"
        elif self.total >= 40 and self.total < 45:
            return "E8"
        elif self.total >= 45 and self.total < 50:
            return "D7"
        elif self.total >= 50 and self.total < 55:
            return "C6"
        elif self.total >= 55 and self.total < 60:
            return "C5"
        elif self.total >= 60 and self.total < 65:
            return "C4"
        elif self.total >= 65 and self.total < 70:
            return "B3"
        elif self.total >= 70 and self.total < 75:
            return "B2"
        else:
            return "A1"

    def grade_remark(self):
        if self.total < 40:
            return "FAIL"
        elif self.total >= 40 and self.total < 45:
            return "PASS"
        elif self.total >= 45 and self.total < 50:
            return "PASS"
        elif self.total >= 50 and self.total < 55:
            return "CREDIT"
        elif self.total >= 55 and self.total < 60:
            return "CREDIT"
        elif self.total >= 60 and self.total < 65:
            return "GOOD"
        elif self.total >= 65 and self.total < 70:
            return "VERY GOOD"
        elif self.total >= 70 and self.total < 75:
            return "EXCELLENT"
        else:
            return "DISTINCTION"

    def grade_general(self):
        if self.cum_perc < 40:
            return "F9"
        elif self.cum_perc >= 40 and self.cum_perc < 45:
            return "E8"
        elif self.cum_perc >= 45 and self.cum_perc < 50:
            return "D7"
        elif self.cum_perc >= 50 and self.cum_perc < 55:
            return "C6"
        elif self.cum_perc >= 55 and self.cum_perc < 60:
            return "C5"
        elif self.cum_perc >= 60 and self.cum_perc < 65:
            return "C4"
        elif self.cum_perc >= 65 and self.cum_perc < 70:
            return "B3"
        elif self.cum_perc >= 70 and self.cum_perc < 75:
            return "B2"
        else:
            return "A1"
