import os, sys, datetime
iso8601_egg = "%s/iso8601-0.1.4-py2.4.egg" % os.path.dirname(sys.argv[0])
sys.path.append(os.path.abspath(iso8601_egg))
import iso8601

######################################################################
# Fees
######################################################################

# format is (minutes, hours, days, fee)
fee_table = ((30, 0, 0,  3),
             ( 0, 1, 0,  6),
             (30, 1, 0,  9),
             ( 0, 2, 0, 12),
             ( 0, 3, 0, 15),
             ( 0, 4, 0, 18),
             ( 0, 7, 0, 22),
             ( 0, 0, 1, 24),
             ( 0, 6, 1, 36),
             ( 0, 0, 2, 48))

# Using timedeltas for fee structure is Yuriy Kozlov's idea
fees = [(datetime.timedelta(minutes=e[0],hours=e[1],days=e[2]), e[3])
        for e in fee_table]

def calc_fee(enter, leave):
    """Calculate the fee for staying between enter and leave (both
    must be iso8601 objects)"""
    time = leave - enter
    for limit, fee in fees:
        if time <= limit:
            return fee
    fee = 24 * time.days
    if (time - datetime.timedelta(time.days)).seconds / 3600 <= 6:
        fee += 12
    else:
        fee += 24
    return fee

######################################################################
# Other date time utilities
######################################################################

def now_in_iso8601():
    "Get now as an iso8601 object"
    now = datetime.datetime.now()
    return datetime.datetime(now.year, now.month, now.day,
                             now.hour, now.minute, now.second,
                             tzinfo=iso8601.iso8601.Utc())

def s_to_iso8601(s):
    "Convert string s in 'almost iso8601' format to an iso8601 object"
    return iso8601.parse_date(s.replace(' ', 'T') + ':00')