#!/usr/bin/oo-ruby

# Utiltity to import the mongo database into json documents containing analytics data for applications
infile = nil
if ARGV.include? "--infile"
  index = ARGV.index("--infile")
  infile = ARGV[index+1]
end

if infile.nil? 
  puts "Usage :"
  puts "  #{__FILE__} --infile <filename>" 
  exit 1
end


require '/var/www/openshift/broker/config/environment'
include Mongo

u = Rails.application.config.datastore[:user]
p = Rails.application.config.datastore[:password]
hp = Rails.application.config.datastore[:host_port]
db = Rails.application.config.datastore[:db]


puts "Extracting analytics from '#{infile}'"
basename = File.basename(infile)
`cp #{infile} /tmp/; cd /tmp/; tar xvzf #{basename} >& /dev/null`
if not File.directory?("/tmp/tmp/analytics")
  puts "Invalid input dump"
  exit
end

files = [['analytics.apps.json', 'applications'], ['analytics.domains.json','domains'], ['analytics.usage.json', 'usage'], ['analytics.users.json', 'cloud_users']]

files.each do |file, collection|
    puts
    puts "Running mongoimport on file [#{file}] on collection [#{collection}]"
    cmd = "mongoimport --username #{u} --password #{p} --host #{hp} --file /tmp/tmp/analytics/#{file} --db analytics --collection #{collection} --upsert"
    system(cmd)
end

`rm -rf /tmp/tmp/analytics`

def analytics_db(read_preference=:secondary, session_name='default')
  config = Mongoid::Config.sessions[session_name]
  hosts = config['hosts']
  ssl = config['options']['ssl']
  if hosts.length > 1
    con = MongoReplicaSetClient.new(hosts, :read => read_preference, :ssl => ssl)
  else
    host_port = hosts[0].split(':')
    con = MongoClient.new(host_port[0], host_port[1].to_i, :ssl => ssl)
  end
  adb = con.db('analytics')
  adb.authenticate(config['username'], config['password'])
  adb
end

def mongofind(collection_name, query, selection)
  analytics_db.collection(collection_name).find(query, selection) do |mcursor|
    mcursor.each do |hash|
      yield hash
    end
  end
end
# now post process
puts
puts "Post processing.."
$coll = analytics_db.collection("applications")
mongofind("applications", { }, { :fields => ["_id","component_instances","group_instances"], :timeout => false }) do |app|
  begin
    new_gis = []
    app["group_instances"].each { |gi|
      new_gears = []
      gi["gears"].each { |gear|
        new_gears << { "_id" => gear["_id"].dup }
      } if gi["gears"]
      new_gis << { "gears" => new_gears }
    } if app["group_instances"]
    new_cis = []
    app["component_instances"].each { |ci|
      new_cis << { "cartridge_name" => ci["cartridge_name"].dup }
    } if app["component_instances"]
    $coll.update({"_id" => app["_id"]}, {"$set" => {"group_instances" => new_gis, "component_instances" => new_cis}} ) if app["_id"]
  rescue Exception => e
    puts e.message
    puts e.backtrace
  end
end

puts "Import complete!"
