# borrowed from architect4r
require 'os'

namespace :neo4j do
  desc "Install Neo4j"
  task :install, :edition, :version do |t, args|
    args.with_defaults(:edition => "community")

    file = args[:version] ? "#{args[:edition]}-#{args[:version]}" : "#{args[:edition]}"
    puts "Installing Neo4j-#{file}"
    
    if OS::Underlying.windows?
      # Download Neo4j
      unless File.exist?('neo4j.zip')
        df = File.open('neo4j.zip', 'wb')
        begin
          df << HTTParty.get("http://dist.neo4j.org/neo4j-#{file}-windows.zip")
        ensure
          df.close()
        end
      end

      # Extract and move to neo4j directory
      unless File.exist?('neo4j')
        Zip::ZipFile.open('neo4j.zip') do |zip_file|
          zip_file.each do |f|
           f_path=File.join(".", f.name)
           FileUtils.mkdir_p(File.dirname(f_path))
           begin
             zip_file.extract(f, f_path) unless File.exist?(f_path)
           rescue
             puts f.name + " failed to extract."
           end
          end
        end
        FileUtils.mv "neo4j-#{file}", "neo4j"
     end

      # Install if running with Admin Privileges
      if %x[reg query "HKU\\S-1-5-19"].size > 0 
        %x[neo4j/bin/neo4j install]
        puts "Neo4j Installed as a service."
      end

    else
      # E.g. http://dist.neo4j.org/neo4j-community-2.0.0-unix.tar.gz
      %x[wget http://dist.neo4j.org/neo4j-#{file}-unix.tar.gz]
      %x[tar -xvzf neo4j-#{file}-unix.tar.gz]
      %x[mv neo4j-#{file} neo4j]
      %x[rm neo4j-#{file}-unix.tar.gz]
      puts "Neo4j Installed in to neo4j directory."
    end
    puts "Type 'rake neo4j:start' to start it"
  end
  
  desc "Start the Neo4j Server"
  task :start do
    puts "Starting Neo4j..."
    if OS::Underlying.windows? 
      if %x[reg query "HKU\\S-1-5-19"].size > 0 
        %x[neo4j/bin/Neo4j.bat start]  #start service
      else
        puts "Starting Neo4j directly, not as a service."
        %x[neo4j/bin/Neo4j.bat]
      end      
    else
      %x[neo4j/bin/neo4j start]  
    end
  end
  
  desc "Stop the Neo4j Server"
  task :stop do
    puts "Stopping Neo4j..."
    if OS::Underlying.windows? 
      if %x[reg query "HKU\\S-1-5-19"].size > 0
         %x[neo4j/bin/Neo4j.bat stop]  #stop service
      else
        puts "You do not have administrative rights to stop the Neo4j Service"   
      end
    else  
      %x[neo4j/bin/neo4j stop]
    end
  end

  desc "Restart the Neo4j Server"
  task :restart do
    puts "Restarting Neo4j..."
    if OS::Underlying.windows? 
      if %x[reg query "HKU\\S-1-5-19"].size > 0
         %x[neo4j/bin/Neo4j.bat restart] 
      else
        puts "You do not have administrative rights to restart the Neo4j Service"   
      end
    else  
      %x[neo4j/bin/neo4j restart]
    end
  end

  desc "Reset the Neo4j Server"
  task :reset_yes_i_am_sure do
    # Stop the server
    if OS::Underlying.windows? 
      if %x[reg query "HKU\\S-1-5-19"].size > 0
         %x[neo4j/bin/Neo4j.bat stop]
         
        # Reset the database
        FileUtils.rm_rf("neo4j/data/graph.db")
        FileUtils.mkdir("neo4j/data/graph.db")
        
        # Remove log files
        FileUtils.rm_rf("neo4j/data/log")
        FileUtils.mkdir("neo4j/data/log")

        %x[neo4j/bin/Neo4j.bat start]
      else
        puts "You do not have administrative rights to reset the Neo4j Service"   
      end
    else  
      %x[neo4j/bin/neo4j stop]
      
      # Reset the database
      FileUtils.rm_rf("neo4j/data/graph.db")
      FileUtils.mkdir("neo4j/data/graph.db")
      
      # Remove log files
      FileUtils.rm_rf("neo4j/data/log")
      FileUtils.mkdir("neo4j/data/log")
      
      # Start the server
      %x[neo4j/bin/neo4j start]
    end
  end

end