#!/usr/bin/env python
## -*- coding: utf-8 -*-
import logging

import os
import json
import sys,getopt 
import tornado.ioloop
import tornado.web
from tornado.escape import json_encode
from eu.dnetlib.hBaseConnection.HbaseConnector import HBaseConnector

root = os.path.dirname(__file__)
template_root = os.path.join(root, 'static')
connectionHBASE = HBaseConnector()


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.redirect("/inspector/index.html")


class ServerHandler(tornado.web.RequestHandler):
    def get(self, actionRequest):
        """

        :param actionRequest:
        """
        if actionRequest == "openConnection":
            host = self.get_argument("hostName", None, True)
            if host== None:
                self.write(json_encode({"connection": "error Host is not present"}))
            else:
                try:
                    print "connecting to host "+host
                    connectionHBASE.openConnection(host)
                    self.write(json_encode({"connection": "open"}))
                except Exception as e:
                    self.write(json_encode({"connection": "error", "exception" : e}))
        elif actionRequest == "listTable":
            self.write(json_encode(connectionHBASE.getTables()))
        elif actionRequest == "closeConnection":
            connectionHBASE.closeConnection()
            self.write(json_encode({"connection": "close"}))
        elif actionRequest == "test":
            self.write(json_encode(connectionHBASE.doScan("db_openaireplus_node1","50|", 10,"result:body")))


class HbaseHandler(tornado.web.RequestHandler):
    def get(self, actionRequest):
        try:
            table = actionRequest.split("/")[0]
            action = actionRequest.split("/")[1]
            row_prefix=self.get_argument("row_prefix", None, True)
            row_start=self.get_argument("row_start", None, True)
            column_prefix=self.get_argument("column_prefix", None, True)
            limit=self.get_argument("limit", None, True)
            if action == "scan":
                self.write(json_encode(connectionHBASE.doScan(table_name=table, row_prefix=row_prefix, row_start=row_start, limit=int(limit), column_prefix=column_prefix)))
            elif action == 'get_family':
                self.write(json_encode(connectionHBASE.getFamilies(table_name=table)))


        except Exception as e:
            logging.error(e)


    def post(self, actionRequest):
        try:
            table = actionRequest.split("/")[0]
            action = actionRequest.split("/")[1]

            data = json.loads(self.request.body)
            row_prefix = None
            row_start = None
            column_prefix = None
            limit = 0

            if "row_prefix" in data.keys():
                row_prefix = data["row_prefix"].encode("utf-8")

            if "row_start" in data.keys():
                row_start = data["row_start"].encode("utf-8")
            if "column_prefix" in data.keys():
                column_prefix = data["column_prefix"].encode("utf-8")
            if "limit" in data.keys():
                limit = data["limit"].encode("utf-8")
            if action == "scan":
                self.write(json_encode(connectionHBASE.doScan(table_name=table, row_prefix=row_prefix, row_start=row_start, limit=int(limit), column_prefix=column_prefix)))
            elif action == 'get_family':
                self.write(json_encode(connectionHBASE.getFamilies(table_name=table)))


        except Exception as e:
            logging.error(e)





application = tornado.web.Application([

                                          (r'^/$', MainHandler),
                                          (r'^/inspector/$', MainHandler),
                                          (r'^/server/(.*)$', ServerHandler),
                                          (r'^/hbase/(.*)$', HbaseHandler),
                                          (r'^/inspector/(.*)$', tornado.web.StaticFileHandler, {'path': template_root}),
                                      ], debug=False, static_path=os.path.join(root, 'static'))






def main(argv):
   port = ''
   try:
      opts, args = getopt.getopt(argv,"hp:",["pport="])
   except getopt.GetoptError:
      print 'Usage -p port '
      sys.exit(2)
   for opt, arg in opts:
      if opt == '-h':
         print 'Usage python server.py -p <port>'
         sys.exit()
      elif opt in ("-p", "--pport"):
         port = arg
   if '' == port:
       port=8080
   application.listen(int(port))
   print "The server is starting on http://localhost:"+port
   tornado.ioloop.IOLoop.instance().start()




if __name__ == "__main__":
   main(sys.argv[1:])


