# coding: utf-8

# maposmatic, the web front-end of the MapOSMatic city map generation system
# Copyright (C) 2009  David Decotigny
# Copyright (C) 2009  Frédéric Lehobey
# Copyright (C) 2009  David Mentré
# Copyright (C) 2009  Maxime Petazzoni
# Copyright (C) 2009  Thomas Petazzoni
# Copyright (C) 2009  Gaël Utard
# Copyright (C) 2018  Hartmut Holzgraefe

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import datetime
import os
import re

from django import template
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _

import www.settings

import ocitysmap

register = template.Library()

def job_status_to_str(value, arg, autoescape=None):
    if value == 0:
        return _("Waiting for rendering to begin...")
    elif value == 1:
        return _("The rendering is in progress...")
    elif value == 2:
        if arg == 'ok':
            return _("Rendering was successful.")
        else:
            if www.settings.CONTACT_EMAIL:
                return _("Rendering failed! Please contact %(email)s for more information.") % {'email': www.settings.CONTACT_EMAIL}
            else:
                return _("Rendering failed!")
    elif value == 3:
        if arg == 'ok':
            return _("Rendering is obsolete: the rendering was successful, but the files are no longer available.")
        else:
            return _("Obsolete failed rendering: the rendering failed, and the incomplete files have been removed.")
    elif value == 4:
        return _("The rendering was cancelled by the user.")

    return ''

def feedparsed(value):
    return datetime.datetime(*value[:6])

def file_basename(value):
    try:
      return os.path.basename(value.name)
    except:
      return ""

def add_blank_after_comma(value):
    return value.replace(",",", ")

def _dd2dms(value):
    abs_value = abs(value)
    degrees  = int(abs_value)
    frac     = abs_value - degrees
    minutes  = int(frac * 60)
    seconds  = (frac * 3600) % 60

    return (degrees, minutes, seconds)

def latitude(value):
    latitude = float(value)
    (degrees, minutes, seconds) = _dd2dms(latitude)
    hemisphere = 'N' if latitude >= 0 else 'S'

    return "%d°%d'%d\"%s" % (degrees, minutes, seconds, hemisphere)

def longitude(value):
    latitude = float(value)
    (degrees, minutes, seconds) = _dd2dms(latitude)
    hemisphere = 'E' if latitude >= 0 else 'W'

    return "%d°%d'%d\"%s" % (degrees, minutes, seconds, hemisphere)

def bbox_km(value):
    boundingbox = ocitysmap.coords.BoundingBox(
        value.lat_upper_left,
        value.lon_upper_left,
        value.lat_bottom_right,
        value.lon_bottom_right)

    (height, width) = boundingbox.spheric_sizes()

    return "ca. %d x %d km²" % (width/1000, height/1000)

def language_flag(value):
    if value in www.settings.LANGUAGE_FLAGS:
        if www.settings.LANGUAGE_FLAGS[value] != None:
            return ("flag-icon flag-icon-%s" % www.settings.LANGUAGE_FLAGS[value])
    return "fa fa-flag"

def locale_base(value):
    return re.sub('\..*', '', value)
    
register.filter('job_status_to_str', job_status_to_str)
register.filter('feedparsed', feedparsed)
register.filter('abs', lambda x: abs(x))
register.filter('getitem', lambda d,i: d.get(i,''))
register.filter('file_basename', file_basename)
register.filter('add_blank_after_comma', add_blank_after_comma)
register.filter('latitude', latitude)
register.filter('longitude', longitude)
register.filter('bbox_km', bbox_km)
register.filter('language_flag', language_flag)
register.filter('locale_base', locale_base)
