## $Id: utils.py 17651 2023-11-29 11:21:39Z henrik $
##
## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##
"""General helper functions and utilities for the application section.
"""

import grok
from time import time
from datetime import datetime
from kofacustom.nigeria.applicants.utils import NigeriaApplicantsUtils
from waeup.kofa.applicants.workflow import (INITIALIZED,
    STARTED, PAID, ADMITTED, NOT_ADMITTED, SUBMITTED, CREATED)
from kofacustom.iuokada.applicants.interfaces import DESTINATION_COST
from kofacustom.iuokada.interfaces import MessageFactory as _



class ApplicantsUtils(NigeriaApplicantsUtils):
    """A collection of parameters and methods subject to customization.
    """

    ADDITIONAL_FILES = (
                 ('First Sitting Result (WAEC/NECO)','fst_sit_scan'),
                 ('Second Sitting Result (WAEC/NECO)','scd_sit_scan'),
                 ('Higher Qualification Result','hq_scan'),
                 ('Advanced Level Result','alr_scan'),
                 ('JAMB Result','jamb'),
                 ('Statement of Result','res_stat'),
                 ('NYSC Certificate','nysc'),
                 ('Receipts for Manual Payments','rmp'),
                 )

    APP_TYPES_DICT = {
        'pude': ['Post-UDE Screening', 'PUDE'],
        'sandwich': ['Part-Time Degree in Education', 'SAND'],
        'pt': ['Part-Time Degree Programmes', 'PTP'],
        'putme': ['Post-UTME Screening Exercise', 'PUTME'],
        'app': ['General Studies', 'APP'],
        'ct': ['Certificate Programmes', 'CTP'],
        'dp': ['Diploma Programmes', 'DPP'],
        'pgft': ['Postgraduate Full-Time Programmes', 'PG'],
        'pgpt': ['Postgraduate Part-Time Programmes', 'PG'],
        'pgphd': ['Postgraduate PhD/MPhil Programmes', 'PG'],
        'pre': ['Pre-Degree Studies', 'PRE'],
        'cbt': ['CBT Practice Test', 'CBT'],
        'ase': ['Admission Screening Exercise', 'ASE'], # successor of putme
        'pg': ['Postgraduate Programmes', 'PG'],
        'ug': ['Undergraduate Programmes', 'UG'],
        'tscf': ['Transcript Application (without student record)', 'TRF'],
        'tscs': ['Transcript Application (with student record)', 'TRS'],
        'conv': ['HND to BSc Conversion', 'CNV'],
        'cdl': ['Center For Distance Learning', 'CDL'],
        }

    SEPARATORS_DICT = {
        'form.applicant_id': _(u'Base Data'),
        'form.course1': _(u'Programmes/Courses Desired'),
        'form.hq_type': _(u'Highest Educational Record (Degrees, Diplomas etc.)'),
        'form.presently': _(u'Course or Programme Presently Attending'),
        'form.nysc_year': _(u'NYSC Information/Exemption Certificate'),
        'form.employer': _(u'Employment History'),
        'form.jamb_fname': _(u'JAMB Data (All Applicants)'),
        'form.notice': _(u'Application Process Information'),
        'form.pp_school': _(u'Post Primary School Qualification'),
        'form.presently_inst': _(u'Presently attending a course or programme'),
        'form.fst_sit_fname': _(u'First Sitting Record (WAEC/NECO)'),
        'form.scd_sit_fname': _(u'Second Sitting Record (WAEC/NECO)'),
        'form.referees': _(u'Referees (will be automatically invited by email after final submission)'),
        'form.parents_name': _(u'Parents / Guardian'),
        }

    def sortCertificates(self, context, resultset):
        """Sort already filtered certificates in `AppCatCertificateSource`.
        """
        resultlist = sorted(resultset, key=lambda
            value: value.__parent__.__parent__.__parent__.code +
            value.__parent__.__parent__.code +
            value.code)
        curr_course = context.course1
        if curr_course is not None and curr_course not in resultlist:
            resultlist = [curr_course,] + resultlist
        return resultlist

    def getCertTitle(self, context, value):
        """Compose the titles in `AppCatCertificateSource`.
        """
        try: title = "%s / %s / %s (%s)" % (
            value.__parent__.__parent__.__parent__.title,
            value.__parent__.__parent__.title,
            value.title, value.code)
        except AttributeError:
            title = "NA / %s (%s)" % (value.title, value.code)
        return title

    def setPaymentDetails(self, container, payment, applicant):
        """Set the payment data of an applicant.
        In contrast to its `StudentsUtils` counterpart, the payment ticket
        must exist and is an argument of this method.
        """
        timestamp = ("%d" % int(time()*10000))[1:]
        if container.year:
            session = str(container.year)
            try:
                session_config = grok.getSite()['configuration'][session]
            except KeyError:
                return _(u'Session configuration object is not available.')
        payment.p_id = "p%s" % timestamp
        payment.p_item = container.title
        if container.year:
            payment.p_session = container.year
        else:
            payment.p_session = datetime.now().year
        payment.amount_auth = 0.0
        if applicant.special:
            if applicant.special_application:
                fee_name = applicant.special_application + '_fee'
                payment.amount_auth = getattr(session_config, fee_name, None)
                if payment.amount_auth in (0.0, None):
                    return _('Amount could not be determined.')
                payment.p_category = applicant.special_application
            return
        elif applicant.container_code.startswith('tsc'):
            cost = DESTINATION_COST[applicant.charge][1]
            payment.amount_auth = applicant.no_copies * cost
            payment.p_category = 'transcript'
            return
        else:
            payment.p_category = 'application'
            container_fee = container.application_fee
            if not container_fee:
                return _('Amount could not be determined.')
            payment.amount_auth = container_fee
        return
