## Script (Python) "reserve_accommodation.py"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=REQUEST
# $Id: reserve_accommodation.py 3406 2008-04-02 07:16:08Z henrik $
"""
process the the accommodation reservation
customized for FCE Okene (random booking order)
"""
try:
    from Products.zdb import set_trace
except:
    def set_trace():
        pass
import DateTime
current = DateTime.DateTime()
pr = context.portal_registration
wftool = context.portal_workflow
lt = context.portal_layouts
info = context.getAccommodationInfo()

import logging
logger = logging.getLogger('Skins.reserve_accommodation')

#if info is None:
#    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())

if info is None:
    member_id = str(context.portal_membership.getAuthenticatedMember())
    logger.info('%s tried to reserve accommodation' % (member_id))
    return context.REQUEST.RESPONSE.redirect("%s/srp_invalid_access" % context.portal_url())

mode = 'create'
if info['booking_disabled']:
    return context.REQUEST.RESPONSE.redirect("%s/booking_disabled" % info['student'].absolute_url())
if not info['booking_allowed']:
    return context.REQUEST.RESPONSE.redirect("%s/no_booking_allowed" % info['student'].absolute_url())
student = info['student']
student_id = info['student_id']
acco_id = info['acco_id']
#session = info['session'][1]
session = info['session'][0]

validate = REQUEST.has_key("cpsdocument_create_button")
if info.has_key('acco') and info['acco']:
    validate = REQUEST.has_key("cpsdocument_edit_button")
    if info['maintenance_paid']:
        if not info['acco_doc'].acco_maint_fee:
            d_update = {}
            hall_info = context.waeup_tool.getHallInfo(info['acco_doc'].bed)
            d_update['acco_maint_fee'] = hall_info.get('maintenance_fee')
            wftool.doActionFor(info['acco'],'reserve_bed')
            info['acco_doc'].edit(mapping=d_update)
            wftool.doActionFor(info['acco'],'pay_maintenance_fee')
        return context.REQUEST.RESPONSE.redirect("%s/accommodation_view" % info['acco'].absolute_url())
    # elif info['online_payment']:
    #     return context.REQUEST.RESPONSE.redirect("%s/accommodation_view" % info['acco'].absolute_url())
    #     # return context.REQUEST.RESPONSE.redirect("%s/pay_interswitch_acco?paytype=HOM" % info['student'].absolute_url())
    else:
        mode = 'edit'
d = {}
button = "Book"
if mode == 'edit':
    d['acco_res_date'] = info['acco_doc'].acco_res_date
    d['acco_res_sc_pin'] = info['acco_doc'].acco_res_sc_pin
    d['acco_maint_fee'] = info['acco_doc'].acco_maint_fee
    d['student_status'] = info['acco_doc'].student_status
    d['bed'] = info['acco_doc'].bed
    d['session'] = info['acco_doc'].session
    button = "Pay Maintainance Fee"
res,psm,ds = lt.renderLayout(layout_id= 'student_accommodation_fe',
                      schema_id= 'student_accommodation',
                      context=context,
                      mapping=validate and REQUEST,
                      ob=d,
                      layout_mode=mode,
                      formaction = "reserve_accommodation",
                      button = button
                      )
if psm == 'invalid':                      # or info['error'] is not None:
    member_id = str(context.portal_membership.getAuthenticatedMember())
    #logger.info('%s, %s' % (member_id,info['error'] ))
    logger.info('%s entered invalid data' % (member_id))
    if psm == 'invalid':
        psm = "Please correct your input."
    else:
        psm = "Error in data, unable to reserve bed."
    return context.accommodation_edit_form(rendered = res,
                                 psm = psm,
                                 #psm = "%s, %s" % (psm,ds),
                                 mode = mode,
                                 ds = ds,
                                 )
elif psm == '':
    return context.accommodation_edit_form(rendered = res,
                                 psm = None,
                                 mode = mode,
                                 ds = ds,
                                 )
elif psm == 'valid':
    if mode == 'create':
        #set_trace()
        pin = str(ds.get('acco_res_sc_pin'))
        code,bed = context.portal_accommodation.searchAndReserveBed(student_id,
                                                                    "%s" % (info['student_status']),
                                                                    random_order=True)
        while True:
            if code == 1:
                break
            if code == -1:
                break
                #return context.accommodation_edit_form(rendered = res,
                #                        psm = "%s" % bed,
                #                        mode = mode,
                #                        ds = ds,
                #                        )
            elif code == -2:
                return context.accommodation_edit_form(rendered = res,
                                        psm = "No bed available. Your category is already fully booked.",
                                        mode = mode,
                                        ds = ds,
                                        )
            else: # unknown error
                return context.accommodation_edit_form(rendered = res,
                                        psm = "Unexpected Error!",
                                        mode = mode,
                                        ds = ds,
                                        )
        student.invokeFactory('StudentAccommodation',acco_id)
        hall_info = context.waeup_tool.getHallInfo(bed)
        ds.set('acco_maint_code', hall_info.get('maintenance_code'))
        ds.set('acco_maint_fee', hall_info.get('maintenance_fee'))
        ds.set('acco_res_date', current)
        ds.set('bed', bed)
        ds.set('session', session)
        ds.set('student_status',info['student_status'])
        acco = getattr(student,acco_id)
        acco.getContent().edit(mapping=ds)
        #wftool.doActionFor(acco,'pay_maintenance_fee',dest_container=acco)
        return context.REQUEST.RESPONSE.redirect("%s/reserve_accommodation" % student.absolute_url())
#pin = str(ds.get('acco_main_sc_pin'))
#pp = context.portal_pins
#acco = getattr(student,acco_id)
d = {}
d['acco_maint_sc_pin'] = ds.get('acco_maint_sc_pin')
d['acco_maint_date'] = current
info['acco_doc'].edit(mapping=d)
wftool.doActionFor(info['acco'],'pay_maintenance_fee')
return context.REQUEST.RESPONSE.redirect("%s/accommodation_view" % student.absolute_url())

