require 'yaml' require 'pg'

def load_db_from_yml_spec (a_spec)

a_spec["folders"].each do |elem|
  Pathname.glob("#{MOD_PATH}/db/#{elem}/**/").sort.each do |folder|
    Dir["#{folder}/*.sql"].sort.each do |file|
      puts "file #{file}"
      $db.exec( File.read(file) )
    end
  end
end

return if a_spec["execute"].nil?

a_spec["folders"].each do |folder|
  next unless a_spec["execute"].has_key?(folder)
  next unless a_spec["execute"][folder].is_a?(Array)
  a_spec["execute"][folder].each do |to_execute|
    puts to_execute
    $db.exec( "SELECT #{ to_execute};" )
  end
end

end

def load_db_config

ENV['RAILS_ENV'] ||= 'development'
$db_config = YAML.load_file(File.join('config', 'database.yml'))[ENV['RAILS_ENV']]

end

def connect_to_pg

load_db_config()
$db = PG.connect(host: $db_config['host'], port: $db_config['port'], dbname: $db_config['database'], user: $db_config['username'], password: $db_config['password'])

end

def config_json_api

jsonapi_service = SP::Duh::JSONAPI::Service.new($db, JSONAPI_PREFIX)
jsonapi_service.setup()
jsonapi_service.configuration.reload!

end

task :pg_connect do

$db.close unless $db.nil?
connect_to_pg()
$db

end

desc 'Reload jsonapi' task :config_jsonapi => :pg_connect do

config_json_api()

end

task :production_safety do

load_db_config()
unless Object.const_defined?('FORBIDDEN_HOSTS')
  raise "To run this task you must define 'FORBIDDEN_HOSTS' No, you don't know what you are doing!!!!"
end
if FORBIDDEN_HOSTS.include? %x[hostname -s].strip
  raise "For safety reasons this task can't be run on this machine, no you don't know what you are doing"
end
unless %w(localhost tocstaging cloudex 127.0.0.1).include? $db_config['host']
  raise "For safety reasons database host #{$db_config['host']} is not allowed"
end

end

desc 'Reload GEM functions defined in db_functions.yml (FOR LOCAL GEM ONLY)' task :reload_functions => [:production_safety, :pg_connect] do

unless Object.const_defined?('MOD_PATH')
  raise "To run this task you must define 'MOD_PATH'!"
end
load_db_from_yml_spec(YAML.load_file(File.join(MOD_PATH, 'config', 'db_functions.yml')))

end

desc 'Create a new database seed using db_seed.yml spec' task :create_db => :production_safety do

begin
  connect_to_pg()
  unless $db.nil?
    $db.close
    nuke_db = ask('Are you sure? The current database will be destroyed!!!!') { |q| q.default = 'no' }
    if nuke_db.downcase == 'yes'
      %x[dropdb -p #{$db_config['port']} -U #{$db_config['username']} -h #{$db_config['host']} #{$db_config['database']}]
      raise 'dropdb failed, bailing out' unless $?.success?
    end
  end
rescue
end

%x[PGPASSWORD=#{$db_config['password']} createdb -h #{$db_config['host']} -U #{$db_config['username']} #{$db_config['database']}]
raise 'createdb failed, bailing out' unless $?.success?
connect_to_pg()
load_db_from_yml_spec(YAML.load_file(File.join(MOD_PATH, 'config', 'db_seed.yml')))
load_db_from_yml_spec(YAML.load_file(File.join(MOD_PATH, 'config', 'db_functions.yml')))
config_json_api()

end