require 'pathname'
require 'rubygems'
require 'spec/rake/spectask'
require 'lib/do_sqlite3/version'



ROOT    = Pathname(__FILE__).dirname.expand_path
JRUBY   = RUBY_PLATFORM =~ /java/
WINDOWS = Gem.win_platform?
SUDO    = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])

AUTHOR = "Dirkjan Bussink"
EMAIL  = "d.bussink@gmail.com"
GEM_NAME = "do_sqlite3"
GEM_VERSION = DataObjects::Sqlite3::VERSION
GEM_DEPENDENCIES = if JRUBY
  [["data_objects", GEM_VERSION], ["do_jdbc", GEM_VERSION], ["jdbc-sqlite3", ">=3.5.8"]]
else
  [["data_objects", GEM_VERSION]]
end

# TODO: remove duplicates from here that are already listed in .gitignore
clean = %w(o bundle jar log a gem dSYM obj pdb lib def exp DS_Store)

GEM_EXTRAS = if WINDOWS
  {
    :has_rdoc => false
  }
elsif JRUBY
  {
    :has_rdoc => false,
    :platform => 'java'
  }
else
  {
    :has_rdoc => false,
    :extensions => 'ext/do_sqlite3_ext/extconf.rb'
  }
end

GEM_CLEAN = ['**/test.db',"**/*.{#{clean.join(",")}}", 'ext/Makefile', 'ext-java/target']

PROJECT_NAME = "dorb"
PROJECT_URL  = "http://rubyforge.org/projects/dorb"
PROJECT_DESCRIPTION = PROJECT_SUMMARY = "A DataObject.rb driver for Sqlite3"


# RCov is run by default, except on the JRuby platform, or if NO_RCOV env is true
RUN_RCOV = JRUBY ? false : (ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true)

if (tasks_dir = ROOT.parent + 'tasks').directory?
  require tasks_dir + 'hoe'
  require tasks_dir + 'ext_helper_java'

  setup_java_extension  "#{GEM_NAME}_ext", HOE.spec

  # use .gitignore to identify files to clean up
  File.read(ROOT.parent + '.gitignore').split(/\s+/).each do |pattern|
    next if pattern.include?('/') && !pattern.gsub!(/\A(?:\.\/)?#{ROOT.basename}(?:\/|\z)/, './')
    GEM_CLEAN.concat(Dir.glob(pattern.include?('/') ? pattern : "**/#{pattern}"))
  end
end

if JRUBY
  HOE.spec.files += ['lib/do_sqlite3_ext.jar']
  HOE.spec.require_paths = Dir['lib']
end

def sudo_gem(cmd)
  sh "#{SUDO} #{RUBY} -S gem #{cmd}", :verbose => false
end

# compile the extension
if JRUBY
  Rake::Task['compile:jruby'].invoke
else
end

# Installation

desc "Install #{GEM_NAME} #{GEM_VERSION}"
task :install => [ :package ] do
  sudo_gem "install pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources"
end

desc "Uninstall #{GEM_NAME} #{GEM_VERSION}"
task :uninstall => [ :clobber ] do
  sudo_gem "uninstall #{GEM_NAME} -v#{GEM_VERSION} -I -x"
end

desc 'Run specifications'
Spec::Rake::SpecTask.new(:spec) do |t|
  t.spec_opts << '--format' << 'specdoc' << '--colour'
  t.spec_opts << '--loadby' << 'random'
  t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb').map { |f| f.to_s }

  begin
    t.rcov = RUN_RCOV
    t.rcov_opts << '--exclude' << 'spec'
    t.rcov_opts << '--text-summary'
    t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
  rescue Exception
    # rcov not installed
  end
end

namespace :ci do

  task :prepare do
    rm_rf ROOT + "ci"
    mkdir_p ROOT + "ci"
    mkdir_p ROOT + "ci/doc"
    mkdir_p ROOT + "ci/cyclomatic"
    mkdir_p ROOT + "ci/token"
  end

  task :publish do
    out = ENV['CC_BUILD_ARTIFACTS'] || "out"
    mkdir_p out unless File.directory? out

    mv "ci/rspec_report.html", "#{out}/rspec_report.html"
    mv "ci/coverage", "#{out}/coverage"
  end

  task :spec => :prepare do
    Rake::Task[:spec].invoke
    mv ROOT + "coverage", ROOT + "ci/coverage"
  end

end

task :ci => ["ci:spec"]


# Windows specific stuff. (for cross-compiling a release)
# You have been warned.
# Thanks to Luis Lavena for helping through the writing of this.
# will eventually be replaced with: http://github.com/luislavena/rake-compiler

# use the do directory for the cross-compile stuff
CCROOT = ROOT.parent

SQLITE_VERSION = '3_6_6_2'

MINGW_PATH = ENV['MINGW_PATH'] || '/usr/i586-mingw32msvc'

if (tasks_dir = ROOT.parent + 'tasks').directory?
  require tasks_dir + 'win32'

  SQLITE_DIR = "#{CROSS}/sqlite-#{SQLITE_VERSION}"

  namespace :build do

    namespace :win32 do

      desc "Creates cross compiled sqlite3 libraries"
      task :sqlite3 => ["#{SQLITE_DIR}/include/sqlite3.h", "#{SQLITE_DIR}/lib/libsqlite3.a"]

      directory SQLITE_DIR
      directory "#{SQLITE_DIR}/include"
      directory "#{SQLITE_DIR}/lib"

      file "#{SQLITE_DIR}/include/sqlite3.h" => ["#{SQLITE_DIR}/include", "#{STASH}/sqlite-amalgamation-#{SQLITE_VERSION}.zip"] do |t|
        when_writing "creating sqlite3.h" do
          cd(t.prerequisites[0]) do
            sh "unzip #{t.prerequisites[1]}"
            touch t.name
          end
        end
      end

      file "#{SQLITE_DIR}/lib/libsqlite3.a" => ["#{SQLITE_DIR}/lib", "#{SQLITE_DIR}/sqlite3.dll"] do |t|
        when_writing "creating libsqlite3.a" do
          sh "#{MINGW_PATH}/bin/dlltool --dllname #{SQLITE_DIR}/sqlite3.dll --def #{SQLITE_DIR}/sqlite3.def --output-lib #{t.name}"
        end
      end

      file "#{SQLITE_DIR}/sqlite3.dll" => [SQLITE_DIR, "#{STASH}/sqlitedll-#{SQLITE_VERSION}.zip"] do |t|
        when_writing "creating sqlite3.dll" do
          cd(SQLITE_DIR) do
            sh "unzip #{t.prerequisites[1]}"
            touch t.name
          end
        end
      end

      # download files
      file "#{STASH}/sqlite-amalgamation-#{SQLITE_VERSION}.zip" => STASH do |t|
        download_file(STASH, "http://www.sqlite.org/#{File.basename(t.name)}")
      end

      file "#{STASH}/sqlitedll-#{SQLITE_VERSION}.zip" => STASH do |t|
        download_file(STASH, "http://www.sqlite.org/#{File.basename(t.name)}")
      end
    end
  end

  task :cross => 'build:win32:sqlite3'
end

begin
  gem('rake-compiler')
  require 'rake/extensiontask'
  Rake::ExtensionTask.new('do_sqlite3_ext', HOE.spec) do |ext|
    ext.cross_compile = true                # enable cross compilation (requires cross compile toolchain)
    ext.cross_platform = 'x86-mswin32-60'
    ext.cross_config_options << "--with-sqlite3-dir=#{SQLITE_DIR}"
  end
rescue LoadError
  warn "To cross-compile, install rake-compiler (gem install rake-compiler)"
  if tasks_dir.directory?
    require tasks_dir + 'ext_helper'
    setup_c_extension('do_sqlite3_ext', HOE.spec)
  end
end
