#!/usr/bin/python
import SocketServer, threading, socket, BaseHTTPServer, json 

# serverip = socket.gethostbyname(socket.gethostname())
serverip = '127.0.0.1'
# serverip = '192.168.0.20'
#serverip = '192.168.0.18'

###################################
servers_url  = serverip + ':8000' # Fixed entry point to service discovery
services_url = serverip + ':8001' # Load balancer
auth_url     = serverip + ':8002' # Authentication service, provides short lived tokens
configs_url  = serverip + ':8003' # A/B testing for game tuning
profiles_url = serverip + ':8004' # Savegame saves and loads
assets_url   = serverip + ':8005' # Dynamic game assets
leaders_url  = serverip + ':8006' # Leaderboard system

###################################
servers = {
   'services' : services_url
}

###################################
services = {
   'authentication': auth_url,
   'configs':        configs_url,
   'profiles':       profiles_url,
   'assets':         assets_url,
   'leaderboards':   leaders_url
}

###################################
# TODO: Look at oauth2 python library for possible implementation
access_token = {
   'credential':    '123344',
   'token':         '1234567890'
}

###################################
config = {
   'settingX':    'true',
   'settingY':    '640'
}

###################################
profile = {
   'coin':       '100',
   'gold':       '100',
   'wood':       '100',
   'stone':      '100'
}

###################################
asset = {
   'version':    '1',
   'data':       '1234567890'
}

###################################
leaderboard = [
   { 'entry': '1', 'name': 'John1', 'score': '123344' },
   { 'entry': '2', 'name': 'John2', 'score': '12334' },
   { 'entry': '3', 'name': 'John3', 'score': '1234' },
   { 'entry': '4', 'name': 'John4', 'score': '124' },
   { 'entry': '5', 'name': 'John5', 'score': '12' },
   { 'entry': '6', 'name': 'John6', 'score': '1' }
]

###################################
servers_json       = json.dumps(servers)
services_json      = json.dumps(services)
access_token_json  = json.dumps(access_token)
config_json        = json.dumps(config)
profile_json       = json.dumps(profile)
asset_json         = json.dumps(asset)
leaderboard_json   = json.dumps(leaderboard)

###################################
class GenericRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def ServeFileContent(self,filename):
    f = open(filename, 'r')
    if f:
      data = f.read()
      self.send_response(200)
      self.send_header('Access-Control-Allow-Origin', '*')
      self.send_header('Content-Type', 'octet/stream')
      self.send_header('Content-Length', len(data))
      self.end_headers()
      self.wfile.write(data)
      f.close()
    else:
      BadRequest(self)
    return
  def ServeJsonContent(self,json):
    self.send_response(200)
    self.send_header('Content-Type', 'application/json')
    self.end_headers()
    self.wfile.write(json)
    return
  def BadRequest(self):
    self.send_response(400, 'Bad Request: wrong path')
    self.send_header('Content-Type', 'application/json')
    self.end_headers()
    return

###################################
class ServersRequestHandler(GenericRequestHandler):
  def do_GET(self):
    if self.path == '/servers':
      self.ServeJsonContent(servers_json)
    else:
      self.BadRequest()
    return

###################################
class ServicesRequestHandler(GenericRequestHandler):
  def do_GET(self):
    if self.path == '/services':
      self.ServeJsonContent(services_json)
    else:
      self.BadRequest()
    return

###################################
class AuthenticationRequestHandler(GenericRequestHandler):
  def do_GET(self):
    if self.path == '/authenticate':
      self.ServeJsonContent(access_token_json)
    else:
      self.BadRequest()
    return

###################################
class ConfigRequestHandler(GenericRequestHandler):
  def do_GET(self):
    if self.path == '/config':
      self.ServeJsonContent(config_json)
    else:
      self.BadRequest()
    return

###################################
class ProfileRequestHandler(GenericRequestHandler):
  def do_GET(self):
    if self.path == '/profile':
      self.ServeJsonContent(profile_json)
    else:
      self.BadRequest()
    return

###################################
class AssetRequestHandler(GenericRequestHandler):
  def do_GET(self):
    if self.path == '/asset':
      self.ServeJsonContent(asset_json)
    elif self.path.startswith("/asset/"):
      self.ServeFileContent('../Data/' + self.path[7:])
    else:
      self.BadRequest()
    return

###################################
class LeaderboardRequestHandler(GenericRequestHandler):
  def do_GET(self):
    if self.path == '/leaderboard':
      self.ServeJsonContent(leaderboard_json)
    else:
      self.BadRequest()
    return

###################################
class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
  pass


###################################
def serve_on_port(server_url, handler):
  url_parts = server_url.split(':')
  server = ThreadingHTTPServer((url_parts[0], int(url_parts[1])), handler)
  server.serve_forever()


###################################
threading.Thread(target=serve_on_port, args=[servers_url,  ServersRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[services_url, ServicesRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[auth_url,     AuthenticationRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[configs_url,  ConfigRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[profiles_url, ProfileRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[assets_url,   AssetRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[leaders_url,  LeaderboardRequestHandler]).start()


