#!/usr/bin/env python


__license__   = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'

from struct import pack

from calibre.utils.localization import lang_as_iso639_1

lang_codes = {
        }

main_language = {
         0 : 'NEUTRAL',
         54 : 'AFRIKAANS',
         28 : 'ALBANIAN',
         1 : 'ARABIC',
         43 : 'ARMENIAN',
         77 : 'ASSAMESE',
         44 : 'AZERI',
         45 : 'BASQUE',
         35 : 'BELARUSIAN',
         69 : 'BENGALI',
         2 : 'BULGARIAN',
         3 : 'CATALAN',
         4 : 'CHINESE',
         # 26 : "CROATIAN",
         5 : 'CZECH',
         6 : 'DANISH',
         19 : 'DUTCH',
         9 : 'ENGLISH',
         37 : 'ESTONIAN',
         56 : 'FAEROESE',
         41 : 'FARSI',
         11 : 'FINNISH',
         12 : 'FRENCH',
         55 : 'GEORGIAN',
         7 : 'GERMAN',
         8 : 'GREEK',
         71 : 'GUJARATI',
         13 : 'HEBREW',
         57 : 'HINDI',
         14 : 'HUNGARIAN',
         15 : 'ICELANDIC',
         33 : 'INDONESIAN',
         16 : 'ITALIAN',
         17 : 'JAPANESE',
         75 : 'KANNADA',
         63 : 'KAZAK',
         87 : 'KONKANI',
         18 : 'KOREAN',
         38 : 'LATVIAN',
         39 : 'LITHUANIAN',
         47 : 'MACEDONIAN',
         62 : 'MALAY',
         76 : 'MALAYALAM',
         58 : 'MALTESE',
         78 : 'MARATHI',
         97 : 'NEPALI',
         20 : 'NORWEGIAN',
         72 : 'ORIYA',
         21 : 'POLISH',
         22 : 'PORTUGUESE',
         70 : 'PUNJABI',
         23 : 'RHAETOROMANIC',
         24 : 'ROMANIAN',
         25 : 'RUSSIAN',
         59 : 'SAMI',
         79 : 'SANSKRIT',
         26 : 'SERBIAN',
         27 : 'SLOVAK',
         36 : 'SLOVENIAN',
         46 : 'SORBIAN',
         10 : 'SPANISH',
         48 : 'SUTU',
         65 : 'SWAHILI',
         29 : 'SWEDISH',
         73 : 'TAMIL',
         68 : 'TATAR',
         74 : 'TELUGU',
         30 : 'THAI',
         49 : 'TSONGA',
         50 : 'TSWANA',
         31 : 'TURKISH',
         34 : 'UKRAINIAN',
         32 : 'URDU',
         67 : 'UZBEK',
         42 : 'VIETNAMESE',
         52 : 'XHOSA',
         53 : 'ZULU',
}

sub_language = {
           0 : 'NEUTRAL',
           # 1 : "ARABIC_SAUDI_ARABIA",
           # 2 : "ARABIC_IRAQ",
           # 3 : "ARABIC_EGYPT",
           # 4 : "ARABIC_LIBYA",
           # 5 : "ARABIC_ALGERIA",
           # 6 : "ARABIC_MOROCCO",
           # 7 : "ARABIC_TUNISIA",
           # 8 : "ARABIC_OMAN",
           # 9 : "ARABIC_YEMEN",
           # 10 : "ARABIC_SYRIA",
           # 11 : "ARABIC_JORDAN",
           # 12 : "ARABIC_LEBANON",
           # 13 : "ARABIC_KUWAIT",
           # 14 : "ARABIC_UAE",
           # 15 : "ARABIC_BAHRAIN",
           # 16 : "ARABIC_QATAR",
           # 1 : "AZERI_LATIN",
           # 2 : "AZERI_CYRILLIC",
           # 1 : "CHINESE_TRADITIONAL",
           # 2 : "CHINESE_SIMPLIFIED",
           # 3 : "CHINESE_HONGKONG",
           # 4 : "CHINESE_SINGAPORE",
           # 1 : "DUTCH",
           # 2 : "DUTCH_BELGIAN",
           # 1 : "FRENCH",
           # 2 : "FRENCH_BELGIAN",
           # 3 : "FRENCH_CANADIAN",
           # 4 : "FRENCH_SWISS",
           # 5 : "FRENCH_LUXEMBOURG",
           # 6 : "FRENCH_MONACO",
           # 1 : "GERMAN",
           # 2 : "GERMAN_SWISS",
           # 3 : "GERMAN_AUSTRIAN",
           # 4 : "GERMAN_LUXEMBOURG",
           # 5 : "GERMAN_LIECHTENSTEIN",
           # 1 : "ITALIAN",
           # 2 : "ITALIAN_SWISS",
           # 1 : "KOREAN",
           # 1 : "LITHUANIAN",
           # 1 : "MALAY_MALAYSIA",
           # 2 : "MALAY_BRUNEI_DARUSSALAM",
           # 1 : "NORWEGIAN_BOKMAL",
           # 2 : "NORWEGIAN_NYNORSK",
           # 2 : "PORTUGUESE",
           # 1 : "PORTUGUESE_BRAZILIAN",
           # 2 : "SERBIAN_LATIN",
           3 : 'SERBIAN_CYRILLIC',
           # 1 : "SPANISH",
           # 2 : "SPANISH_MEXICAN",
           4 : 'SPANISH_GUATEMALA',
           5 : 'SPANISH_COSTA_RICA',
           6 : 'SPANISH_PANAMA',
           7 : 'SPANISH_DOMINICAN_REPUBLIC',
           8 : 'SPANISH_VENEZUELA',
           9 : 'SPANISH_COLOMBIA',
           10 : 'SPANISH_PERU',
           11 : 'SPANISH_ARGENTINA',
           12 : 'SPANISH_ECUADOR',
           13 : 'SPANISH_CHILE',
           14 : 'SPANISH_URUGUAY',
           15 : 'SPANISH_PARAGUAY',
           16 : 'SPANISH_BOLIVIA',
           17 : 'SPANISH_EL_SALVADOR',
           18 : 'SPANISH_HONDURAS',
           19 : 'SPANISH_NICARAGUA',
           20 : 'SPANISH_PUERTO_RICO',
           # 1 : "SWEDISH",
           # 2 : "SWEDISH_FINLAND",
           1 : 'UZBEK_LATIN',
           2 : 'UZBEK_CYRILLIC',
           }

IANA_MOBI = \
    {None: {None: (0, 0)},
     'af': {None: (54, 0)},
     'ar': {None: (1, 0),
            'AE': (1, 56),
            'BH': (1, 60),
            'DZ': (1, 20),
            'EG': (1, 12),
            'JO': (1, 44),
            'KW': (1, 52),
            'LB': (1, 48),
            'MA': (1, 24),
            'OM': (1, 32),
            'QA': (1, 64),
            'SA': (1, 4),
            'SY': (1, 40),
            'TN': (1, 28),
            'YE': (1, 36)},
     'as': {None: (77, 0)},
     'az': {None: (44, 0)},
     'be': {None: (35, 0)},
     'bg': {None: (2, 0)},
     'bn': {None: (69, 0)},
     'ca': {None: (3, 0)},
     'cs': {None: (5, 0)},
     'da': {None: (6, 0)},
     'de': {None: (7, 0),
            'AT': (7, 12),
            'CH': (7, 8),
            'LI': (7, 20),
            'LU': (7, 16)},
     'el': {None: (8, 0)},
     'en': {None: (9, 0),
            'AU': (9, 12),
            'BZ': (9, 40),
            'CA': (9, 16),
            'GB': (9, 8),
            'IE': (9, 24),
            'JM': (9, 32),
            'NZ': (9, 20),
            'PH': (9, 52),
            'TT': (9, 44),
            'US': (9, 4),
            'ZA': (9, 28),
            'ZW': (9, 48)},
     'es': {None: (10, 0),
            'AR': (10, 44),
            'BO': (10, 64),
            'CL': (10, 52),
            'CO': (10, 36),
            'CR': (10, 20),
            'DO': (10, 28),
            'EC': (10, 48),
            'ES': (10, 4),
            'GT': (10, 16),
            'HN': (10, 72),
            'MX': (10, 8),
            'NI': (10, 76),
            'PA': (10, 24),
            'PE': (10, 40),
            'PR': (10, 80),
            'PY': (10, 60),
            'SV': (10, 68),
            'UY': (10, 56),
            'VE': (10, 32)},
     'et': {None: (37, 0)},
     'eu': {None: (45, 0)},
     'fa': {None: (41, 0)},
     'fi': {None: (11, 0)},
     'fo': {None: (56, 0)},
     'fr': {None: (12, 0),
            'BE': (12, 8),
            'CA': (12, 12),
            'CH': (12, 16),
            'FR': (12, 4),
            'LU': (12, 20),
            'MC': (12, 24)},
     'gu': {None: (71, 0)},
     'he': {None: (13, 0)},
     'hi': {None: (57, 0)},
     'hr': {None: (26, 0)},
     'hu': {None: (14, 0)},
     'hy': {None: (43, 0)},
     'id': {None: (33, 0)},
     'is': {None: (15, 0)},
     'it': {None: (16, 0),
            'CH': (16, 8),
            'IT': (16, 4)},
     'ja': {None: (17, 0)},
     'ka': {None: (55, 0)},
     'kk': {None: (63, 0)},
     'kn': {None: (75, 0)},
     'ko': {None: (18, 0)},
     'kok': {None: (87, 0)},
     'lt': {None: (39, 0)},
     'lv': {None: (38, 0)},
     'mk': {None: (47, 0)},
     'ml': {None: (76, 0)},
     'mr': {None: (78, 0)},
     'ms': {None: (62, 0)},
     'mt': {None: (58, 0)},
     'ne': {None: (97, 0)},
     'nl': {None: (19, 0),
            'BE': (19, 8)},
     'no': {None: (20, 0)},
     'or': {None: (72, 0)},
     'pa': {None: (70, 0)},
     'pl': {None: (21, 0)},
     'pt': {None: (22, 0),
            'BR': (22, 4),
            'PT': (22, 8)},
     'rm': {None: (23, 0)},
     'ro': {None: (24, 0)},
     'ru': {None: (25, 0)},
     'sa': {None: (79, 0)},
     'se': {None: (59, 0)},
     'sk': {None: (27, 0)},
     'sl': {None: (36, 0)},
     'sq': {None: (28, 0)},
     'sr': {None: (26, 12),
            'RS': (26, 12)},
     'st': {None: (48, 0)},
     'sv': {None: (29, 0),
            'FI': (29, 8)},
     'sw': {None: (65, 0)},
     'ta': {None: (73, 0)},
     'te': {None: (74, 0)},
     'th': {None: (30, 0)},
     'tn': {None: (50, 0)},
     'tr': {None: (31, 0)},
     'ts': {None: (49, 0)},
     'tt': {None: (68, 0)},
     'uk': {None: (34, 0)},
     'ur': {None: (32, 0)},
     'uz': {None: (67, 0),
            'UZ': (67, 8)},
     'vi': {None: (42, 0)},
     'wen': {None: (46, 0)},
     'xh': {None: (52, 0)},
     'zh': {None: (4, 0),
            'CN': (4, 8),
            'HK': (4, 12),
            'SG': (4, 16),
            'TW': (4, 4)},
     'zu': {None: (53, 0)}}


def iana2mobi(icode):
    langdict, subtags = IANA_MOBI[None], []
    if icode:
        subtags = list(icode.split('-'))
        while len(subtags) > 0:
            lang = subtags.pop(0).lower()
            lang = lang_as_iso639_1(lang)
            if lang and lang in IANA_MOBI:
                langdict = IANA_MOBI[lang]
                break

    mcode = langdict[None]
    while len(subtags) > 0:
        subtag = subtags.pop(0)
        if subtag not in langdict:
            subtag = subtag.title()
        if subtag not in langdict:
            subtag = subtag.upper()
        if subtag in langdict:
            mcode = langdict[subtag]
            break
    return pack('>HBB', 0, mcode[1], mcode[0])


def mobi2iana(langcode, sublangcode):
    prefix = suffix = None
    for code, d in IANA_MOBI.items():
        for subcode, t in d.items():
            cc, cl = t
            if cc == langcode:
                prefix = code
            if cl == sublangcode:
                suffix = subcode.lower() if subcode else None
                break
        if prefix is not None:
            break
    if prefix is None:
        return 'und'
    if suffix is None:
        return prefix
    return prefix + '-' + suffix
