# -*- coding: utf-8 -*-
import grok
from waeup.kofa.testing import FunctionalTestCase
from hurry.workflow.interfaces import IWorkflowState
from zope.component import getUtility, createObject
from waeup.kofa.students.interfaces import IStudentsUtils
from waeup.kofa.students.tests.test_browser import StudentsFullSetup
from waeup.fceokene.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'], 'ugft_male_fr')
        self.student['studycourse'].current_level = 200
        self.certificate.study_mode = 'ug_pt'
        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_fi')
        self.student['studycourse'].current_level = 500
        acc_details  = students_utils.getAccommodationDetails(self.student)
        self.assertEqual(acc_details['bt'], 'regular_male_fi')
        return

    def disabled_test_warnCreditsOOR_semester_exceeded(self):
        students_utils = getUtility(IStudentsUtils)
        studylevel = grok.Container()
        studylevel.total_credits_s1 = 17
        studylevel.total_credits_s2 = 17
        course = grok.Model()
        course.credits = 7
        course.semester = 1
        warning = students_utils.warnCreditsOOR(studylevel, course)
        self.assertEqual(warning, None)
        course.credits = 8
        warning = students_utils.warnCreditsOOR(studylevel, course)
        self.assertEqual(warning, 'Maximum credits in 1st semester exceeded.')
        course.semester = 2
        warning = students_utils.warnCreditsOOR(studylevel, course)
        self.assertEqual(warning, 'Maximum credits in 2nd semester exceeded.')
        warning = students_utils.warnCreditsOOR(studylevel)
        self.assertEqual(warning, 'Minimum credits in 1st semester not reached.')
        studylevel.total_credits_s1 = 18
        warning = students_utils.warnCreditsOOR(studylevel)
        self.assertEqual(warning, 'Minimum credits in 2nd semester not reached.')
        return

    def test_warnCreditsOOR(self):
        students_utils = getUtility(IStudentsUtils)
        studylevel = grok.Container()
        studylevel.total_credits = 45
        studylevel.__parent__ = self.student['studycourse']
        course = grok.Model()
        course.credits = 7
        warning = students_utils.warnCreditsOOR(studylevel, course)
        self.assertEqual(warning, None)
        course.credits = 8
        warning = students_utils.warnCreditsOOR(studylevel, course)
        self.assertEqual(warning, 'Maximum credits exceeded.')
        studylevel.total_credits_s1 = 17
        warning = students_utils.warnCreditsOOR(studylevel)
        self.assertEqual(warning, 'Minimum credits in 1st semester not reached.')
        return

    def test_set_payment_details(self):
        self.certificate.end_level = 300
        self.student['studycourse'].current_verdict = 'B'
        self.student['studycourse'].current_level = 200
        configuration = createObject('waeup.SessionConfiguration')
        configuration.academic_session = 2005
        self.app['configuration'].addSessionConfiguration(configuration)
        self.app['configuration']['2005'].penalty_nce3_ft = 99.0
        self.student['studycourse'].certificate.study_mode = 'nce_ft'
        utils = getUtility(IStudentsUtils)
        error, payment = utils.setPaymentDetails('schoolfee',self.student)
        IWorkflowState(self.student).setState('returning')
        error, payment = utils.setPaymentDetails('schoolfee',self.student)
        self.assertEqual(payment.amount_auth, 16131.5) # 15875 + 157.5 + 99
        self.student['studycourse'].previous_verdict = 'O'
        error, payment = utils.setPaymentDetails('schoolfee',self.student)
        self.assertEqual(payment.amount_auth, 16032.5) # 15875 + 157.5
        return
