namespace :regions do

desc 'Import regions from YAML without deleting old data'
task import: :environment do
  file_path = "#{Rails.root}/tmp/import/regions.yml"
  media_dir = "#{Rails.root}/tmp/import/regions"
  ignored   = %w(image header_image)
  if File.exists? file_path
    File.open file_path, 'r' do |file|
      YAML.load(file).each do |id, data|
        attributes = data.reject { |key| ignored.include?(key) }
        entity     = Region.find_by(id: id) || Region.new(id: id)
        entity.assign_attributes(attributes)
        if data.key?('image') && entity.image.blank?
          image_file = "#{media_dir}/image/#{id}/#{data['image']}"
          if File.exists?(image_file)
            entity.image = Pathname.new(image_file).open
          end
        end
        if data.key?('header_image') && entity.header_image.blank?
          image_file = "#{media_dir}/header_image/#{id}/#{data['header_image']}"
          if File.exists?(image_file)
            entity.header_image = Pathname.new(image_file).open
          end
        end
        entity.save!
        print "\r#{id}    "
      end
      puts
    end
    Region.connection.execute "select setval('regions_id_seq', (select max(id) from regions));"
    puts "Done. We have #{Region.count} regions now"
  else
    puts "Cannot find file #{file_path}"
  end
end

desc 'Dump regions to YAML'
task dump: :environment do
  file_path = "#{Rails.root}/tmp/export/regions.yml"
  media_dir = "#{Rails.root}/tmp/export/regions"
  ignored   = %w(id users_count image header_image)
  File.open file_path, 'w' do |file|
    Region.order('id asc').each do |entity|
      print "\r#{entity.id}    "
      file.puts "#{entity.id}:"
      entity.attributes.reject { |a, v| ignored.include?(a) || v.nil? }.each do |attribute, value|
        file.puts "  #{attribute}: #{value.inspect}"
      end
      unless entity.image.blank?
        image_name = "#{entity.long_slug}#{File.extname(File.basename(entity.image.path))}"
        image_dir  = "#{media_dir}/image/#{entity.id}"
        FileUtils.mkdir_p(image_dir) unless Dir.exists?(image_dir)
        FileUtils.copy(entity.image.path, "#{image_dir}/#{image_name}")
        file.puts "  image: #{image_name.inspect}"
      end
      unless entity.header_image.blank?
        image_name = "#{entity.long_slug}#{File.extname(File.basename(entity.header_image.path))}"
        image_dir  = "#{media_dir}/header_image/#{entity.id}"
        FileUtils.mkdir_p(image_dir) unless Dir.exists?(image_dir)
        FileUtils.copy(entity.header_image.path, "#{image_dir}/#{image_name}")
        file.puts "  header_image: #{image_name.inspect}"
      end
    end
    puts
  end
end

end