# -*- coding: utf-8 -*-
import grok
from hurry.workflow.interfaces import IWorkflowState
from zope.component import getUtility
from waeup.kofa.testing import FunctionalTestCase
from waeup.kofa.university.faculty import Faculty
from waeup.kofa.university.department import Department
from waeup.kofa.students.student import Student
from waeup.kofa.students.interfaces import IStudentsUtils
from waeup.kofa.students.tests.test_browser import StudentsFullSetup
from waeup.kwarapoly.testing import FunctionalLayer

class StudentsUtilsTests(StudentsFullSetup):

    layer = FunctionalLayer

    def test_getAccommodationDetails(self):
        students_utils = getUtility(IStudentsUtils)
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_fr')

        self.student['studycourse'].current_level = 200
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_re')

        self.student['studycourse'].current_level = 210
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_re')

        self.student['studycourse'].current_level = 300
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_fi')

        self.student['studycourse'].current_level = 400
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_fr')

        self.student['studycourse'].current_level = 500
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_re')

        self.student['studycourse'].current_level = 510
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_re')

        self.student['studycourse'].current_level = 600
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_fi')
        return

    def test_setMatricNumber(self):
        # Add second student
        secondstudent = Student()
        secondstudent.firstname = u'second'
        secondstudent.lastname = u'Student'
        self.app['students'].addStudent(secondstudent)
        student_id = secondstudent.student_id
        secondstudent['studycourse'].certificate = self.certificate
        secondstudent['studycourse'].entry_session = 2015
        secondstudent['studycourse'].entry_mode = 'nd_ft'
        IWorkflowState(secondstudent).setState('school fee paid')
        utils = getUtility(IStudentsUtils)
        self.student.matric_number = None
        msg, mnumber = utils.setMatricNumber(self.student)
        self.assertEqual(msg, 'Available from session 2015/2016')
        self.student['studycourse'].entry_mode = 'nd_ft'
        self.student['studycourse'].entry_session = 2015
        msg, mnumber = utils.setMatricNumber(self.student)
        self.assertEqual(mnumber, None)
        self.assertEqual(msg, 'Wrong state.')
        IWorkflowState(self.student).setState('school fee paid')
        msg, mnumber = utils.setMatricNumber(self.student)
        self.assertEqual(self.student.matric_number, 'ND/15/dep1/FT/001')
        msg, mnumber = utils.setMatricNumber(self.student)
        self.assertEqual(msg, 'Matriculation number already set.')
        # Second student gets nex matric number
        msg, mnumber = utils.setMatricNumber(secondstudent)
        self.assertEqual(secondstudent.matric_number, 'ND/15/dep1/FT/002')
        self.student.matric_number = u'ND/15/dep1/FT/011'
        secondstudent.matric_number = None
        msg, mnumber = utils.setMatricNumber(secondstudent)
        self.assertEqual(secondstudent.matric_number, 'ND/15/dep1/FT/012')
        # Certificate must be set.
        self.student.matric_number = None
        self.student['studycourse'].certificate = None
        msg, mnumber = utils.setMatricNumber(self.student)
        self.assertEqual(msg, 'No certificate assigned.')
        return

    def test_maxCreditsExceeded(self):
        students_utils = getUtility(IStudentsUtils)
        studylevel = grok.Container()
        studylevel.total_credits = 60
        course = grok.Model()
        course.credits = 88
        warning = students_utils.warnCreditsOOR(studylevel, course)
        self.assertEqual(warning, None)
        return