import datetime
from zope.component import queryUtility
from zope.interface.verify import verifyObject, verifyClass
from waeup.kofa.interfaces import ICSVExporter
from waeup.kofa.schoolgrades import ResultEntry
from waeup.kofa.students.tests.test_batching import StudentImportExportSetup
from kofacustom.sampleuni.utils.utils import CustomKofaUtils
from kofacustom.sampleuni.students.export import (
    CustomStudentExporter, CustomStudentPaymentsExporter)
from kofacustom.sampleuni.testing import FunctionalLayer


class CustomStudentExporterTest(StudentImportExportSetup):

    layer = FunctionalLayer

    def setUp(self):
        super(CustomStudentExporterTest, self).setUp()
        self.setup_for_export()
        result_entry = ResultEntry(
            CustomKofaUtils.EXAM_SUBJECTS_DICT.keys()[0],
            CustomKofaUtils.EXAM_GRADES[0][0]
            )
        self.student.alr_results = [
            result_entry]
        self.student.fst_sit_results = [
            result_entry]
        self.student.scd_sit_results = [
            result_entry]
        return

    def test_ifaces(self):
        # make sure we fullfill interface contracts
        obj = CustomStudentExporter()
        verifyObject(ICSVExporter, obj)
        verifyClass(ICSVExporter, CustomStudentExporter)
        return


    def test_export_all(self):
        # we can really export students
        # set values we can expect in export file
        self.setup_student(self.student)
        exporter = CustomStudentExporter()
        exporter.export_all(self.app, self.outfile)
        result = open(self.outfile, 'rb').read()
        self.assertMatches(
            'adm_code,clearance_locked,clr_code,date_of_birth,email,'
            'employer,firstname,lastname,matric_number,middlename,'
            'nationality,officer_comment,perm_address,personal_updated,'
            'phone,reg_number,sex,student_id,suspended,suspended_comment,'
            'password,state,history,certcode,is_postgrad,current_level,'
            'current_session\r\nmy adm code,0,my clr code,1981-02-04#,'
            'anna@sample.com,,Anna,Tester,234,M.,NG,,'
            '"Studentroad 21\nLagos 123456\n",,+234-123-12345#,123,'
            'f,A111111,0,,,created,'
            '[u\'2014-06-16 08:23:55 UTC - Record created by system\'],'
            'CERT1,0,200,2012\r\n',
            result
            )
        return

class CustomStudentPaymentsExporterTest(StudentImportExportSetup):

    layer = FunctionalLayer

    def setUp(self):
        super(CustomStudentPaymentsExporterTest, self).setUp()
        self.setup_for_export()
        return

    def test_ifaces(self):
        # make sure we fullfill interface contracts
        obj = CustomStudentPaymentsExporter()
        verifyObject(ICSVExporter, obj)
        verifyClass(ICSVExporter, CustomStudentPaymentsExporter)
        return

    def test_export_all(self):
        # we can really export students
        # set values we can expect in export file
        self.setup_student(self.student)
        self.student['payments']['my-payment'].r_company = 'interswatch'
        self.student['payments']['my-payment'].r_card_num = '789'
        exporter = CustomStudentPaymentsExporter()
        exporter.export_all(self.app, self.outfile)
        result = open(self.outfile, 'rb').read()
        self.assertMatches(
            'ac,amount_auth,creation_date,p_category,p_current,p_id,'
            'p_item,p_level,p_session,p_state,payment_date,r_amount_approved,'
            'r_code,r_desc,student_id,state,current_session\r\n666,'
            '12.12,2012-04-01 13:12:01#,schoolfee,1,my-id,p-item,'
            '100,2012,paid,2012-04-01 14:12:01#,12.12,r-code,,'
            'A111111,created,2012\r\n',
            result
            )
        return
