# Import template library
from django import template

# Set register
register = template.Library()

# Register filter
@register.filter
def sectodur(value, arg = 'normal'):

    """
    #######################################################
    #                                                     #
    #   Seconds-to-Duration Extended Template Tag         #
    #   Dan Ward 2009 (http://d-w.me)                     #
    #                                                     #
    #   modified:                                         #
    #   Gregor Volkmann 2014 (http://gregor.volkmann.me)  #
    #                                                     #
    #######################################################

    Usage: {{ VALUE|sectodur[:'short' | :'normal' | :'long'] }}
    Default: :'normal'

    NOTE: Please read up 'Custom template tags and filters'
          if you are unsure as to how the template tag is
          implemented in your project.
    """

    # Place seconds in to integer
    secs = int(value)
    # If short string is enabled
    if arg == 'short':

        # Set short names
        dayUnitName = ':'
        hourUnitName = ':'
        minUnitName = ':'
        secUnitName = ''

        # Set short duration unit splitters
        splitterSplitter = ''
        lastDurSplitter = ''
        nextDurSplitter = lastDurSplitter
        dayPluralizeString = ''
        hourPluralizeString = ''
        minPluralizeString = ''
        secPluralizeString = ''
        padZero = '0'
        noDurMessage = '0'

    # If short string is enabled
    if arg == 'normal':

        # Set short names
        dayUnitName = ' Tag'
        hourUnitName = ' Std'
        minUnitName = ' Min'
        secUnitName = ' Sek'

        # Set short duration unit splitters
        splitterSplitter = ' '
        lastDurSplitter = splitterSplitter
        nextDurSplitter = lastDurSplitter
        dayPluralizeString = ''
        hourPluralizeString = ''
        minPluralizeString = ''
        secPluralizeString = ''
        padZero = ''
        noDurMessage = 'Keine Dauer'

    # If normal string is enabled or no mode set
    if arg == 'long':

        # Set long names
        dayUnitName = ' Tag'
        hourUnitName = ' Stunde'
        minUnitName = ' Minute'
        secUnitName = ' Sekunde'

        # Set long duration unit splitters
        splitterSplitter = ' '
        lastDurSplitter = ' und '
        nextDurSplitter = ', '
        dayPluralizeString = 'e'
        hourPluralizeString = 'n'
        minPluralizeString = 'n'
        secPluralizeString = 'n'
        padZero = ''
        noDurMessage = 'Keine Dauer'

    # If seconds are greater than 0
    if secs > 0:

        # Import math library
        import math

        # Place durations of given units in to variables
        daySecs = 86400
        hourSecs = 3600
        minSecs = 60

        dayPadZero = ''

        # Create string to hold outout
        durationString = ''

        # Calculate number of days from seconds
        days = int(math.floor(secs / int(daySecs)))

        # Subtract days from seconds
        secs = secs - (days * int(daySecs))

        # Calculate number of hours from seconds (minus number of days)
        hours = int(math.floor(secs / int(hourSecs)))

        # Subtract hours from seconds
        secs = secs - (hours * int(hourSecs))

        # Calculate number of minutes from seconds (minus number of days and hours)
        minutes = int(math.floor(secs / int(minSecs)))

        # Subtract days from seconds
        secs = secs - (minutes * int(minSecs))

        # Calculate number of seconds (minus days, hours and minutes)
        seconds = secs

        # If number of days is greater than 0
        if days > 0:
            if arg == 'short':
                if days < 10:
                    dayPadZero = 2*padZero
                if days < 100:
                    dayPadZero = padZero

            # Add multiple days to duration string
            durationString += splitterSplitter + dayPadZero + str(days) + dayUnitName + (days > 1 and dayPluralizeString
 or '')

        # Determine if next string is to be shown
        if hours > 0:

            # If there are no more units after this
            if minutes <= 0 and seconds <= 0:

                # Set hour splitter to last
                hourSplitter = lastDurSplitter

            # If there are unit after this
            else:

                # Set hour splitter to next
                hourSplitter = (len(durationString) > 0 and nextDurSplitter or '')

        # If number of hours is greater than 0
        if hours > 0:

            # Add multiple days to duration string
            durationString += hourSplitter + splitterSplitter + (hours < 10 and padZero or '') + str(hours) + hourUnitName + (hours > 1 and hourPluralizeString
 or '')

        # Determine if next string is to be shown
        if minutes > 0:

            # If there are no more units after this
            if seconds <= 0:

                # Set minute splitter to last
                minSplitter = lastDurSplitter

            # If there are unit after this
            else:

                # Set minute splitter to next
                minSplitter = (len(durationString) > 0 and nextDurSplitter or '')

        # If number of minutes is greater than 0
        if minutes > 0:

            # Add multiple days to duration string
            durationString += minSplitter + splitterSplitter + (minutes < 10 and padZero or '') + str(minutes) + minUnitName + (minutes > 1 and minPluralizeString
 or '')

        # Determine if next string is last
        if seconds > 0:

            # Set second splitter
            secSplitter = (len(durationString) > 0 and lastDurSplitter or '')

        # If number of seconds is greater than 0
        if seconds > 0:

            # Add multiple days to duration string
            durationString += secSplitter + splitterSplitter + (seconds < 10 and padZero or '') + str(seconds) + secUnitName + (seconds > 1 and secPluralizeString
 or '')

        # Return duration string
        return durationString.strip()

    # If seconds are not greater than 0
    else:

        # Provide 'No duration' message
        return noDurMessage
