# we must require rubygems because LocalService account don't have RUBYOPT= defined
require 'rubygems'
require "win32/service"

SERVICE_NAME = "MongrelHttp"
SERVICE_DISPLAYNAME = "Mongrel Basic HTTP Service"
SERVICE_ROOT = File.expand_path(File.dirname(__FILE__))
SERVICE_SCRIPT = File.join(SERVICE_ROOT, __FILE__)

if ARGV[0] == "install"
  require 'rbconfig'
  
  argv = []
  argv << '"' + Config::CONFIG['bindir'] + '/ruby.exe"'
  argv << '"' + SERVICE_SCRIPT + '"'
  
  svc = Win32::Service.new
  svc.create_service{ |s|
    s.service_name     = SERVICE_NAME
    s.display_name     = SERVICE_DISPLAYNAME
    s.binary_path_name = argv.join(' ')
    s.dependencies     = []
  }
  svc.close
  puts "#{SERVICE_DISPLAYNAME} service installed"

elsif ARGV[0] == "start"
   Win32::Service.start(SERVICE_NAME)
   started = false
   while started == false
      s = Win32::Service.status(SERVICE_NAME)
      started = true if s.current_state == "running"
      break if started == true
      puts "One moment, " + s.current_state
      sleep 1
   end
   puts "#{SERVICE_DISPLAYNAME} service started"

elsif ARGV[0] == "stop"
  Win32::Service.stop(SERVICE_NAME)
  stopped = false
  while stopped == false
    s = Win32::Service.status(SERVICE_NAME)
    stopped = true if s.current_state == "stopped"
  break if stopped == true
    puts "One moment, " + s.current_state
    sleep 1
  end
  puts "#{SERVICE_DISPLAYNAME} service stopped"

elsif ARGV[0] == "remove"
  begin
    Win32::Service.stop(SERVICE_NAME)
  rescue
  end
  begin
    Win32::Service.delete(SERVICE_NAME)
  rescue
  end
  puts "#{SERVICE_DISPLAYNAME} service deleted"
else

  # This was added to avoid users running the service script form plain command line
  # (LocalService accound don't have HOMEDRIVE defined.)
  if ENV["HOMEDRIVE"]!=nil
    puts "No option provided.  You must provide an option.  Exiting..."
    exit
  end

  require 'mongrel'
  require 'yaml'
  require 'zlib'
  
  class SimpleHandler < Mongrel::HttpHandler
      def process(request, response)
        response.start do |head,out|
          head["Content-Type"] = "text/html"
          results = "<html><body>Your request:<br /><pre>#{request.params.to_yaml}</pre><a href=\"/files\">View the files.</a></body></html>"
          if request.params["HTTP_ACCEPT_ENCODING"] == "gzip,deflate"
            head["Content-Encoding"] = "deflate"
            # send it back deflated
            out << Zlib::Deflate.deflate(results)
          else
            # no gzip supported, send it back normal
            out << results
          end
        end
      end
  end

  # I commented this until we found a way to log events without problems (maybe file locking mechanism?)
  #STDERR.reopen(File.join(File.dirname(__FILE__), 'service.log'), "w")
  #STDERR.sync = true
  
  def log(message)
    #STDERR.puts Time.now.strftime("%Y-%m-%d %H:%M:%S") + ' - ' + message
  end

  class HttpDaemon < Win32::Daemon
    def service_init
      log "** #{SERVICE_DISPLAYNAME} starting..."
      
      @http_server = Mongrel::HttpServer.new("0.0.0.0", 3000)
      @simple = SimpleHandler.new
      @http_server.register("/", @simple)
      
      @files = Mongrel::DirHandler.new(SERVICE_ROOT)
      @http_server.register("/files", @files)
      
      log "** Done initialization."
    end
    
    def service_stop
      log "** Stop signal received."
    end

    def service_main
      @http_server.run
      
      while state == RUNNING
        sleep 1
      end
      
      @http_server.stop
    end
  end 
      
  svc = HttpDaemon.new
  svc.mainloop
  
end


