# -*- coding: utf-8 -*-
require 'simplecov'
SimpleCov.start

require "chatterbot"

# Requires supporting files with custom matchers and macros, etc,
# in ./support/ and its subdirectories.
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}

RSpec.configure do |config|
  config.mock_with :rspec do |mocks|

    # This option should be set when all dependencies are being loaded
    # before a spec run, as is the case in a typical spec helper. It will
    # cause any verifying double instantiation for a class that does not
    # exist to raise, protecting against incorrectly spelt names.
    mocks.verify_doubled_constant_names = true
  end

  config.after(:each) do
    config_file = File.join(File.dirname($0), "#{File.basename($0, ".*")}.yml")
    if File.exist?(config_file)
      File.delete(config_file) rescue nil
    end
  end
end

def test_bot
  bot = Chatterbot::Bot.new
  allow(bot).to receive(:load_config).and_return({})
  bot.reset!
  bot
end

def stubbable_client
  c = Twitter::Client.new
  allow(c).to receive_messages(:credentials? => true)
  c
end

def fake_search(max_id = 100, result_count = 0, id_base=0)
  result = 1.upto(result_count).each_with_index.map { |x, i|
    fake_tweet(max_id - i, id_base)
  }
  allow(result).to receive(:max_id).and_return(max_id)

  c = stubbable_client
  allow(c).to receive_messages(:search => result)
  c
end

def fake_replies(result_count = 0, id_base = 0)
  c = stubbable_client
  allow(c).to receive_messages(:mentions_timeline => 1.upto(result_count).collect { |i| fake_tweet(i, id_base)})
  c
end

def fake_direct_messages(result_count = 0, id_base = 0)
  c = stubbable_client
  allow(c).to receive_messages(:direct_messages_received => 1.upto(result_count).collect { |i| fake_dm(i, id_base)})
  c
end

def fake_home_timeline(result_count = 0, id_base = 0)
  c = stubbable_client
  allow(c).to receive_messages(:home_timeline => 1.upto(result_count).collect { |i| fake_tweet(i, id_base)})
  c
end

def fake_followers(count)
  c = stubbable_client
  allow(c).to receive_messages(:followers => 1.upto(count).collect { |i| fake_follower(i) })
  c
end

def fake_tweet(index, id=0)
  id = index if id <= 0
  x = {
    :from_user => "chatterbot",
    :index => index,
    :id => id,
    :text => "I am a tweet",
    :user => { :id => 1, :screen_name => "chatterbot" }
  }

  Twitter::Tweet.new(x)
end

def fake_dm(index, id=0)
  id = index if id <= 0
  x = {
    :from_user => "chatterbot",
    :index => index,
    :id => id,
    :text => "I am a direct message",
    :user => { :id => 1, :screen_name => "chatterbot" }
  }

  Twitter::DirectMessage.new(x)
end

def fake_follower(index=0)
  Twitter::User.new(:id => index, :name => "Follower #{index}",
                    :screen_name => "follower#{index}")
end

def fake_user(name, id = 1)
  Twitter::User.new(:id => id, :name => name, :screen_name => name)
end

