#!/usr/bin/env ruby -wKU
$KCODE='u'
require 'yaml'
require 'optparse'
require 'kconv'
require 'pathname'
require 'base64'

YAPRA_ROOT = File.join(File.dirname(__FILE__), '..')

$:.insert(0, *[
  File.join(YAPRA_ROOT, 'lib-plugins'),
  File.join(YAPRA_ROOT, 'lib')
])

legacy_plugin_directory_paths = [
  File.join(YAPRA_ROOT, 'legacy_plugins'),
  File.join(YAPRA_ROOT, 'plugins')
]

require 'yapra/version'
require 'yapra/runtime'
require 'yapra/config'
require 'yapra/legacy_plugin/registry_factory'

Version       = Yapra::VERSION::STRING
mode          = 'compatible'
config_files  = []#"config.yaml"
loglebel      = nil
opt = OptionParser.new
opt.on("-c", "--configfile CONFIGFILE") {|v| config_files << v }
opt.on("-d", "--configfile-directory CONFIGFILE_DIRECTORY") { |v|
  Dir.glob(File.join(v, '**/*.yml')).each do |file|
    config_files << file
  end
  Dir.glob(File.join(v, '**/*.yaml')).each do |file|
    config_files << file
  end
}
opt.on("-p", "--plugindir PLUGINDIR") {|v| legacy_plugin_directory_paths << v }
opt.on("-m", "--mode MODE", 'compatible / advance') { |v| mode = v }
opt.on("--log-level LOGLEVEL", 'fatal / error / warn / info / debug') { |v| loglebel = v }
# opt.on("-u", "--pluginusage PLUGINNAME") {|v| $plugins[v].source.gsub(/^## ?(.*)/){ puts $1 }; exit }
# opt.on("-l", "--listplugin") { $plugins.keys.sort.each{|k| puts k }; exit }
# opt.on("-w", "--where") { puts(Pathname.new(__FILE__).parent + "plugin"); exit }
opt.parse!

config_files << 'config.yaml' if config_files.size == 0

legacy_plugin_registry_factory = Yapra::LegacyPlugin::RegistryFactory.new(legacy_plugin_directory_paths, mode)

yapra = nil
config_files.each do |config_file|
  begin
    config = YAML.load(File.read(config_file).toutf8.gsub(/base64::([\w+\/]+=*)/){ Base64.decode64($1) })
    config = Yapra::Config.new(config)
    config.env.update({
      'log' => {
        'level' => loglebel
      }
    }) if loglebel
    Yapra::Runtime.logger = config.create_logger
    yapra = Yapra::Runtime.new(
      config.env,
      legacy_plugin_registry_factory
    )
    yapra.execute(config.pipeline_commands)
  rescue => ex
    STDERR.puts("* Pipeline, '#{yapra.current_pipeline.name}'") if yapra && yapra.current_pipeline
    STDERR.puts("#{ex.class.name} in '#{ex.message}'")
    ex.backtrace.each do |t|
      STDERR.puts(t)
    end
  end
end
