=begin
  TODO: All process initialization and management through this plugin?
  TODO: Server/Game/Generic app process manager
  Find open processes of all registered apps
  able to kill them or restart them, so record the various details somewhere..able to start them.
  Rpt/log tailer... also handy for updater log etc ;-)
  Will require user authorization at some point :P (Or no such thing, but ssh-recommended?)
=end

require "net/http"
require "net/https"
require "erb"
require "singleton"

module Six
  module Network
    # http://updater.dev-heaven.net/goldberg/auth/login

    USERAGENT = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1'

    class Panel
      include Singleton
      attr_reader :http
      def Panel.setlogger(log)
        @logger = log
      end

      def Panel.logger
        @logger
      end

      def Panel.login(webid, password, force = false)
        unless @headers.nil? || force
          raise ScriptError, "You should already be logged in!"
        end
        url = URI.parse("http://updater.dev-heaven.net/goldberg/auth/login")
        @http = Net::HTTP.new(url.host, url.port)
        #@http.use_ssl = true

        # GET request -> so the host can set cookies
        resp, data = @http.get2(url.path, {'User-Agent' => USERAGENT})
        cookie = resp.response['set-cookie'].split('; ')[0]
        resp.body[/name="authenticity_token" type="hidden" value="(.*)" \/>/]
        auth = $1

        # POST request -> logging in
        data = "authenticity_token=#{ERB::Util.url_encode(auth)}&login[name]=#{ERB::Util.url_encode(webid)}&login[password]=#{ERB::Util.url_encode(password)}&commit=Login"
        @headers = {
          'Cookie' => cookie,
          'Referer' => url.to_s,
          'Content-Type' => 'application/x-www-form-urlencoded',
          'User-Agent' => USERAGENT
        }

        resp, data = @http.post(url.path, data, @headers)
        # resp, data = Net::HTTP.post_form(URI.parse(url),
        #                           {'login_user'=>'admin', 'login_password'=>'admin', 'authenticity_token' => auth, 'commit'=>'Login'})
        #  {'login[user]'=>'admin', 'login[password]'=>'admin', 'authenticity_token' => auth, 'commit'=>'Login'})

        # Output on the screen -> we should get either a 302 redirect (after a successful login) or an error page
        #logger.debug 'Code = ' + resp.code
        #logger.debug 'Message = ' + resp.message
      #  resp.each {|key, val| puts key + ' = ' + val}
        #logger.debug data
      end

      def Panel.get(path)
        @http.get(path, @headers)
      end
    end
  end
end