require 'rake'

begin
  require 'jeweler'
  Jeweler::Tasks.new do |gem|
    gem.name = "mongo_doc"
    gem.summary = %Q{ODM for MongoDB}
    gem.description = %Q{ODM for MongoDB}
    gem.email = "leshill@gmail.com"
    gem.homepage = "http://github.com/leshill/mongodoc"
    gem.authors = ["Les Hill"]
    gem.files.include('lib/**/*.task')
    gem.add_dependency "activesupport", ">= 3.0.0.beta.4"
    gem.add_dependency "activemodel", ">=3.0.0.beta.4"
    gem.add_dependency "bson", ">= 1.0.0"
    gem.add_dependency "bson_ext", ">= 1.0.0"
    gem.add_dependency "mongo", ">= 1.0.0"
    gem.add_dependency "tzinfo", ">= 0.3.22"
    gem.add_development_dependency "cucumber", ">= 0.8.5"
    gem.add_development_dependency "jeweler", ">= 1.4.0"
    gem.add_development_dependency "rspec", ">= 2.0.0.beta.18"
    # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
  end
  Jeweler::GemcutterTasks.new
rescue LoadError
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
end

require 'cucumber/rake/task'
Cucumber::Rake::Task.new(:features) do |t|
  t.cucumber_opts = "--format pretty --tag ~@wip"
end

namespace :cucumber do
  Cucumber::Rake::Task.new(:wip) do |t|
    t.cucumber_opts = "--format pretty --tag @wip"
  end
end

require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec) do |spec|
  spec.pattern = 'spec/**/*_spec.rb'
end

RSpec::Core::RakeTask.new(:rcov) do |spec|
  spec.pattern = 'spec/**/*_spec.rb'
  spec.rcov = true
end

task :spec => :check_dependencies

task :default => :spec

require 'rake/rdoctask'
Rake::RDocTask.new do |rdoc|
  if File.exist?('VERSION')
    version = File.read('VERSION')
  else
    version = ""
  end

  rdoc.rdoc_dir = 'rdoc'
  rdoc.title = "MongoDoc #{version}"
  rdoc.rdoc_files.include('README*')
  rdoc.rdoc_files.include('lib/**/*.rb')
end

namespace :mongoid do
  desc 'Sync criteria from Mongoid'
  task :sync do
    require 'pathname'

    src_dir = Pathname.new('../durran-mongoid/lib/mongoid')
    dest_dir = Pathname.new('lib/mongoid')
    dest_dir.mkpath
    %w(criteria.rb contexts/paging.rb contexts/enumerable.rb criterion extensions/symbol/inflections.rb extensions/hash/criteria_helpers.rb matchers).each do |f|
      src = src_dir + f
      if src.directory?
        FileUtils.cp_r(src, dest_dir)
      else
        dest = dest_dir + f
        dest.dirname.mkpath
        FileUtils.cp(src, dest)
      end
    end
  end
end

namespace :bench do
  desc 'Run benchmark for MongoDoc'
  task 'mongo_doc' do
    $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
    require 'perf/mongo_document'
    benchmark("MongoDoc saving documents", MongoDocument.new)
  end

  desc 'Run benchmark for MongoDoc Object'
  task 'mongo_object' do
    $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
    require 'perf/mongo_doc_object'
    benchmark("MongoDoc saving objects", MongoDocObject.new)
  end

  desc 'Run profiler for driver'
  task 'driver' do
    $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
    require 'perf/ruby_driver'
    benchmark("Ruby driver saving hashes", RubyDriver.new)
  end
end

namespace :prof do
  desc 'Run profiler for MongoDoc'
  task 'mongo_doc' do
    $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
    require 'perf/mongo_document'
    profile("MongoDoc saving documents", MongoDocument.new)
  end

  desc 'Run profiler for MongoDoc Object'
  task 'mongo_object' do
    $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
    require 'perf/mongo_doc_object'
    profile("MongoDoc saving objects", MongoDocObject.new)
  end

  desc 'Run profiler for driver'
  task 'driver' do
    $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
    require 'perf/ruby_driver'
    profile("Ruby driver saving hashes", RubyDriver.new)
  end

  def benchmark(what, runner)
    puts "Benchmark: " + what

    runner.generate(10000)

    Benchmark.bm do |bm|
      bm.report(what + " writes") do
        runner.writes(10000)
      end
    end

    Benchmark.bm do |bm|
      bm.report(what + " reads") do
        runner.reads(10000)
      end
    end

    Benchmark.bm do |bm|
      bm.report(what + " query") do
        runner.query_all
      end
    end
  end

  def profile(what, runner)
    puts "Profiling: " + what
    RubyProf.start

    runner.generate(1000)
    runner.writes(1000)
    runner.reads(1000)
    runner.query_all

    result = RubyProf.stop
    printer = RubyProf::FlatPrinter.new(result)
    printer.print(STDOUT, 0)
  end
end