# -*- coding: utf-8 -*-
import string

# key - poi type_id, value = ((possible type names), type name to add)
RENAMING_RULES = {
    1001: (['мойка'], 'Автомойка'),
    1002: (['рынок'], 'Авторынок'),
    1004: ([], 'Автосервис'),
    1026: (['мото'], 'Мотосалон'),
    3017: ([], 'Ломбард'),
    3020: (['турист', 'бюро'], 'Турбюро'),
    3030: (['парик'], 'Парикмахерская'),
    3032: (['парик', 'салон'], 'Салон красоты'),
    3033: (['соляр'], 'Солярий'),
    3034: (['тату'], 'Тату-салон'),
    4001: ([],'Банк'),
    4002: (['банк'],'Банкомат'),
    4005: (['центр'],'Бизнес-центр'),
    5001: ([],'Бассейн'),
    5004: ([],'Спорткомплекс'),
    5008: (['спортшкола'],'Спортивная школа'),
    5012: ([],'Яхт-клуб'),
    5016: ([],'Аэроклуб'),
    6002: (['кафе'],'Интернет-кафе'),
    6005: (['салон'], 'Салон связи'),
    7001: ([], 'Аптека'),
    7003: ([], 'Больница'),
    7005: ([], 'Госпиталь'),
    7006: (['медиц'], 'Мед. центр'),
    7007: ([], 'Поликлиника'),
    7008: (['родильный'], 'Роддом'),
    7009: (['стом'], 'Стоматология'),
    7010: (['травм'], 'Травмпункт'),
    8001: ([], 'Бар'),
    8002: ([], 'Кафе'),
    8003: ([], 'Кофейня'),
    8005: ([], 'Ресторан'),
    9001: ([], 'Гостиница'),
    9002: ([], 'Кемпинг'),
    9003: ([], 'Мотель'),
    9005: ([], 'Хостел'),
    11002: ([], 'Аэропорт'),
    11003: (['вокзал'], 'Ж/Д вокзал'),
    11004: (['станция'], 'Ж/Д станция'),
    11006: ([], 'Метро'),
    11014: ([], 'Велопрокат'),
    12001: ([], 'Аквапарк'),
    12006: ([], 'Боулинг'),
    12007: (['дельфин'], 'Дельфинарий'),
    12010: ([], 'Зоопарк'),
    12021: ([], 'Пляж'),
    12033: ([], 'Казино'),
    12035: ([], 'Санаторий'),
    13004: ([], 'Консерватория'),
    13007: ([], 'Музей'),
    13008: ([], 'Планетарий'),
    13009: ([], 'Театр'),
    13010: ([], 'Цирк'),
    13011: ([], 'Кинотеатр'),
    13012: ([], 'Выставочный центр'),
    14019: (['изолятор', 'колония-поселение'], 'Тюрьма'),
    15005: ([], 'Зоомагазин'),
    15036: ([], 'Гипермаркет'),
    15037: ([], 'Молл'),
    16001: ([], 'Школа'),
    16003: ([], 'Детский сад'),
}

ABBREVIATIONS_UTF8 =set(['ООО', 'ОАО', 'ЦАО', 'САО', 'СВАО', 'ВАО', 'ЮВАО', 'ЮЗАО', 'ЗАО', 'СЗАО', 'НАО', 'ТАО',
        'XXI', 'XX', 'XXX', 'XVIII', 'XVII', 'XVI', 'XIV', 'ВТБ', 
        'УВД', 'ДПС', 'ГИБДД', 'МВД', 'МСК', 'МТС', 'ОПС', 'ЦГБ', 'МФЦ',
        'ОУФМС', 'ФМС', 'УФМС', 'АТС', 'ДШИ', 'ИП', 'ЦПП', 'ВПО', 'БРК', 'ФНС', 'АЗС', 'ВПА', 'ТПК', 
        'MAF', 'МТС', 'ДЮСШ', 'СДЮШОР', 'ИКИМСО', 'ОГИБДД', 'ПТФ', 'ФКП', 'ТФ', 'АО', 'АТС', 'СОШ', 'РАЙПО',
        'ГУ', 'РЭГ', 'БПФ', 'РФ', 'МО', 'ХЦ'])
ABBREVIATIONS_UTF8.update(string.ascii_uppercase)
ABBREVIATIONS = set([i.decode('utf-8') for i in ABBREVIATIONS_UTF8])
ABBREVIATIONS_IN_BRACKETS = set()
for i in ABBREVIATIONS:
    ABBREVIATIONS_IN_BRACKETS.add(u'('+i+u')')
ABBREVIATIONS.update(ABBREVIATIONS_IN_BRACKETS)

TITLES_UTF8 = set(['РОССИЯ', 'РОССИИ', 'МОСКВА', 'MOSCOW', 'МОСКВЫ'])
TITLES = set([i.decode('utf-8') for i in TITLES_UTF8])

def _FixNameCase(name):
    ''' Convert POI name XXXX YYYY to tile Xxxx yyyy.
        Cause most POI names are in lowercase
    '''
    name = name.decode('utf-8')
    name_parts = name.split(' ')
    res = []
    for (i,w) in enumerate(name_parts):
        w_l = w.lower()
        w_u = w.upper()
        if w_u in ABBREVIATIONS:
            res.append(w_u)
        else:
            if i==0: # first word:
                res.append(w.title())
            elif u'.' in w:
                res.append(w)
            elif w_u == w: #if was uppercase - convert
                if w_u in TITLES:
                    res.append(w_l.title())
                else:
                    res.append(w_l)
            else: #if was not uppercase - do nothing
                res.append(w)
    return ' '.join(res).encode('utf-8')

def _Rename(type_id, name):
    if type_id not in RENAMING_RULES: return name
    (terms, insert) = RENAMING_RULES[type_id]
    insert_l = insert.decode('utf-8').lower().encode('utf-8')
    name_l = name.decode('utf-8').lower().encode('utf-8')
    name_parts = name_l.split(' ')
    if insert_l in name_parts:
        return name
    for i in terms:
        if i in name_parts:
            return name
    return ' '.join((insert,name))

def Rename(type_id, name):
    return _FixNameCase(_Rename(type_id, name))

if __name__ == '__main__':
    print '*** Renaming test ***'
    tests = [
        (1001, 'Автомойка Бест'),
        (1001, 'Мойка Бест'),
        (1001, 'Бест Авто', 'Автомойка Бест Авто'),
        (11006, 'Фили', 'Метро Фили'),
        (11006, 'Метро Фили'),
        (11006, 'метро Фили'),
        (11006, 'Фили метро'),
        (11006, 'Станция метро Фили'),
        (5012, 'Клуб "Я"', 'Яхт-клуб Клуб "Я"'),
        (5016, 'Клуб "А"', 'Аэроклуб Клуб "А"'),
        (7009, 'Зубвон', 'Стоматология Зубвон'),
        (7009, 'Стоматология Зубвон'),
        (8001, 'БарБар', 'Бар БарБар'),
        (14019, 'Лефортово', 'Тюрьма Лефортово'),
        (14019, 'Следственный изолятор №1', 'Следственный изолятор №1'),
        (14019, 'Колония-поселение №1', 'Колония-поселение №1')
    ]
    for i in tests:
        res = _Rename(i[0], i[1])
        print i[1], '->', res, '-- OK ' if i[-1] == res else ' -- ERROR'

    print '*** Case conversion test ***'
    tests = [
        ('Автомойка Бест',),
        ('АВТОМОЙКА БЕСТ РОССИЯ (РФ)', 'Автомойка бест Россия (РФ)'),
    ]
    for i in tests:
        res = _FixNameCase(i[0])
        print i[0], '->', res, '-- OK ' if i[-1] == res else ' -- ERROR'
