"""General helper functions for the student section.
"""
from grok import getSite
from random import SystemRandom as r
from datetime import date, datetime
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import (Frame, Paragraph, Image,
    Table, Spacer)
from reportlab.platypus.tables import TableStyle
from zope.formlib.form import setUpEditWidgets
from waeup.sirp.interfaces import academic_sessions_vocab

SLIP_STYLE = TableStyle(
    [('VALIGN',(0,0),(-1,-1),'TOP')]
    )

def generate_student_id(students,letter):
    if letter == '?':
        letter= r().choice('ABCDEFGHKLMNPQRSTUVWXY')
    sid = u"%c%d" % (letter,r().randint(99999,1000000))
    while sid in students.keys():
        sid = u"%c%d" % (letter,r().randint(99999,1000000))
    return sid

def set_returning_data(student):
    student['studycourse'].current_level += 100
    student['studycourse'].current_session += 1
    verdict = student['studycourse'].current_verdict
    student['studycourse'].current_verdict = '0'
    student['studycourse'].previous_verdict = verdict
    return

# To be specified in customization packages, see also the view which
# calls the function.
def getPaymentDetails(category, student):
    d = {}
    d['p_item'] = u''
    d['amount'] = 0
    d['error'] = u''
    d['p_session'] = student['studycourse'].current_session
    session = str(d['p_session'])
    try:
        academic_session = getSite()['configuration'][session]
    except KeyError:
        d['error'] = u'Session configuration object is not available.'
        return d
    d['surcharge_1'] = academic_session.surcharge_1
    d['surcharge_2'] = academic_session.surcharge_2
    d['surcharge_3'] = academic_session.surcharge_3
    if category == 'schoolfee':
        d['amount'] = academic_session.school_fee_base
        d['p_item'] = student['studycourse'].certificate.code
    elif category == 'clearance':
        d['p_item'] = student['studycourse'].certificate.code
        d['amount'] = academic_session.clearance_fee
    elif category == 'bed_allocation':
        d['p_item'] = getAccommodationDetails(student)['bt']
        d['amount'] = academic_session.booking_fee
    return d

# To be specified in customization packages, see also the view which
# calls the function.
def getAccommodationDetails(student):
    d = {}
    d['error'] = u''
    site_confoguration = getSite()['configuration']
    d['booking_session'] = site_confoguration.accommodation_session
    d['allowed_states'] = site_confoguration.accommodation_states
    session = str(d['booking_session'])
    # Determine bed type
    studycourse = student['studycourse']
    entry_session = studycourse.entry_session
    current_level = studycourse.current_level
    end_level = studycourse.certificate.end_level
    if entry_session == getSite()['configuration'].accommodation_session:
        bt = 'fr'
    elif current_level >= end_level:
        bt = 'fi'
    else:
        bt = 're'
    if student.sex == 'f':
        sex = 'female'
    else:
        sex = 'male'
    special_handling = 'regular'
    d['bt'] = u'%s_%s_%s' % (special_handling,sex,bt)
    return d

# To be specified in customization packages, see also view which
# calls the function.
# I the standard configuration we select the first bed found,
# but can also randomize the selection if we like.
def selectBed(available_beds):
    return available_beds[0]

def setUpWidgets(view, ignore_request=False):
    view.adapters = {}
    view.widgets = setUpEditWidgets(
        view.form_fields, view.prefix, view.context, view.request,
        adapters=view.adapters, for_display=True,
        ignore_request=ignore_request
        )

def renderStudentData(student, studentview):
    setUpWidgets(studentview, ignore_request=True)
    data = []
    style = getSampleStyleSheet()
    for widget in studentview.widgets:
        if widget.name == 'form.adm_code':
            continue
        f_label = '<font size=12>%s</font>:' % widget.label.strip()
        f_label = Paragraph(f_label, style["Normal"])
        f_text = '<font size=12>%s</font>' % widget()
        f_text = Paragraph(f_text, style["Normal"])
        data.append([f_label,f_text])
    table = Table(data,style=SLIP_STYLE)
    return table

# To be specified in customization packages, see also view which
# calls the function.
def renderPDF(view, subject='', filename='slip.pdf', student=None, studentview=None):
    # (0,0),(-1,-1) = whole table
    # (0,0),(0,-1) = first column
    # (-1,0),(-1,-1) = last column
    # (0,0),(-1,0) = first row
    # (0,-1),(-1,-1) = last row

    pdf = canvas.Canvas(filename,pagesize=A4)
    pdf.setTitle(view.label)
    pdf.setSubject(subject)
    pdf.setAuthor('%s (%s)' % (view.request.principal.title,
        view.request.principal.id))
    pdf.setCreator('WAeUP SIRP')
    width, height = A4
    style = getSampleStyleSheet()
    pdf.line(1*cm,height-(1.8*cm),width-(1*cm),height-(1.8*cm))

    story = []
    frame_header = Frame(1*cm,1*cm,width-(1.7*cm),height-(1.7*cm))
    header_title = getattr(getSite(), 'name', u'Sample University')
    story.append(Paragraph(header_title, style["Heading1"]))
    frame_header.addFromList(story,pdf)

    story = []
    frame_body = Frame(1*cm,1*cm,width-(2*cm),height-(3.5*cm))
    story.append(Paragraph(view.label, style["Heading2"]))
    #story.append(HRFlowable())
    if student:
        story.append(Spacer(1, 18))
        studenttable = renderStudentData(student, studentview)
        story.append(studenttable)
    story.append(Spacer(1, 18))
    setUpWidgets(view)
    data = []
    for widget in view.widgets:
        f_label = '<font size=12>%s</font>:' % widget.label.strip()
        f_label = Paragraph(f_label, style["Normal"])
        f_text = '<font size=12>%s</font>' % widget()
        f_text = Paragraph(f_text, style["Normal"])
        data.append([f_label,f_text])
    table = Table(data,style=SLIP_STYLE)
    story.append(table)
    frame_body.addFromList(story,pdf)

    story = []
    frame_footer = Frame(1*cm,0,width-(2*cm),1*cm)
    timestamp = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
    f_text = '<font size=10>%s</font>' % timestamp
    story.append(Paragraph(f_text, style["Normal"]))
    frame_footer.addFromList(story,pdf)

    view.response.setHeader(
        'Content-Type', 'application/pdf')
    return pdf.getpdfdata()
