# -*- coding: utf-8 -*-
# 
#   Copyright 2009-2012 Michal Sadowski (sq6jnx at hamradio dot pl)
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#
 
# *********
# pl_google/pl_google.py
# *********
#
# This file defines language dependent functions and variables. Probably
# this is the most important file in whole package.
#
# ============
# Requirements
# ============
#
# This package *may* import some other packages, it is up to you (and your
# needs).
#
# BUT: this packahe **must** define the following functions:
# * ``direction()`` which "translates" direction given by letters into
#    its word representation
# * ``removeDiacritics()`` which removes diacritics
# * ``readISODT()`` "translates" date and time into its word representation
# * ``cardinal()``  which changes numbers into words (1 -> one)
#
# As you probably can see all of these functions are language-dependant.
#
# ======================
# Implementation example
# ======================
#
# Here is implementation example for Polish language. Polish is interresting
# because it uses diacritics and 7 (seven) gramatical cases[#]_ (among many
# other features ;)
#
# .. [*] http://pl.wikipedia.org/wiki/Przypadek#Przypadki_w_j.C4.99zyku_polskim
#
# There *may* be some issues with diacritics because there are many
# implementations [#]. For example, Windows uses its own coding system while
# Linux uses UTF-8 (I think). And, when moving files (which are named with
# diacritics) from one platform to another results may (will) be
# unexpectable.
#
# .. [#] http://pl.wikipedia.org/wiki/Kodowanie_polskich_znak%C3%B3w
#
# =====================
# Polish dictionary
# =====================
#
# Concept: to make things clear, easy to debug and to
# internationalize. Program *doesn't use words* but *filenames*.
# So, if somewhere in programme variable's value or function returnes 
# ie. *windy* it should be regarded as a *filename*, ``windy.ogg``.
#
# Beware too short words, it will be like machine gun rapid fire or
# will sound like a cyborg from old, cheap sci-fi movie. IMO the good way
# is to record longer phrases, like *"the temperature is"*, save it as
# ``the_temperature_is.ogg`` and use it's filename (``the_temperature_is``)
# as a return value.
#
# This dictionary is used by all SR0WX modules.

fake_gettext = lambda(s): s
_ = fake_gettext

# Units and grammar cases
hrs = ["","godziny","godzin"]
hPa = ["hektopaskal", "hektopaskale", "hektopaskali"]
percent = [u"procent",u"procent",u"procent"]
mPs    = ["metr_na_sekunde", "metry_na_sekunde", "metrow_na_sekunde"]
kmPh   = ["kilometr_na_godzine", "kilometry_na_godzine", "kilometrow_na_godzine"]
MiPh   = ["", "", ""] # miles per hour -- not used
windStrength  = "sila_wiatru"
deg = [u"stopien","stopnie","stopni"]
C   = ["stopien_celsjusza", "stopnie_celsjusza", "stopni_celsjusza"]
km  = ["kilometr", "kilometry", u"kilometrow"]
mns = ["minuta","minuty","minut"]
tendention = ['tendencja_spadkowa','', 'tendencja_wzrostowa']


# We need also local names for directions to convert two- or three letters
# long wind direction into words (first is used as prefix, second as suffix):
directions = { "N": ("północno ",   "północny"),
               "E": ("wschodnio ",  "wschodni"),
               "W": ("zachodnio ",  "zachodni"),
               "S": ("południowo ", "południowy") }

# numbers
jednostkiM = [u""] + u"jeden dwa trzy cztery pięć sześć siedem osiem dziewięć".split()
jednostkiF = [u""] + u"jedną dwie trzy cztery pięć sześć siedem osiem dziewięć".split()
dziesiatki = [u""] + u"""dziesięć dwadzieścia  trzydzieści czterdzieści
     pięćdziesiąt sześćdziesiąt siedemdziesiąt osiemdziesiąt dziewięćdziesiąt""".split()
nastki = u"""dziesięć jedenaście dwanaście trzynaście czternaście piętnaście
        szesnaście siedemnaście osiemnaście dziewiętnaście""".split()
setki = [u""]+ u"""sto dwieście trzysta czterysta pięćset sześćset siedemset osiemset
              dziewięćset""".split()

ws=u"""x x x
   tysiąc tysiące tysięcy
   milion miliony milionów
   miliard miliardy miliardów
   bilion biliony bilionów"""
wielkie = [ l.split() for l in ws.split('\n') ]

##zlotowki=u"""złoty złote złotych""".split()
##grosze=u"""grosz grosze groszy""".split()

# There are also some functions, by dowgird, so I haven't even looked into
# them.

def _slownie3cyfry(liczba, plec='M'):
    if plec=='M':
        jednostki = jednostkiM
    else:
        jednostki = jednostkiF

    je = liczba % 10
    dz = (liczba//10) % 10
    se = (liczba//100) % 10
    slowa=[]

    if se>0:
        slowa.append(setki[se])
    if dz==1:
        slowa.append(nastki[je])
    else:
        if dz>0:
            slowa.append(dziesiatki[dz])
        if je>0:
            slowa.append(jednostki[je])
    retval = " ".join(slowa)
    return retval

def _przypadek(liczba):
    je = liczba % 10
    dz = (liczba//10)  % 10

    if liczba == 1:
        typ = 0       #jeden tysiąc"
    elif dz==1 and je>1:  # naście tysięcy
        typ = 2
    elif  2<=je<=4:
        typ = 1       # [k-dziesiąt/set] [dwa/trzy/czery] tysiące
    else:
        typ = 2       # x tysięcy

    return typ

def lslownie(liczba, plec='M'):
    """Liczba całkowita słownie"""
    trojki = []
    if liczba==0:
        return u'zero'
    while liczba>0:
        trojki.append(liczba % 1000)
        liczba = liczba // 1000
    slowa = []
    for i,n in enumerate(trojki):
        if n>0:
            if i>0:
                p = _przypadek(n)
                w = wielkie[i][p]
                slowa.append(_slownie3cyfry(n, plec)+u" "+w)
            else:
                slowa.append(_slownie3cyfry(n, plec))
    slowa.reverse()
    return ' '.join(slowa)

def cosslownie(liczba,cos, plec='M'):
    """Słownie "ileś cosiów"

    liczba - int
    cos - tablica przypadków [coś, cosie, cosiów]"""
    #print liczba
    #print cos[_przypadek(liczba)]
    return lslownie(liczba, plec)+" " + cos[_przypadek(liczba)]

##def kwotaslownie(liczba, format = 0):
##    """Słownie złotych, groszy.
##
##    liczba - float, liczba złotych z groszami po przecinku
##    format - jesli 0, to grosze w postaci xx/100, słownie w p. przypadku
##    """
##    lzlotych = int(liczba)
##    lgroszy = int (liczba * 100 + 0.5 ) % 100
##    if format!=0:
##        groszslownie = cosslownie(lgroszy, grosze)
##    else:
##        groszslownie = '%d/100' % lgroszy
##    return cosslownie(lzlotych, przypzl) + u" " +  groszslownie
##

# As you remember, ``cardinal()`` must be defined, this is the function which
# will be used by SR0WX modules. This functions was also written by dowgrid,
# modified by me. (Is function's name proper?)
def cardinal(no, units=[u"",u"",u""], gender='M'):
    """Zamienia liczbę zapisaną cyframi na zapis słowny, opcjonalnie z jednostkami
w odpowiednim przypadku. Obsługuje liczby ujemne."""
    if no<0:
        return (u"minus " + cosslownie(-no, units, plec=gender)).replace(u"jeden tysiąc", u"tysiąc",1).encode("utf-8")
    else:
        return cosslownie(no, units, plec=gender).replace(u"jeden tysiąc", u"tysiąc",1).encode("utf-8")

# This one tiny simply removes diactrics (lower case only). This function
# must be defined even if your language doesn't use diactrics (like English),
# for example as a simple ``return text``.
def removeDiacritics(text, remove_spaces=False):
    rv= text.replace("ą","a").replace("ć","c").replace("ę","e").\
        replace("ł","l").replace("ń","n").replace("ó","o").replace("ś","s").\
        replace("ź","z").replace("ż","z")
    if remove_spaces==False:
        return rv
    else:
        return rv.replace(' ','_')

# The last one changes ISO structured date time into word representation.
# It doesn't return year value.
def readISODT(ISODT):
    _rv=() # return value
    y,m,d,hh,mm,ss= ( int(ISODT[0:4]),   int(ISODT[5:7]),   int(ISODT[8:10]),
                      int(ISODT[11:13]), int(ISODT[14:16]), int(ISODT[17:19]) )

    # miesiąc
    _M = ["","stycznia","lutego","marca","kwietnia","maja","czerwca","lipca",
         "sierpnia","września","października","listopada","grudnia"]
    Mslownie = _M[m]
    # dzień
    _j = ["","pierwszego","drugiego","trzeciego","czwartego","piątego","szóstego",
        "siódmego","ósmego","dziewiątego","dziesiątego","jedenastego",
        "dwunastego","trzynastego","czternastego","piętnastego","szesnastego",
        "siedemnastego","osiemnastego","dziewiętnastego"]
    _d = ["","","dwudziestego","trzydziestego"]

    if d<20: Dslownie = _j[d]
    else: Dslownie = " ".join( (_d[d/10], _j[d%10]) )

    _j = ["zero","pierwsza","druga","trzecia","czwarta","piąta","szósta",
          "siódma","ósma","dziewiąta","dziesiąta","jedenasta","dwunasta",
          "trzynasta","czternasta","piętnasta","szesnasta","siedemnasta",
          "osiemnasta","dziewiętnasta"]

    if hh<20: HHslownie = _j[hh]
    elif hh==20: HHslownie="dwudziesta"
    else: HHslownie = " ".join( ("dwudziesta", _j[hh%10]) )

    MMslownie = cardinal(mm).replace("zero","zero_zero")

    return " ".join( (Dslownie, Mslownie, "godzina", HHslownie, MMslownie) )

def readISODate(ISODate):
    _rv=() # return value
    y,m,d,hh,mm,ss= ( int(ISODate[0:4]),   int(ISODate[5:7]),   int(ISODate[8:10]),
                      int(ISODate[11:13]), int(ISODate[14:16]), int(ISODate[17:19]) )

    # miesiąc
    _M = ["","stycznia","lutego","marca","kwietnia","maja","czerwca","lipca",
         "sierpnia","września","października","listopada","grudnia"]
    Mslownie = _M[m]
    # dzień
    _j = ["","pierwszego","drugiego","trzeciego","czwartego","piątego","szóstego",
        "siódmego","ósmego","dziewiątego","dziesiątego","jedenastego",
        "dwunastego","trzynastego","czternastego","piętnastego","szesnastego",
        "siedemnastego","osiemnastego","dziewiętnastego"]
    _d = ["","","dwudziestego","trzydziestego"]

    if d<20: Dslownie = _j[d]
    else: Dslownie = " ".join( (_d[d/10], _j[d%10]) )

    return " ".join( (Dslownie, Mslownie) )


def readHour(dt):
    return removeDiacritics(readISODT('0000-00-00 '+str(dt.hour).rjust(2, '0')+':'+str(dt.minute).rjust(2, '0')+':00'))

def readHourLen(hour):
    ss = hour.seconds
    hh = ss/3600
    mm = (ss-hh*3600)/60
    return removeDiacritics(" ".join( (cardinal(hh, hrs, gender='F'), cardinal(mm, mns, gender='F')) ))

def readCallsign(call):
    rv = ''
    for c in call.lower():
        if c in 'abcdefghijklmnopqrstuvwxyz':
            rv=rv+c+' '
        elif c in '0123456789':
            rv=rv+removeDiacritics(cardinal(int(c)))+' '
        elif c=='/':
            rv=rv+'lamane '
    
    return rv

# ##########################################
#
# module dependant words
# #############################################

class m:
    pass

y_weather = m()
y_weather.conditions = {
    '0':  'tornado',                     # tornado
    '1':  'burza tropikalna',            # tropical storm
    '2':  'huragan',                     # hurricane
    '3':  'silne burze',                 # severe thunderstorms
    '4':  'burza',                       # thunderstorms
    '5':  'deszcz ze śniegiem',          # mixed rain and snow
    '6':  'deszcz i deszcz ze śniegiem', # mixed rain and sleet
    '7':  'śnieg i deszcz ze śniegiem',  # mixed snow and sleet
    '8':  'marznąca mżawka',             # freezing drizzle
    '9':  'mżawka',                      # drizzle
    '10': 'marznący deszcz',             # freezing rain
    '11': 'deszcz',                      # showers
    '12': 'deszcz',                      # showers
    '13': 'śnieg',                       # snow flurries
    '14': 'słaby śnieg',                 # light snow showers
    '15': 'zawieje śnieżne',             # blowing snow
    '16': 'śnieg',                       # snow
    '17': 'grad',                        # hail
    '18': 'deszcz ze śniegiem',          # sleet
    '19': 'pył',                         # dust
    '20': 'zamglenia',                   # foggy
    '21': 'mgła',                        # haze
    '22': 'smog',                        # smoky
    '23': 'silny wiatr',                 # blustery
    '24': 'wietrznie',                   # windy
    '25': 'przymrozki',                  # cold
    '26': 'pochmurno',                   # cloudy
    '27': 'pochmurno',                   # mostly cloudy (night)
    '28': 'pochmurno',                   # mostly cloudy (day)
    '29': 'częściowe zachmurzenie',      # partly cloudy (night)
    '30': 'częściowe zachmurzenie',      # partly cloudy (day)
    '31': 'bezchmurnie',                 # clear (night)
    '32': 'bezchmurnie',                 # sunny
    '33': 'słabe zachmurzenie',          # fair (night)
    '34': 'słabe zachmurzenie',          # fair (day)
    '35': 'deszcz i grad',               # mixed rain and hail
    '36': 'wysokie temperatury',         # hot
    '37': 'burza',                       # isolated thunderstorms
    '38': 'burza',                       # scattered thunderstorms
    '39': 'burza',                       # scattered thunderstorms
    '40': 'przelotne opady',             # scattered showers
    '41': 'intensywne opady śniegu',     # heavy snow
    '42': 'przelotne opady śniegu',      # scattered snow showers
    '43': 'intensywne opady śniegu',     # heavy snow
    '44': 'częściowe zachmurzenie',      # partly cloudy
    '45': 'burza',                       # thundershowers
    '46': 'śnieg',                       # snow showers
    '47': 'burza',                       # isolated thundershowers
    '3200': '',                          # not available
}


# These dictionaries are used by meteoalarm module.
meteoalarmAwarenesses = [
    "",
    "silny_wiatr",
    "snieg_lub_oblodzenie",
    "burze",
    "mgly",
    "wysokie_temperatury",
    "niskie_temperatury",
    "zjawiska_strefy_brzegowej",
    "pozary_lasow",
    "lawiny",
    "intensywne_opady_deszczu",
    "inne_zagrozenia"]
meteoalarmAwarenessLvl = [
    "nieokreslony",
    "",
    "niski",
    "sredni",
    "wysoki"]

meteoalarmAwarenessLevel = "poziom_zagrozenia"
meteoalarmRegions = {
    'PL001':"mazowieckiego", 
    'PL002':"lubuskiego", 
    'PL003':"zachodniopomorskiego",
    'PL004':"pomorskiego", 
    'PL005':"dolnoslaskiego", 
    'PL006':"opolskiego",
    'PL007':"śląskiego", 
    'PL008':"malopolskiego", 
    'PL009':"podkarpackiego", 
    'PL010':"świętokrzyskiego",
    'PL011':"łódzkiego", 
    'PL012':"wielkopolskiego", 
    'PL013':"kujawsko_pomorskiego", 
    'PL014':"warminsko_mazurskiego", 
    'PL015':"lubelskiego",
    'PL016':"podlaskiego",
    'IE003':"dolnoslaskiego",
}

meteoalarmAwareness   = "zagrozenia_meteorologiczne_dla_wojewodztwa"
today    = "dzis"
tomorrow = "jutro"


# World Weather Online


wwo_weather_codes = {
    '113':'bezchmurnie', # Clear/Sunny
    '116':'częściowe zachmurzenie', # Partly Cloudy
    '119':'pochmurno', # Cloudy
    '122':'zachmurzenie całkowite', # Overcast
    '143':'zamglenia', # Mist
    '176':'lokalne przelotne opady deszczu', # Patchy rain nearby
    '179':'śnieg', # Patchy snow nearby
    '182':'śnieg z deszczem', # Patchy sleet nearby
    '185':'lokalna przelotna marznąca mżawka', # Patchy freezing drizzle nearby
    '200':'lokalne burze', # Thundery outbreaks in nearby
    '227':'zamieć śnieżna', # Blowing snow
    '230':'zamieć śnieżna', # Blizzard
    '248':'mgła', # Fog
    '260':'marznąca mgła', # Freezing fog
    '263':'mżawka', # Patchy light drizzle
    '266':'mżawka', # Light drizzle
    '281':'marznąca mżawka', # Freezing drizzle
    '284':'marznąca mżawka', # Heavy freezing drizzle
    '293':'lokalny słaby deszcz', # Patchy light rain
    '296':'słaby deszcz', # Light rain
    '299':'przelotne opady deszczu', # Moderate rain at times
    '302':'umiarkowane opady deszczu', # Moderate rain
    '305':'przelotne ulewy', # Heavy rain at times
    '308':'ulewy', # Heavy rain
    '311':'słabe opady marznącego deszczu', # Light freezing rain
    '314':'umiarkowane opady marznącego deszczu', # Moderate or Heavy freezing rain
    '317':'słabe opady śniegu z deszczem', # Light sleet
    '320':'umiarkowane lub ciężkie opady śniegu z deszczem', # Moderate or heavy sleet
    '323':'słabe opady śniegu', # Patchy light snow
    '326':'słabe opady śniegu', # Light snow
    '329':'umiarkowane opady śniegu', # Patchy moderate snow
    '332':'umiarkowane opady śniegu', # Moderate snow
    '335':'opady śniegu', # Patchy heavy snow
    '338':'intensywne_opady_sniegu', # Heavy snow
    '350':'grad', # Ice pellets
    '353':'słabe przelotne opady deszczu', # Light rain shower
    '356':'przelotne opady deszczu', # Moderate or heavy rain shower
    '359':'ulewny deszcz', # Torrential rain shower
    '362':'słabe opady śniegu z deszczem', # Light sleet showers
    '365':'umiarkowane opady śniegu z deszczem', # Moderate or heavy sleet showers
    '368':'słabe opady śniegu', # Light snow showers
    '371':'umiarkowane opady śniegu', # Moderate or heavy snow showers
    '374':'słabe opady śniegu ziarnistego', # Light showers of ice pellets
    '377':'umiarkowane opady śniegu ziarnistego', # Moderate or heavy showers of ice pellets
    '386':'burza', # Patchy light rain in area with thunder
    '389':'burza', # Moderate or heavy rain in area with thunder
    '392':'burza śnieżna', # Patchy light snow in area with thunder
    '395':'burza śnieżna', # Moderate or heavy snow in area with thunder
}

# HSCR_laviny
hscr_welcome = "komunikat_czeskiej_sluzby_ratownictwa_gorskiego"
hscr_region = {"K": "w_karkonoszach obowiazuje", "J": "w_jesionikach_i_masywie_snieznika obowiazuje"}
avalancheLevel = ['']+[i+' stopien_zagrozenia_lawinowego' for i in ['pierwszy', 'drugi', 'trzeci', 'czwarty', 'piaty_najwyzszy'] ]
hscr_tendention = ['', '', 'tendencja_spadkowa', 'tendencja_wzrostowa']

# GOPR_lawiny
gopr_welcome = 'komunikat_gorskiego_ochotniczego_pogotowia_ratunkowego'
gopr_region = ["", "w_karkonoszach obowiazuje", "", "w_regionie_babiej_gory obowiazuje", "w_pieninach obowiazuje", "w_bieszczadach obowiazuje"]
avalancheLevel = ['']+[i+' stopien_zagrozenia_lawinowego' for i in ['pierwszy', 'drugi', 'trzeci', 'czwarty', 'piaty najwyzszy'] ]
gopr_tendention = ['', '', 'tendencja_spadkowa', 'tendencja_wzrostowa']

# povodi_cz

# awareness levels for povodi_cz
povodi_cz_welcome = 'komunikat_czeskiego_instytutu_hydrometeorologicznego'
awalvls = ['',
    'stopien_czuwania',              # bdelosť            State of Alert
    'stopien_gotowosci',             # pohotovosť         State of Emergency
    'stopien_zagrozenia',            # ohrozenie          State of Danger
    'stopien_ekstremalnych_powodzi'  # extrémna povodeň   extreme flood
    ]

river = 'rzeka'
station = 'wodowskaz'


source='zrodlo'
