# -*- coding: utf-8 -*-
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