require "json"
require File.dirname(__FILE__) + '/PatientSynchronizer.rb'
require 'net/ssh'

JSON.create_id = nil

task :scpCDSILogs, :driver do |t, args|
  logDir = "./cdsi_logs"
  logs = ["catalina.out"]
  key = knife_search_for_key_name("cdsinvocation", args[:driver])
  user = "ec2-user"
  ip = knife_search_for_ip("cdsinvocation")
  Dir.mkdir("#{logDir}") unless File.exists?("#{logDir}")
  logs.each do |logname|
    sh('scp', '-o', 'StrictHostKeyChecking=no', '-i', "#{key}", "#{user}@#{ip}:/usr/local/tomcat8-8/logs/#{logname}", "#{logDir}")
  end
end

def knife_search_for_ip(machine_name)
  stack = ENV['JOB_NAME'] || ENV['USER']
  if ENV.key?('BUNDLE_BIN_PATH')
    raw_search = Bundler.with_clean_env { `/opt/chefdk/bin/knife search node \'role:#{machine_name} AND stack:#{stack}\' -Fj --config ~/Projects/vistacore/.chef/knife.rb` }
  else
    raw_search = `/opt/chefdk/bin/knife search node \'role:#{machine_name} AND stack:#{stack}\' -Fj --config ~/Projects/vistacore/.chef/knife.rb`
  end
  parsed_search = JSON.parse(raw_search)
  fail "More than one node with that name found" if parsed_search["results"] > 1
  fail "No node with that name found" if parsed_search["results"] == 0
  ip = parsed_search["rows"][0]['automatic']['ipaddress']
end

def knife_search_for_key_name(machine_name, driver)
  stack = ENV['JOB_NAME'] || ENV['USER']
  driver == "aws" ? key_box = "#{machine_name}-#{stack}-noint" : key_box = "#{machine_name}-#{stack}"
  raw_search = `/opt/chefdk/bin/knife search node \'name:#{key_box}\' -Fj --config ~/Projects/vistacore/.chef/knife.rb`
  parsed_search = JSON.parse(raw_search)
  fail "More than one key was found for: #{machine_name}" if parsed_search["results"] > 1
  fail "No key was found for: #{machine_name}" if parsed_search["results"] == 0
  begin
    key = parsed_search["rows"][0]['normal']["chef_provisioning"]["reference"]["key_name"]
  rescue NoMethodError
    begin
      key = parsed_search["rows"][0]['normal']["chef_provisioning"]["location"]["key_name"] 
    rescue 
      raise %/
      No attribute found for #{machine_name}-#{stack} at: ['rows'][0]['normal']['chef_provisioning']['location']['key_name'] 
      or ['rows'][0]['normal']['chef_provisioning']['reference']['key_name']
      /
    end
  end
  key_name = File.expand_path(key, "#{ENV['HOME']}/Projects/vistacore/.chef/keys")
end

task :syncCache do
  patient_sync_list = [
    "9E7A;140",
    "9E7A;253",
    "9E7A;100184"     
  ]

  ENV["JDS_IP"] = knife_search_for_ip("jds")
  ENV["VX_SYNC_IP"] = knife_search_for_ip("vxsync")
  PatientSynchronizer.wait_until_operational_data_loaded "http://#{ENV["JDS_IP"]}:9080", 600, ["9E7A", "C877"]
  PatientSynchronizer.synchronize_patient_list "http://#{ENV["VX_SYNC_IP"]}:8080", 3600, patient_sync_list
end
