import datetime

from django.utils.translation import npgettext, pgettext, ungettext


def nice_repr(timedelta, display='long', sep=', '):
    """
    Turns a datetime.timedelta object into a nice string repr.

    display can be 'minimal', 'short' or 'long' [default].

    >>> from datetime import timedelta as td
    >>> nice_repr(td(days=1, hours=2, minutes=3, seconds=4))
    '1 day, 2 hours, 3 minutes, 4 seconds'
    >>> nice_repr(td(days=1, seconds=1), 'minimal')
    '1d, 1s'
    """

    assert isinstance(timedelta, datetime.timedelta), 'First argument must be a timedelta.'

    result = []

    weeks = timedelta.days // 7
    days = timedelta.days % 7
    hours = timedelta.seconds // 3600
    minutes = (timedelta.seconds % 3600) // 60
    seconds = timedelta.seconds % 60

    if display == 'simple-no-seconds':
        days += weeks * 7
        if days:
            if hours or minutes:
                return '%d day%s %d:%02d' % (days, 's'[days == 1:], hours, minutes)
            return '%d day%s' % (days, 's'[days == 1:])
        else:
            return '%d:%02d' % (hours, minutes)
    elif display == 'sql':
        days += weeks * 7
        return '%d %02d:%02d:%02d' % (days, hours, minutes, seconds)
    elif display == 'simple':
        days += weeks * 7
        if days:
            return '%d day%s %02d:%02d:%02d' % (days, 's'[days == 1:], hours, minutes, seconds)
        else:
            return '%02d:%02d:%02d' % (hours, minutes, seconds)
    elif display == 'localized':
        days += weeks * 7
        if days:
            return npgettext('time format with day', '%d day %h:%m:%s', '%d days %h:%m:%s', days) \
                .replace('%d', str(days)).replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes) \
                .replace('%s', '%02d' % seconds)
        else:
            return pgettext('time format without day', '%h:%m:%s') \
                .replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes).replace('%s', '%02d' % seconds)
    elif display == 'localized-no-seconds':
        days += weeks * 7
        if days:
            if hours or minutes:
                return npgettext('time format no seconds with day', '%d day %h:%m', '%d days %h:%m', days) \
                    .replace('%d', str(days)).replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes)
            return ungettext('%d day', '%d days', days) % days
        else:
            return pgettext('hours and minutes', '%h:%m').replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes)
    elif display == 'concise':
        days += weeks * 7
        if days:
            return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds)
        else:
            return '%02d:%02d:%02d' % (hours, minutes, seconds)
    elif display == 'noday':
        days += weeks * 7
        hours += days * 24
        return '%02d:%02d:%02d' % (hours, minutes, seconds)
    elif display == 'minimal':
        words = ['w', 'd', 'h', 'm', 's']
    elif display == 'short':
        words = [' wks', ' days', ' hrs', ' min', ' sec']
    else:
        words = [' weeks', ' days', ' hours', ' minutes', ' seconds']

    values = [weeks, days, hours, minutes, seconds]

    for i in range(len(values)):
        if values[i]:
            if values[i] == 1 and len(words[i]) > 1:
                result.append('%i%s' % (values[i], words[i].rstrip('s')))
            else:
                result.append('%i%s' % (values[i], words[i]))

    return sep.join(result)