#!/usr/bin/python
import cgi, cgitb, sys, math
import MySQLdb
import dbname
import logon
import game


def add_player(form,cur):
    uid = logon.logon(form,cur)
    if not uid:
        print '<p>login failed.'
        print '</html>'
        sys.exit()

    try:
        cur.execute("SELECT red, green, blue, xloc, yloc FROM users WHERE uid = %d" % uid)
        rows = cur.fetchall()
        if cur.rowcount==0:
            print '<p>user data not found'
            print '</html>'
            sys.exit()
        row = rows[0]
        username = form["username"].value
        password = form["password"].value
        player = form["player"].value
        if  not player: player="player"
        xpos = row[3]
        ypos = row[4]
        if xpos<0 or xpos>400: xpos=200
        if ypos<0 or ypos>400: ypos=200
        rs = (username, password, player, row[0], row[1], row[2], xpos, ypos)
        cur.execute("""INSERT INTO gameboard ( username, password, player, modified,
        red, green, blue, px, py, vx, vy, status )
        VALUES (
        '%s',
        '%s',
        '%s',
        now(),
        %d, %d, %d,
        %g, %g, 20, 30, 'join'
        )""" % rs )
        print '<p>player <b>%s</b> has been added to the gameboard.' % player
    except MySQLdb.Error, e:
       print e
       print '</html>'
       sys.exit()
       
def remove_player(form,cur):
    try:
        player = form['player'].value
        password = form['password'].value
        cur.execute("DELETE FROM gameboard WHERE player='%s' AND password='%s'" %
                (player,password) )
        print 'player <b>%s</b> removed from gameboard' % player
    except MySQLdb.Error, e:
        print e
        
       
def update_player(form,cur):
    try:
        player = form['player'].value
        password = form['password'].value
        vx=float(form['vx'].value)
        vy=float(form['vy'].value)
        # limit velocity to 140
        vn = math.hypot(vx,vy)/140.0
        if (vn>1.0):
            vx = vx/vn
            vy = vy/vn
        rs = (vx,vy,player,password)
        cur.execute ("UPDATE gameboard SET vx=%g, vy=%g, status='update', modified=now() where player='%s' and password='%s'" % rs)
        print '<p>player <b>%s</b> velocity set to (%s, %s)' % (player, vx, vy)
        print '</html>'
    except MySQLdb.Error, e:
        print e
 
def show_status(cur):
    try:
        cur.execute ("SELECT modified, player, red, green, blue, px, py, vx, vy, status, id FROM gameboard")
    except MySQLdb.Error, e:
        print e

    rows = cur.fetchall()
    print '<pre>'
    for row in rows:
        modified = row[0]
        player = row[1]
        red = int(row[2])
        green = int(row[3])
        blue = int(row[4])
        px = float(row[5])
        py = float(row[6])
        vx = float(row[7])
        vy = float(row[8])
        status = row[9]
        id = int(row[10])
        rs = (modified, player, id, red, green, blue, px, py, vx, vy, status)
        print '"%s" "%s" %d %d %d %d %g %g %g %g "%s"' % rs
    print '</pre>'
    
def move_player(cur, rs):
    try:
        cur.execute("""UPDATE gameboard SET modified='%s',
        px=%g, py=%g, vx=%g, vy=%g WHERE id=%d""" % rs)
    except MySQLdb.Error, e:
        print e
        print '</html>'
        sys.exit()
        
    
def play(cur):
    import time
    try:
        cur.execute("SELECT now()")
    except MySQLdb.Error, e:
        print e
        print '</html>'
        sys.exit()
    rows = cur.fetchall()
    now = rows[0][0];
    fmt = '%Y-%m-%d %H:%M:%S'
    d = time.strptime(now,fmt)
    sn = (d[3]*60+d[4])*60+d[5]
    #dtn = datetime.datetime(*d[0:6])
   
    print '<p>Datetime: '
    print now
      
    try:
        cur.execute("SELECT modified, id, px, py, vx, vy FROM gameboard")
    except MySQLdb.Error, e:
        print e
        print '</html>'
        sys.exit()
    rows = cur.fetchall()
    print '<p><pre>'
    for row in rows:
        modified = row[0]
        d = time.strptime(modified,fmt)
        s = (d[3]*60+d[4])*60+d[5]
        #dt = datetime.datetime(*d[0:6])
        diff = max(sn - s,1.0)
        id = int(row[1])
        #print '%d %s' % (diff,player)
        px = float(row[2])
        py = float(row[3])
        vx = float(row[4])
        vy = float(row[5])
        ball = game.Ball(17,px,py,vx,vy)
        game.update_ball(ball,diff)
        rs = (now, ball.x, ball.y, ball.vx, ball.vy, id)
        move_player(cur,rs)
        print 'id %d %g %g %g %g' % (id, px, py, vx, vy)
        
    print '</pre>'
    
    
    

#-------main program
cgitb.enable() # formats errors in HTML

sys.stderr = sys.stdout
print "Content-type: text/html"
print
print '<html>'


form = cgi.FieldStorage()
db = dbname.dbopen()
cur = db.cursor()

if form.has_key("action"): action = form["action"].value
else: action = 'status'

#print '<p>action: <b>%s</b>' % action


if action=='status': show_status(cur)
elif action=='join': add_player(form,cur)
elif action=='update': update_player(form,cur)
elif action=='move': play(cur)
elif action=='remove': remove_player(form,cur)
else: print '<p>action <b>%s</b> not recognized' % action
print '</html>'
cur.close()
db.close()
