# -*- ruby -*-
#
# ExcelPettyCashBook's Rakefile
# $Id$
#
require 'fileutils'

########################################
# Constant definitions
########################################

# Basic configurations
APP_NAME = "ExcelPettyCashBook"
MAIN_NAME = "main"
DIST_TOOL_PREFIX = "#{APP_NAME}-tools-"
DSTAMP = Time.now.strftime("%Y%m%d")
WIKI_CSS_NAME = "amateras.css"

# Tools
CSV_NAME = "epcb-csv"
TOOL_NAME_LIST = [ CSV_NAME ]

# Set up build directories and pathes
require 'buildenv' if FileTest.exist?("buildenv.rb")
BUILD_TOOLS = "build-tools"
DOCS = "docs"


########################################
# Variable definitions
########################################
versions = Hash.new
RakeFileUtils::verbose(true)


########################################
# Method definitions
########################################
def execute_task(name)
  Task.lookup(name).execute if Task.task_defined?(name)
end

# Load version information from ReleaseLog
def load_version(filename, hash)
  File.open(filename) do |f|
    line = f.gets
    return nil if line.nil?
    line.gsub!(/\s/, "")
    key = $1 if /^ReleaseLog\.(.+)/ =~ filename
    return hash[key] = line
  end
end

# Generate a HTML document from FSWiki source.
def wiki2html(srcdir, destdir, name)
  mkdir_p(destdir)
  ENV["FSWIKI_HOME"] = "#{BUILD_TOOLS}/fswiki"
  cmd = "perl #{BUILD_TOOLS}/fswiki/tools/wiki2html.pl " \
  "#{srcdir}/#{name}.wiki -output=sjis -css=#{WIKI_CSS_NAME} -title=#{name}"
  puts cmd
  File.open("#{destdir}/#{name}.html", "w") do |out|
    stdout_save = STDOUT.dup
    STDOUT.reopen(out)
    begin
      sh(cmd)
    ensure
      STDOUT.flush
      STDOUT.reopen(stdout_save)
    end
  end
end

# Change directory to specified dir and create a zip-archive with specified name.
def zip(dir, name, exclude_list = nil)
  return unless FileTest.directory?(dir)
  zip = "zip"
  zip = ZIP if defined?(ZIP)
  cmd = "#{zip} -r -9 #{name}.zip #{name}"
  cd(dir) do
    sh(cmd)
  end
end


########################################
# init
########################################
desc "(private) Initialize this build"
task :init do |t|
  TOOL_NAME_LIST.dup.push(MAIN_NAME).each do |n|
    load_version("ReleaseLog.#{n}", versions)
  end
  puts <<EOS
##################################################
# using ruby      = #{RUBY_VERSION} (#{RELEASE_DATE}) [#{RUBY_PLATFORM}]
# build directory = #{BUILD}
# dist directory  = #{DIST}
# tmp directory   = #{TMP}
# versions        = #{versions.inspect}
# date timestamp  = #{DSTAMP}
##################################################
EOS
  mkdir_p(DIST)
end


########################################
# dist_main
########################################
desc "--> Create ExcelPettyCashBook distribution"
task :dist_main => [ :init ] do |t|
  cp("#{APP_NAME}.xls", "#{DIST}/#{APP_NAME}-#{versions['main']}.xls")
end


########################################
# build_csv
########################################
desc "--> Build #{CSV_NAME}.exe"
task :build_csv => [ :init ] do |t|
  # Generate exe by exerb
  exe = nil
  cd(CSV_NAME) do
    sh(%{exerb #{CSV_NAME}.exr})
    exe = "#{CSV_NAME}.exe"
  end
  mv("#{CSV_NAME}/#{exe}", BUILD) unless exe.nil?
end


########################################
# iftest_csv
########################################
desc "--> Run interface test for #{CSV_NAME}.exe"
task :iftest_csv => [ :build_csv ] do |t|
#  $:.unshift(File.join(".", CSV_NAME))
  # $ RUBYLIB=epcb-csv ruby epcb-csv/test/interface-test.rb \
  #   -p build/epcb-csv.exe -t tmp
  ENV["RUBYLIB"] = File.join(".", CSV_NAME)
  ruby(%{#{CSV_NAME}/test/iftest.rb \ -p #{BUILD}/#{CSV_NAME}.exe -t #{TMP}})
end


########################################
# dist_csv
########################################
desc "--> Create a zip-archived epcb-csv distribution"
task :dist_csv => [ :init ] do |t|
  dist_name = "#{CSV_NAME}-" + versions[CSV_NAME]
  dist_target = "#{DIST}/#{dist_name}"
  mkdir_p(dist_target)

  # Build epcb-csv.exe
  execute_task(:build_csv)
  mv("#{BUILD}/#{CSV_NAME}.exe", dist_target)

  # Generate a wiki document
  mkdir_p("#{dist_target}/#{DOCS}")
  cp("#{DOCS}/#{WIKI_CSS_NAME}", "#{dist_target}/#{DOCS}")
  wiki2html("#{CSV_NAME}/#{DOCS}", "#{dist_target}/#{DOCS}", CSV_NAME)
  cp("ReleaseLog.#{CSV_NAME}", dist_target)

  zip(DIST, dist_name)
end


########################################
# dist_all
########################################
desc "--> Create a zip-archived binary distribution which contains all softwares"
task :dist_all => [ :init ] do |t|
  dist_name = "#{APP_NAME}-all-#{DSTAMP}"
  dist_target = "#{DIST}/#{dist_name}"
  mkdir_p(dist_target)

  # Copy (or move) binaries into ${dist.target}
  cp("#{APP_NAME}.xls", "#{dist_target}/#{APP_NAME}-#{versions['main']}.xls")
  execute_task(:build_csv)
  mv("#{BUILD}/#{CSV_NAME}.exe", dist_target)

  # Generate documents
  mkdir_p("#{dist_target}/#{DOCS}")
  cp("#{DOCS}/#{WIKI_CSS_NAME}", "#{dist_target}/#{DOCS}")
  TOOL_NAME_LIST.each do |n|
    Dir.glob("#{n}/#{DOCS}/*.wiki") do |f|
      wiki2html("#{n}/#{DOCS}", "#{dist_target}/#{DOCS}",
                File.basename(f, ".wiki"))
    end
  end

  # Copy ReleaseLogs
  cp(Dir.glob("ReleaseLog*"), dist_target)

  zip(DIST, dist_name)
end


########################################
# dist_src
########################################
desc "--> Create a zip-archived source distribution" 
task :dist_src => [ "init" ] do |t|
  dist_name = "#{APP_NAME}-src-#{DSTAMP}"
  dist_target = "#{DIST}/#{dist_name}"
  mkdir_p(dist_target)

  exclude_list = [ %r!^build$!, %r!^tmp$!, %r!^test$!, %r!^epcb-db$! ]
  list = Array.new
  Dir.glob("*") do |item|
    matched = false
    exclude_list.each { |p| matched = true if p =~ item }
    list.push(item) unless matched
  end
  cp_r(list, dist_target, :preserve => true)
  zip(DIST, dist_name)
end


########################################
# dist
########################################
desc "--> Create a zip-archived any distributions"
task :dist => [ :dist_main, :dist_csv, :dist_all, :dist_src  ] do
end


########################################
# cprubylibs
########################################
desc "--> Copy required ruby libraries for exerb (env RUBY_HOME required)"
task :cprubylibs => [ "init" ] do |t|
  ruby_lib = "#{ENV['RUBY_HOME']}/lib/ruby/1.8"
  ruby_lib_arch = "#{ruby_lib}/i386-mswin32"
  puts <<EOS
ruby_lib      = #{ruby_lib}
ruby_lib_arch = #{ruby_lib_arch}
EOS
  src_list = [ "csv.rb", "date", "date.rb", "fileutils.rb", "logger.rb", "optparse",
              "optparse.rb", "ostruct.rb", "parsedate.rb", "rational.rb",
              "time.rb" ]
  src_list_ext = [ "win32ole.so" ]

  src_list.each do |item|
    puts item
    cp_r("#{ruby_lib}/#{item}", "#{CSV_NAME}/lib", :preserve => true)
  end
  src_list_ext.each do |item|
    cp_r("#{ruby_lib_arch}/#{item}", "#{CSV_NAME}/lib", :preserve => true)
  end
end


########################################
# clean
########################################
task :clean do |t|
  rm_r(BUILD, :force => true)
  rm_r(Dir.glob("#{TMP}/*"), :force => true)
end
