# :nocov: # borrowed from architect4r require 'os' require 'zip' require 'pathname' require File.expand_path('../windows_server_manager', __FILE__) require File.expand_path('../starnix_server_manager', __FILE__)

namespace :neo4j do

def clear_task_if_defined(task_name)
  Rake::Task["neo4j:#{task_name}"].clear if Rake::Task.task_defined?("neo4j:#{task_name}")
end

def server_path(environment)
  Pathname.new('db/neo4j').join(environment.to_s)
end

def server_manager_class
  ::Neo4j::RakeTasks::ServerManager.class_for_os
end

def server_manager(environment)
  ::Neo4j::RakeTasks::ServerManager.new_for_os(server_path(environment))
end

def cyanize(string)
  "\e[36m#{string}\e[0m"
end

clear_task_if_defined(:install)
desc 'Install Neo4j with auth disabled in v2.2+'
task :install, :edition, :environment do |_, args|
  args.with_defaults(edition: 'community-latest', environment: 'development')

  puts "Install Neo4j (#{args[:environment]} environment)..."

  server_manager = server_manager(args[:environment])
  server_manager.install(args[:edition])

  if server_manager.supports_auth?
    server_manager.config_auth_enabeled!(false)
  end

  puts 'To start it type one of the following:'
  puts cyanize('  rake neo4j:start')
  puts cyanize('  rake neo4j:start[ENVIRONMENT]')
  puts 'To change the server port (default is 7474) type:'
  puts cyanize('  neo4j:config[ENVIRONMENT,PORT]')
end

clear_task_if_defined(:start)
desc 'Start the Neo4j Server'
task :start, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Starting Neo4j in #{args[:environment]}..."
  server_manager = server_manager(args[:environment])
  server_manager.start
end

clear_task_if_defined(:start_no_wait)
desc 'Start the Neo4j Server asynchronously'
task :start_no_wait, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Starting Neo4j (no wait) in #{args[:environment]}..."
  server_manager = server_manager(args[:environment])
  server_manager.start(false)
end

clear_task_if_defined(:console)
desc 'Start the Neo4j Server in the foreground'
task :console, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Starting Neo4j (foreground) in #{args[:environment]}..."
  server_manager = server_manager(args[:environment])
  server_manager.console
end

clear_task_if_defined(:shell)
desc 'Open Neo4j REPL Shell'
task :shell, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Starting Neo4j shell in #{args[:environment]}..."
  server_manager = server_manager(args[:environment])
  server_manager.shell
end

clear_task_if_defined(:config)
desc 'Configure Server, e.g. rake neo4j:config[development,8888]'
task :config, :environment, :port do |_, args|
  args.with_defaults(environment: :development, port: 7474)

  puts "Config Neo4j in #{args[:environment]}"

  server_manager = server_manager(args[:environment])
  server_manager.config_port!(args[:port].to_i)
end

clear_task_if_defined(:stop)
desc 'Stop the Neo4j Server'
task :stop, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Stopping Neo4j in #{args[:environment]}..."

  server_manager = server_manager(args[:environment])
  server_manager.stop
end

clear_task_if_defined(:info)
desc 'Get info for the Neo4j Server'
task :info, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Getting Neo4j info for #{args[:environment]}..."

  server_manager = server_manager(args[:environment])
  server_manager.info
end

clear_task_if_defined(:indexes)
desc 'List indexes for the Neo4j server'
task :indexes, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Getting Neo4j indexes for #{args[:environment]}..."

  server_manager = server_manager(args[:environment])
  server_manager.print_indexes
end

clear_task_if_defined(:constraints)
desc 'List constraints for the Neo4j server'
task :constraints, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Getting Neo4j constraints for #{args[:environment]}..."

  server_manager = server_manager(args[:environment])
  server_manager.print_constraints
end

clear_task_if_defined(:restart)
desc 'Restart the Neo4j Server'
task :restart, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Restarting Neo4j in #{args[:environment]}..."

  server_manager = server_manager(args[:environment])
  server_manager.restart
end

clear_task_if_defined(:reset_yes_i_am_sure)
desc 'Reset the Neo4j Server'
task :reset_yes_i_am_sure, :environment do |_, args|
  args.with_defaults(environment: :development)

  puts "Resetting Neo4j in #{args[:environment]}..."

  server_manager = server_manager(args[:environment])
  server_manager.reset
end

clear_task_if_defined(:change_password)
desc 'Neo4j 2.2+: Change connection password'
task :change_password do |_, _args|
  # Maybe we should take the environment as an arg and
  # find the port in the config file?
  server_manager_class.change_password!
end

clear_task_if_defined(:enable_auth)
desc 'Neo4j 2.2+: Enable Auth'
task :enable_auth, :environment do |_, args|
  args.with_defaults(environment: :development)

  server_manager = server_manager(args[:environment])
  server_manager.config_auth_enabeled!(true)

  puts 'Neo4j basic authentication enabled. Restart server to apply.'
end

clear_task_if_defined(:disable_auth)
desc 'Neo4j 2.2+: Disable Auth'
task :disable_auth, :environment do |_, args|
  args.with_defaults(environment: :development)

  server_manager = server_manager(args[:environment])
  server_manager.config_auth_enabeled!(false)

  puts 'Neo4j basic authentication disabled. Restart server to apply.'
end

end