# Filename: A08_multiplayer_demo_client.py
# Written by: James D. Miller

import sys, os
import pygame

# PyGame Constants
from pygame.locals import *
from pygame.color import THECOLORS

# Network stuff. Note "connection" is a single instantiation.
from PodSixNet.Connection import connection, ConnectionListener

# Argument parsing...
import argparse

#=======================================================================
# Classes       
#=======================================================================

class NetworkListener(ConnectionListener):
    def __init__(self, (host, port)):
        self.Connect((host, port))

        self.client_colors = {'C1': THECOLORS["green"],  'C2': THECOLORS["tan"],'C3': THECOLORS["black"],'C4': THECOLORS["blue"],
                              'C5': THECOLORS["pink"],   'C6': THECOLORS["red"],'C7': THECOLORS["coral"],'C8': THECOLORS["orangered1"],
                              'C9': THECOLORS["grey80"],'C10': THECOLORS["rosybrown3"]}
        
        self.background_color = THECOLORS["white"]
        self.client_name = 'C0'
        self.client_color = THECOLORS["black"]
        
    def Network_hello(self, data):
        global Player_ID, user_state
        print "Network_hello:", data
        
        Player_ID = data['P_ID']
        self.client_name = 'C' + str(Player_ID)
        
        self.background_color = THECOLORS["yellow"]
        self.client_color = self.client_colors[self.client_name]
        
        # Initialize user state dictionary.
        user_state = {'action': 'CN',
                      'ID': Player_ID,
                      'mouseXY':(0,0), 'mouseB1':'U',
                      'a':'U', 's':'U',
                      'd':'U', 'w':'U'}
        
        pygame.display.set_caption("Client: GamePad #" + str(Player_ID)) 
        
        
#=======================================================================
# Functions       
#=======================================================================

def signoff(user_state):
    sys.exit()
    
def checkforUserInput(user_state):
    
    # Check the button status.
    (button1, button2, button3) = pygame.mouse.get_pressed()    
    
    # Get all the events since the last call to get().
    for event in pygame.event.get():
        if (event.type == pygame.QUIT): 
            signoff(user_state)
        elif (event.type == pygame.KEYDOWN):
            if (event.key == K_ESCAPE):
                signoff(user_state)
            
            elif (event.key==K_c):
                client_display.fill(THECOLORS["blue"])  
            
            elif (event.key==K_1):            
                return 1           
            elif (event.key==K_2):                          
                return 2
            elif (event.key==K_3):
                return 3   
            
            elif (event.key==K_a):
                user_state['a'] = 'D'
            elif (event.key==K_s):
                user_state['s'] = 'D'
            elif (event.key==K_d):
                user_state['d'] = 'D'
            elif (event.key==K_w):
                user_state['w'] = 'D'
                
        elif (event.type == pygame.KEYUP):
            if (event.key==K_a):
                user_state['a'] = 'U'
            elif (event.key==K_s):
                user_state['s'] = 'U'
            elif (event.key==K_d):
                user_state['d'] = 'U'
            elif (event.key==K_w):
                user_state['w'] = 'U'
        
        elif event.type == pygame.MOUSEBUTTONDOWN:
            user_state['mouseB1'] = 'D'
        
        elif event.type == pygame.MOUSEBUTTONUP:
            user_state['mouseB1'] = 'U'

        # cursor x,y
        user_state['mouseXY'] = pygame.mouse.get_pos()

#=======================================================================
# Main program statements       
#=======================================================================

pygame.init()

client_display = pygame.display.set_mode((600,400))

# Instantiate clock to help control the framerate.
client_clock = pygame.time.Clock()

# Background color of the game pad.   
client_display.fill(THECOLORS["grey"])

# Font object for rendering text onto display surface.
fnt = pygame.font.SysFont("Arial", 14)

Player_ID = 0

parser = argparse.ArgumentParser(description='Input client parameters.')
# Example IP address used here; edit this line.
parser.add_argument('serverIP', type=str, nargs='?', default="138.236.65.69")
args = parser.parse_args()
print "args:", args.serverIP

# Initialize the state dictionary
user_state = {}

# Note, the connection can take place in the NetworkListener or here.
# This "connection" is an instatiation of the EndPoint class that is done in the Connection.py file.
# Note, if you do this here, you have to call the "DoConnect" method, not the "Connect" method that 
# is indicated on the web site.
#connection.DoConnect((args.serverIP, 4330))

network_listener = NetworkListener((args.serverIP, 4330))

framerate_limit = 100
flip_timer = 0.0

while True:
    
    dt_s = float(client_clock.tick(framerate_limit) * 1e-3)
    #client_clock.tick(framerate_limit)
    
    connection.Pump()
    network_listener.Pump()    
    
    checkforUserInput(user_state)
    if Player_ID != 0:
        #print "user_state", user_state
        connection.Send(user_state)
    
    flip_timer += dt_s
    if (flip_timer > 0.2):
        # Background
        client_display.fill( network_listener.background_color)
        
        # Small rectangle to illustrate the client color that will appear on the server screen.
        pygame.draw.rect(client_display, network_listener.client_color, pygame.Rect(50, 50, 60, 20), 3)
        
        # Small background rectangle for text
        pygame.draw.rect(client_display, THECOLORS["black"], pygame.Rect(150, 50, 35, 20))
        # Text to be displayed
        fps_string = "%.0f" % client_clock.get_fps()
        txt_surface = fnt.render(fps_string, True, THECOLORS["white"])
        client_display.blit(txt_surface, [158, 51])
    
        pygame.display.flip()
        flip_timer = 0.0