module Services

class Processor
  HANDLERS = {
    '\A\/start(\s.*|\z)' => Commands::Start,
    '\A\/stop\z'         => Commands::Stop
  }.freeze

  def self.call(*args)
    new(*args).call
  end

  def initialize(message_dump)
    @message_dump = message_dump
  end

  def call
    process_message YAML.load(@message_dump)
  end

  private

  def process_message(message)
    user = user_by_message(message)
    command_klass(message).invoke(message, user)
  end

  def user_by_message(message)
    from = message.from
    user = Models::User.find_or_initialize_by(telegram_id: from.id)
    if user.new_record?
      user.update(first_name: from.first_name, last_name: from.last_name, username: from.username)
    end
    user
  end

  def command_klass(message)
    command_klass_by_text(message.text) || Commands::Missing
  end

  def command_klass_by_text(text)
    key = HANDLERS.keys.find { |regex| /#{regex}/ =~ prepare_text(text) }
    HANDLERS[key]
  end

  def prepare_text(text)
    text.strip
  end
end

end