module Fias
  class << self
    attr_reader :config

    def configure(&block)
      @config = Config.new(&block)
    end

    def indivisible_words
      @indivisible_words ||=
        config
        .synonyms
        .flatten
        .find_all { |w| w.include?(' ') }
        .sort_by(&:size)
        .reverse
        .freeze
    end

    def word
      @word ||=
        /(#{ANNIVESARIES}|#{indivisible_words.join('|')}|[#{LETTERS}\"\'\d\.\)\(\/\-]+)(\s|\,|$)/ui
    end
  end

  LETTERS        = /[а-яА-ЯёЁA-Za-z]/ui
  ANNIVESARIES   = /(\d+)(\s\-|\-|\s)лет(ия)?/ui
  INITIAL        = /#{Fias::LETTERS}{1,2}\./ui
  INITIALS       = /(#{INITIAL}#{INITIAL}(#{INITIAL})?)(.+|$)/ui
  SINGLE_INITIAL = /(\.|\s|^)(#{Fias::LETTERS}{1,3}\.)(.+|$)/ui
  FEDERAL_CITIES = ['Москва', 'Санкт-Петербург', 'Севастополь', 'Байконур']
end

require 'unicode'
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/hash/slice'
require 'active_support/core_ext/hash/keys'
require 'active_support/hash_with_indifferent_access'
require 'active_support/core_ext/enumerable'
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/array/extract_options'
require 'active_support/core_ext/array/wrap'
require 'dbf'
require 'httparty'
require 'pg_data_encoder'
require 'fias/version'
require 'fias/config'
require 'fias/import/dbf'
require 'fias/import/tables'
require 'fias/import/download_service'
require 'fias/import/copy'
require 'fias/import/restore_parent_id'
require 'fias/name/canonical'
require 'fias/name/append'
require 'fias/name/extract'
require 'fias/name/house_number'
require 'fias/name/split'
require 'fias/name/synonyms'
require 'fias/query'
require 'fias/query/params'
require 'fias/query/finder'
require 'fias/query/estimate'
require 'fias/railtie' if defined?(Rails)

Fias.configure do |config|
  config.add_name('автономный округ', 'АО')
  config.add_name('автономная область', 'Аобл')
  config.add_name('город', 'г.')
  config.add_name('край', 'край')
  config.add_name('область', 'обл.')
  config.add_name('округ', 'округ')
  config.add_name('республика', 'Респ.')
  config.add_name('поселение', 'п.')
  config.add_name('район', 'р-н')
  config.add_name('территория', 'тер.')
  config.add_name('улус', 'у.')
  config.add_name('волость', 'волость')
  config.add_name('дачный поселок', 'дп.')
  config.add_name('курортный поселок', 'кп.')
  config.add_name('массив', 'массив')
  config.add_name('поселок', 'п.', %w(пос посёлок))
  config.add_name('почтовое отделение', 'п/о')
  config.add_name('поселок городского типа', 'пгт')
  config.add_name('рабочий поселок', 'рп')
  config.add_name('сельская администрация', 'с/а')
  config.add_name('сельское муниципальное образо', 'с/мо')
  config.add_name('сельский округ', 'с/о')
  config.add_name('сельское поселение', 'с/п')
  config.add_name('сельсовет', 'с/с')
  config.add_name('аал', 'аал')
  config.add_name('автодорога', 'автодорога')
  config.add_name('арбан', 'арбан')
  config.add_name('аул', 'аул')
  config.add_name('выселки(ок)', 'высел')
  config.add_name('городок', 'городок')
  config.add_name('деревня', 'д.', %w(дер))
  config.add_name('железнодорожная будка', 'ж/д_будка')
  config.add_name('железнодорожная казарма', 'ж/д_казарм')
  config.add_name('ж/д останов. (обгонный) пункт', 'ж/д_оп')
  config.add_name('железнодорожная платформа', 'ж/д_платф')
  config.add_name('железнодорожный пост', 'ж/д_пост')
  config.add_name('железнодорожный разъезд', 'ж/д_рзд')
  config.add_name('железнодорожная станция', 'ж/д_ст', ['ж/д ст'])
  config.add_name('жилая зона', 'жилзона')
  config.add_name('жилой район', 'жилрайон')
  config.add_name('заимка', 'заимка')
  config.add_name('казарма', 'казарма')
  config.add_name('квартал', 'кв-л', ['кварт'])
  config.add_name('кордон', 'кордон')
  config.add_name('леспромхоз', 'лпх')
  config.add_name('местечко', 'м.')
  config.add_name('микрорайон', 'мкр.', %w(мкрн микр))
  config.add_name('населенный пункт', 'нп')
  config.add_name('остров', 'остров')
  config.add_name('планировочный район', 'п/р')
  config.add_name('поселок и(при) станция(и)', 'п/ст')
  config.add_name('погост', 'погост')
  config.add_name('починок', 'починок')
  config.add_name('промышленная зона', 'промзона')
  config.add_name('разъезд', 'рзд')
  config.add_name('село', 'с.')
  config.add_name('слобода', 'сл.')
  config.add_name('садовое неком-е товарищество', 'снт', ['садоводство'])
  config.add_name('станция', 'ст-я')
  config.add_name('станица', 'ст-ца', %w(стн ст))
  config.add_name('хутор', 'х.')
  config.add_name('абонентский ящик', 'а/я')
  config.add_name('аллея', 'аллея')
  config.add_name('берег', 'берег')
  config.add_name('бульвар', 'б-р', %w(бул бульв))
  config.add_name('бугор', 'бугор')
  config.add_name('вал', 'вал')
  config.add_name('въезд', 'въезд')
  config.add_name('гаражно-строительный кооператив', 'гск')
  config.add_name('дорога', 'дор.')
  config.add_name('животноводческая точка', 'жт')
  config.add_name('заезд', 'заезд')
  config.add_name('зона', 'зона')
  config.add_name('канал', 'канал', ['кан'])
  config.add_name('километр', 'км.')
  config.add_name('кольцо', 'кольцо')
  config.add_name('коса', 'коса')
  config.add_name('линия', 'линия', ['лин'])
  config.add_name('мост', 'мост')
  config.add_name('набережная', 'наб.')
  config.add_name('парк', 'парк')
  config.add_name('переулок', 'пер.', ['пер-к'])
  config.add_name('переезд', 'переезд')
  config.add_name('площадь', 'пл.')
  config.add_name('платформа', 'платф.')
  config.add_name('площадка', 'пл-ка')
  config.add_name('полустанок', 'полустанок')
  config.add_name('проспект', 'пр-кт', ['пр', 'просп', 'пр-т'])
  config.add_name('проезд', 'проезд', ['пр-д', 'прз', 'прд'])
  config.add_name('просек', 'просек')
  config.add_name('просека', 'просека')
  config.add_name('проселок', 'проселок')
  config.add_name('проток', 'проток')
  config.add_name('протока', 'протока')
  config.add_name('проулок', 'проулок')
  config.add_name('ряды', 'ряды')
  config.add_name('сад', 'сад')
  config.add_name('сквер', 'сквер')
  config.add_name('спуск', 'спуск')
  config.add_name('строение', 'стр')
  config.add_name('тоннель', 'тоннель')
  config.add_name('тракт', 'тр.')
  config.add_name('тупик', 'туп.')
  config.add_name('улица', 'ул.')
  config.add_name('участок', 'уч-к')
  config.add_name('ферма', 'ферма')
  config.add_name('шоссе', 'ш.', ['шос'])
  config.add_name('эстакада', 'эстакада')
  config.add_name('гаражно-строительный кооператив', 'гск')
  config.add_name('дачное некоммерческое партнерство', 'днп')
  config.add_name('некоммерческое партнерство', 'н/п')
  config.add_name('садовое товарищество', 'снт')
  config.add_name('фермерское хозяйство', 'ф/х')
  config.add_name('коттеджный поселок', 'кп', ['коттеджный'])

  config.add_exception(
    'Чувашская Республика - Чувашия', 'Чувашия'
  )

  config.add_exception(
    'Ханты-Мансийский Автономный округ - Югра',
    'Ханты-Мансийский Автономный округ - Югра'
  )

  config.add_replacement(
      'Чувашская Республика -', ['Чувашская Респ.', 'Чувашская Республика']
  )

  proper_names =
    File.readlines(File.join(File.dirname(__FILE__), '../config/names.txt'))

  proper_names.map(&:strip).each do |name|
    config.add_proper_name(name)
  end

  synonyms =
    YAML.load_file(File.join(File.dirname(__FILE__), '../config/synonyms.yml'))

  synonyms.each do |synonym|
    config.add_synonym(*synonym)
  end
end
