import re

def asbool(val):
    if val is None:
        return False
    if isinstance(val, bool):
        return val
    val = str(val).strip().lower()
    return val in ('t', 'true', 'y', 'yes', 'on', '1')

def asint(val, minimum=None, maximum=None):
    if val is None:
        val = 0
    val = int(val)
    val = min(val, maximum if maximum else val)
    val = max(val, minimum if minimum else val)
    return val

def aslist(val):
    if val is None:
        return []
    if isinstance(val, list):
        return val
    return str(val).replace(' ', '').split(',')

__UNITS = {
    'metric': 'C', 'kelvin': 'K', 'imperial': 'F',
    'default': 'C'
}
def astemperature(value, unit='metric'):
    return u'{}°{}'.format(int(value), __UNITS.get(unit, __UNITS['default']))

def byte(val, fmt='{:.2f}'):
    for unit in ['', 'Ki', 'Mi', 'Gi']:
        if val < 1024.0:
            return '{}{}B'.format(fmt, unit).format(val)
        val /= 1024.0
    return '{}GiB'.format(fmt).format(val*1024.0)

__seconds_pattern = re.compile('(([\d\.?]+)h)?(([\d\.]+)m)?([\d\.]+)?s?')
def seconds(duration):
    if isinstance(duration, int) or isinstance(duration, float):
        return float(duration)

    matches = __seconds_pattern.match(duration)
    result = 0.0
    if matches.group(2):
        result += float(matches.group(2))*3600 # hours
    if matches.group(4):
        result += float(matches.group(4))*60 # minutes
    if matches.group(5):
        result += float(matches.group(5)) # seconds

    return result

def duration(duration, compact=False, unit=False):
    duration = int(duration)
    if duration < 0:
        return 'n/a'
    minutes, seconds = divmod(duration, 60)
    hours, minutes = divmod(minutes, 60)
    suf = 'm'
    res = '{:02d}:{:02d}'.format(minutes, seconds)
    if hours > 0:
        if compact:
            res = '{:02d}:{:02d}'.format(hours, minutes)
        else:
            res = '{:02d}:{}'.format(hours, res)
        suf = 'h'

    return '{}{}'.format(res, suf if unit else '')

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4