# coding: utf-8
from django_rossvyaz.models import PhoneCode


replace_data = {
    'Кемеровская обл.': 'Кемеровская область',
    'Карачаево-Черкесская Республика': 'Карачаево - Черкесская Республика',
    'Калужская обл.': 'Калужская область',
    'Еврейская автономная обл.': 'Еврейская автономная область',
    'г. Якутск|Республика Саха /Якутия/': 'Якутск и Республика Саха',
    'г. Тюмень|Тюменская обл.': 'Тюмень и Тюменская область',
    'г. Ставрополь|Ставропольский край': 'Ставрополь и Ставропольский край',
    'г. Сочи|Краснодарский край': 'Сочи и Краснодарский край',
    'г. Севастополь и Республика Крым': 'Севастополь и Республика Крым',
    'г. Севастополь': 'Севастополь',
    'г. Саранск|Республика Мордовия': 'Саранск и Республика Мордовия',
    'г. Санкт-Петербург и Ленинградская область': 'Санкт-Петербург и Ленинградская область',
    'г. Санкт - Петербург и Ленинградская область': 'Санкт-Петербург и Ленинградская область',
    'г. Псков|Псковская обл.': 'Псков и Псковская область',
    'г. Оренбург|Оренбургская обл.': 'Оренбург и Оренбургская область',
    'г. Норильск|Красноярский край': 'Норильск и Красноярский край',
    'г. Назрань|Республика Ингушетия': 'Назрань и Республика Ингушетия',
    'г. Мурманск|Мурманская обл.': 'Мурманск и Мурманская область',
    'г. Москва и Московская область': 'Москва и Московская область',
    'г. Москва': 'Москва',
    'г. Курган|Курганская обл.': 'Курган и Курганская область',
    'г. Красноярск|Красноярский край': 'Красноярск и Красноярский край',
    'г. Кострома|р-н Костромской|Костромская обл.': 'Кострома и Костромская область',
    'г. Кемерово|Кемеровская обл.': 'Кемерово и Кемеровская область',
    'г. Казань|Республика Татарстан': 'Казань и Республика Татарстан',
    'г. Владимир|Владимирская обл.': 'Владимир и Владимирская область',
    'г. Владивосток|Приморский край': 'Владивосток и Приморский край',
    'Воронежская обл.': 'Воронежская область',
    'Вологодская обл.': 'Вологодская область',
    'Волгоградская обл.': 'Волгоградская область',
    'Владимирская обл.': 'Владимирская область',
    'Брянская обл.': 'Брянская область',
    'Белгородская обл.': 'Белгородская область',
    'Астраханская обл.': 'Астраханская область',
    'Архангельская обл.': 'Архангельская область',
    'Амурская обл.': 'Амурская область',
    'Тверская обл.': 'Тверская область',
    'Челябинская обл.': 'Челябинская область',
    'Свердловская обл.': 'Свердловская область',
    'Московская обл.': 'Московская область',
    'Ивановская обл.': 'Ивановская область',
    'Иркутская обл.': 'Иркутская область',
    'Кабардино-Балкарская Республика': 'Кабардино - Балкарская Республика',
    'Калининградская обл.': 'Калининградская область',
    'Кировская обл.': 'Кировская область',
    'Корякский округ|Камчатский край': 'Корякский округ и Камчатский край',
    'Костромская обл.': 'Костромская область',
    'Курганская обл.': 'Курганская область',
    'Курская обл.': 'Курская область',
    'Липецкая обл.': 'Липецкая область',
    'Магаданская обл.': 'Магаданская область',
    'Мурманская обл.': 'Мурманская область',
    'Ненецкий АО': 'Ненецкий автономный округ',
    'Нижегородская обл.': 'Нижегородская область',
    'Новгородская обл.': 'Новгородская область',
    'Новосибирская обл.': 'Новосибирская область',
    'Омская обл.': 'Омская область',
    'Оренбургская обл.': 'Оренбургская область',
    'Орловская обл.': 'Орловская область',
    'Пензенская обл.': 'Пензенская область',
    'Псковская обл.': 'Псковская область',
    'Республика Крым и г. Севастополь': 'Севастополь и Республика Крым',
    'Республика Саха (Якутия)': 'Республика Саха',
    'Республика Саха /Якутия/': 'Республика Саха',
    'Республика Карачаево-Черкесская': 'Карачаево - Черкесская Республика',
    'Республика Кабардино-Балкарская': 'Кабардино - Балкарская Республика',
    'Республика Удмуртская': 'Удмуртская Республика',
    'пгт. Ува|р-н Увинский|Республика Удмуртская': 'Ува и Удмуртская Республика',
    'Республика Татарстан (Татарстан)': 'Республика Татарстан',
    'Республика Чеченская': 'Чеченская Республика',
    'с. Ий|р-н Тоджинский|Республика Тыва': 'Ий и Республика Тыва',
    'Республика Северная Осетия - Алания': 'Республика Северная Осетия',
    'Ростовская обл.': 'Ростовская область',
    'Рязанская обл.': 'Рязанская область',
    'Самарская обл.': 'Самарская область',
    'Саратовская обл.': 'Саратовская область',
    'Сахалинская обл.': 'Сахалинская область',
    'Смоленская обл.': 'Смоленская область',
    'Тамбовская обл.': 'Тамбовская область',
    'Томская обл.': 'Томская область',
    'Тульская обл.': 'Тульская область',
    'Тюменская обл.': 'Тюменская область',
    'Ульяновская обл.': 'Ульяновская область',
    'Ханты - Мансийский - Югра АО': 'Ханты - Мансийский автономный округ',
    'Чувашская Республика - Чувашия': 'Чувашская Республика',
    'Чукотский АО': 'Чукотский автономный округ',
    'Ямало - Ненецкий АО': 'Ямало - Ненецкий автономный округ',
    'Ямало-Ненецкий АО': 'Ямало - Ненецкий автономный округ',
    'Ярославская обл.': 'Ярославская область',
}


other_whitelist = {
    'Камчатский край',
    'Забайкальский край',
    'Архангельская область и Ненецкий автономный округ',
    'Алтайский край',
    'Краснодарский край',
    'Красноярский край',
    'Пермский край',
    'Приморский край',
    'р-ны Абзелиловский и Белорецкий|р-ны Абзелиловский и Белорецкий',
    'Республика Адыгея',
    'Республика Алтай',
    'Республика Башкортостан',
    'Республика Бурятия',
    'Республика Дагестан',
    'Республика Ингушетия',
    'Республика Калмыкия',
    'Республика Карелия',
    'Республика Коми',
    'Республика Крым',
    'Республика Марий Эл',
    'Республика Мордовия',
    'Республика Тыва',
    'Республика Хакасия',
    'Российская Федерация',
    'Ставропольский край',
    'Сургутский район и г. Сургут',
    'Хабаровский край',

}
for right_name in replace_data.values():
    other_whitelist.add(right_name)


class CleanRegionError(Exception):
    pass


def clean_region(region_name):
    region_name = ' '.join(region_name.strip().split())
    cleaned_region_name = replace_data.get(region_name)
    if cleaned_region_name is None:
        if region_name not in other_whitelist:
            raise CleanRegionError(
                'Bad region name: {}. Please, add rule for this extension to '
                'django_rossvyaz.logic replace_data or '
                'other_whitelist'.format(repr(region_name)))
        cleaned_region_name = region_name
    return cleaned_region_name


class CleanPhoneError(Exception):
    pass


def clean_phone(phone, phone_type):
    if phone_type == PhoneCode.PHONE_TYPE_DEF:
        return clean_phone_def(phone)
    raise CleanPhoneError('Phone type {} dnot support'.format(phone_type))


DEF_FORMAT_ERROR = 'Valid DEF (RU) phone in format 9vvxxxyyzz'


def clean_phone_def(phone):
    err = DEF_FORMAT_ERROR
    if len(phone) == 12:
        if phone[:2] != '+7':
            raise CleanPhoneError(err)
        phone = phone[2:]
    elif len(phone) == 11:
        if phone[0] not in '78':
            raise CleanPhoneError(err)
        phone = phone[1:]
    if len(phone) != 10:
        raise CleanPhoneError(err)
    if not phone.startswith('9'):
        raise CleanPhoneError(err)
    try:
        phone = str(int(phone))
    except ValueError:
        raise CleanPhoneError(err)
    return phone
