namespace :translations do

PARAMS = '. LIST=locales,to,use EXCLUDE=locales,to,ignore'

def get_ts(skip_source = false)
  source = skip_source ? nil : ENV['SOURCE'] || ENV['IN']
  params = {}
  params[:list] = ENV['LIST']
  params[:exclude] = ENV['EXCLUDE']
  params[:source] = ENV['SOURCE'] || ENV['IN'] unless skip_source
  params[:ignore] = ENV['IGNORE']
  params[:gems] = ENV['GEMS']
  TranslationsSync.new params
end

def save_moved_files(ts, default_name)
  translations = ts.moved
  name = ENV['NAME'] || ENV['IN'] || default_name
  translations.keys.sort.each do |lang|
    filename = ts.filename_for name, lang
    print filename + ' ...  '
    if File.exist? filename
      status = 'updated'
    else
      status = 'created'
    end
    File.open(filename, "w") do |file|
      file.write(TranslationsSync.to_yaml(translations.slice lang))
    end
    puts status
  end
end

desc "Synchronizes the existing translations" + PARAMS +  ' NAME=file_name_prefix'
task :sync => :environment do
  ts = get_ts
  name = ENV['NAME'] || ENV['IN'] || 'missing'
  ts.missing.keys.sort.each do |lang|
    filename = ts.filename_for name, lang
    print filename + ' ...  '
    if File.exist? filename
      hash = YAML::load(File.open(filename))
      File.open(filename, "w") do |file|
        file.write(TranslationsSync.to_yaml(hash.deep_merge!(ts.missing.slice(lang))))
      end
      puts 'updated'
    else
      File.open(filename, "w") do |file|
        file.write(TranslationsSync.to_yaml(ts.missing.slice lang))
      end
      puts 'created'
    end
  end
  puts "All is synchronized" if ts.missing.size == 0
end

desc "Detects the translations existing only in one locale" + PARAMS
task :singles => :environment do
  ts = get_ts false
  filename = ts.filename_for 'singles', nil
  if ts.singles.size > 0
    File.open(filename, "w") do |file|
      file.write(TranslationsSync.to_yaml ts.singles)
    end
    puts filename + ' <= ' + ts.singles.keys.join(', ')
  else
    puts 'No singles were found'
  end
end

desc "Moves the key in the translations" + PARAMS + " KEY=key.to.move TO=where.to.move IN=filespec"
task :move => :environment do
  key = ENV['KEY'] or raise "Parameter KEY must be given"
  to  = ENV['TO']  or raise "Parameter TO must be given"
  ts = get_ts
  if ts.move key, to
    save_moved_files ts, 'moved'
  else
    puts "The key \"#{key}\" was not found"
  end
end

desc "Removes the key from the translations" + PARAMS + " KEY=key.to.move IN=filespec"
task :remove => :environment do
  key = ENV['KEY'] or raise "Parameter KEY must be given"
  ts = get_ts
  if ts.remove key
    save_moved_files ts, 'removed'
  else
    puts "The key \"#{key}\" was not found"
  end
end

end