#!/usr/bin/env python3

# Filename: A10_2D_baseline_client.py

import sys, os, time
import pygame

# PyGame Constants
from pygame.locals import (
    K_ESCAPE,
    K_c, K_1, K_2, K_3,
    K_a, K_s, K_d, K_w,
    K_j, K_k, K_l, K_i, K_SPACE,
    K_LSHIFT, K_t
)
from pygame.color import THECOLORS

# Argument parsing...
import argparse

from A08_network import GameClient, RunningAvg, setClientColors

#=======================================================================
# Functions       
#=======================================================================

def signoff(client_state):
    sys.exit()
    
def checkforUserInput(client_state):
    
    # Get all the events since the last call to get().
    for event in pygame.event.get():
        if (event.type == pygame.QUIT): 
            signoff(client_state)
        elif (event.type == pygame.KEYDOWN):
            if (event.key == K_ESCAPE):
                signoff(client_state)
            
            elif (event.key==K_c):
                mydisplay.fill(THECOLORS["yellow"])  
            
            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):
                client_state['a'] = 'D'
            elif (event.key==K_s):
                client_state['s'] = 'D'
            elif (event.key==K_d):
                client_state['d'] = 'D'
            elif (event.key==K_w):
                client_state['w'] = 'D'
                
            elif (event.key==K_j):
                client_state['j'] = 'D'
            elif (event.key==K_k):
                client_state['k'] = 'D'
            elif (event.key==K_l):
                client_state['l'] = 'D'
            elif (event.key==K_i):
                client_state['i'] = 'D'
            elif (event.key==K_SPACE):
                client_state[' '] = 'D'
                
            elif (event.key==K_LSHIFT):
                client_state['ls'] = 'D'
            elif (event.key==K_t):
                client_state['t'] = 'D'
            
        elif (event.type == pygame.KEYUP):
            if (event.key==K_a):
                client_state['a'] = 'U'
            elif (event.key==K_s):
                client_state['s'] = 'U'
            elif (event.key==K_d):
                client_state['d'] = 'U'
            elif (event.key==K_w):
                client_state['w'] = 'U'
                
            elif (event.key==K_j):
                client_state['j'] = 'U'
            elif (event.key==K_k):
                client_state['k'] = 'U'
            elif (event.key==K_l):
                client_state['l'] = 'U'
            elif (event.key==K_i):
                client_state['i'] = 'U'
            elif (event.key==K_SPACE):
                client_state[' '] = 'U'
                
            elif (event.key==K_LSHIFT):
                client_state['ls'] = 'U'
            elif (event.key==K_t):
                client_state['t'] = 'U'
        
        elif event.type == pygame.MOUSEBUTTONDOWN:
            client_state['mBd'] = True
            
            # Check the button status.
            (button1, button2, button3) = pygame.mouse.get_pressed()
            if button1:
                client_state['mB'] = 1
            elif button2:
                client_state['mB'] = 2
            elif button3:
                client_state['mB'] = 3
            else:
                client_state['mB'] = 0
                
        elif event.type == pygame.MOUSEBUTTONUP:
            client_state['mBd'] = False
            client_state['mB'] = 0

    # cursor x,y
    client_state['mXY'] = pygame.mouse.get_pos()

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

def main():
    global mydisplay

    # Parse parameters provided in the command line.
    # This description string (and parameter help) gets displayed if help is requested (-h added after the filename).
    parser = argparse.ArgumentParser(description='Please add optional client parameters after the file name. For example: \n' + 
                                                 'A10_2D_baseline_client.py 111.222.22.22')
    # A required positional argument.
    parser.add_argument('serverIP', type=str, help='Use the IP address that is reported by the server when it starts.')
                                    
    args = parser.parse_args()
    print("Server IP Address:", args.serverIP)

    pygame.init()

    mydisplay = pygame.display.set_mode((800, 700))
    client_colors = setClientColors()

    # Clock to control the framerate.
    myclock = pygame.time.Clock()

    client_ID = 0

    client = GameClient( host=args.serverIP, port=5000)
    client.connect()
    
    if client.running and client.client_name is not None:
        pygame.display.set_caption( "Client: " + client.client_name)

    # Initialize client state dictionary.
    client_state = {'ID': client.id,
                    'mXY':(0,0), 'mBd':False, 'mB':1,
                    'a':'U', 's':'U', 'd':'U', 'w':'U', 
                    'j':'U', 'k':'U', 'l':'U', 'i':'U', ' ':'U',
                    'm':'U',
                    'f':'U',
                    't':'U', 'ls':'U'}
        
    framerate_limit = 120
    fr_avg = RunningAvg(100, pygame, colorScheme='light')
    
    flip_timer = 0.0

    while True:
        dt_s = myclock.tick(framerate_limit) * 1e-3
        
        checkforUserInput( client_state)
        
        client.send_state( client_state)
                
        flip_timer += dt_s
        
        fr_avg.update( myclock.get_fps())
        
        if (flip_timer > 0.2):
            # Background
            mydisplay.fill( THECOLORS["black"])
            
            fr_avg.draw( mydisplay, 150, 50)
                        
            if client.running and client.client_name is not None:
                # Small rectangle to illustrate the client color that will be used for the cursor on the server screen.
                pygame.draw.rect( mydisplay, client_colors[ client.client_name], pygame.Rect(50, 50, 60, 20), 5)
            
            pygame.display.flip()
            flip_timer = 0.0
        
#============================================================
# Run the main program.    
#============================================================
        
main()