require 'fileutils'
require 'albacore'
require 'tools/albacore/zipdirectory_patch.rb'

def get_version
  ENV['BUILD_NUMBER'] || '1.1.0.0'
end

task :default => 'build:all'

namespace :setup do
  task :ensure_gemcutter_source do
    puts 'Ensuring gemcutter.org is registered as a gem source'
    unless `gem source -l`.include? 'http://gemcutter.org'
      puts 'Setting Gemcutter as a gem source'
      `gem source -a http://gemcutter.org`
    end
  end
  
  task :install_mspec, :version do |t, args|
    version = args[:version] || '4.5'
    puts 'Installing MSpec ReSharper runner'
    plugins = "#{ENV['APPDATA']}/JetBrains/ReSharper/v#{version}/vs9.0/Plugins"
    to_copy = ['Machine.Specifications', "Machine.Specifications.ReSharperRunner.#{version}"]

    FileUtils.mkdir plugins unless File.exists? plugins
    to_copy.each do |f|
      FileUtils.cp "tools/mspec/#{f}.dll", plugins
      FileUtils.cp "tools/mspec/#{f}.pdb", plugins
    end
  end
end

namespace :ci do
  task :run_ci_build => [
    'build:all',
    'docs:build',
    'package:all',
  ]
end

namespace :source do
  desc 'Update assembly info with latest version number'
  assemblyinfo :update_version do |asm|
    asm.output_file = 'src/CommonAssemblyInfo.cs'
    
    asm.version = get_version
    asm.company_name = 'http://fluentnhibernate.org'
    asm.product_name = 'FluentNHibernate'
    asm.copyright = 'Copyright 2008-2009 James Gregory and contributors (Paul Batum, Hudson Akridge et al). All rights reserved.'
    asm.namespaces = ['System.Security']
    asm.custom_attributes :AllowPartiallyTrustedCallers => nil
    
    puts "The build number is #{asm.version}"
  end
  
  desc 'Compile the source'
  msbuild :compile do |msb|
    msb.properties = { :configuration => :Release }
    msb.targets [:Clean, :Build]
    msb.solution = 'src/FluentNHibernate.sln'
  end
end

namespace :specs do
  desc 'Run all tests and specs'
  task :all => [:nunit, :mspec]
  
  desc 'Run MSpec specs'
  mspec :mspec do |mspec|
    mspec.path_to_command = 'tools/mspec/mspec.exe'
    mspec.assemblies << 'src/FluentNHibernate.Specs/bin/Release/FluentNHibernate.Specs.dll'
  end

  desc 'Run NUnit tests'
  nunit :nunit do |nunit|
    nunit.path_to_command = 'tools/nunit/nunit-console-x86.exe'
    nunit.assemblies << 'src/FluentNHibernate.Testing/bin/Release/FluentNHibernate.Testing.dll'
  end
end

namespace :build do
  desc 'Run full build including tests'
  task :all => ['source:update_version', 'source:compile', 'specs:all'] do
    puts 'Copying output to build directory'
      Dir.mkdir 'build' unless File.exist? 'build'
      Dir.glob 'src/FluentNHibernate/bin/Release/*.{dll,pdb,xml}' do |path|
        copy path, 'build' if File.file? path
      end
    
    puts 'Build complete'
  end
end

namespace :docs do
  desc 'Create API docs'
  docu :build do |d|
    d.path_to_command = 'tools/docu/docu.exe'
    d.assemblies << 'build/FluentNHibernate.dll'
  end
end

namespace :package do
  task :prepare_dist_directory do
    Dir.mkdir 'dist' unless File.exists? 'dist'
  end
  
  desc 'Create zip of source-tree'
  zip :source => :prepare_dist_directory do |zip|
    zip.directories_to_zip = ['./']
    zip.output_file = "fluentnhibernate-source-#{get_version}.zip"
    zip.output_path = 'dist'
    zip.exclusions = get_exclusions
  end

  def get_exclusions
    exclusions = []
    %w{build dist results output}.each {|x| exclusions << "#{x}" << "#{x}/**/**" }
    %w{bin obj}.each {|x| exclusions << "**/#{x}" << "**/#{x}/**/**" }
    [/_ReSharper/, /.user/, /.suo/, /.resharper/, /.cache/].each {|x| exclusions << x }
    exclusions
  end
  
  desc 'Create zip of binaries'
  zip :binaries => :prepare_dist_directory do |zip|
    zip.directories_to_zip = ['build']
    zip.output_file = "fluentnhibernate-binary-#{get_version}.zip"
    zip.output_path = 'dist'
  end
  
  desc 'Create zip of API docs'
  zip :docs => :prepare_dist_directory do |zip|
    zip.directories_to_zip = ['output']
    zip.output_file = "fluentnhibernate-docs-#{get_version}.zip"
    zip.output_path = 'dist'
  end
  
  task :all => [:source, :binaries, :docs]
end

task :sln do
  Thread.new do
    system "devenv src/FluentNHibernate.sln"
  end
end
