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

from math import exp, sqrt
from random import choice,shuffle,uniform,randint
from configuraciones import *

def mover(posicion, direccion,speed_factor = ELEMENTS_SPEED_FACTOR):
	x,y = posicion
	if direccion == 'S':
		y += speed_factor
	elif direccion == 'N':
		y -= speed_factor
	elif direccion == 'E':
		x += speed_factor
	elif direccion == 'O':
		x -= speed_factor
	posicion = (x,y)
	return posicion

def distancia_entre_centros(coordenada1,coordenada2):
	x1,y1 = coordenada1
	x2,y2 = coordenada2
	return sqrt((x2-x1)**2 + (y2-y1)**2)

def hay_tecla_movimiento_presionada(presionadas,teclas):
	for tecla in teclas:
		if bool(presionadas[tecla]):
			return True
	return False

def dibujar_pinguino(frozzi_center, radio_frozzi, imagen, superficie):
	posicion = (frozzi_center[0]-radio_frozzi+1,frozzi_center[1]-radio_frozzi+1)
	superficie.blit(imagen,posicion)
	return
	
def dibujar_proyectiles(proyectiles_elementos,radius,imagenes, superficie):
	for elemento in proyectiles_elementos:
		if elemento == "bolas_fuego":
			im = elemento+str(randint(1,4))
		else:
			im = elemento
		for coordenada in proyectiles_elementos[elemento]:
			posicion = (coordenada[0]-radius[elemento]+1,coordenada[1]-radius[elemento]+1)
			superficie.blit(imagenes[im], posicion)
	return

def dibujar_explosiones(proyectiles_removidos,radio,imagenes,superficie,explosionObj,fishObj):
	for tipo,proyectiles in proyectiles_removidos.items():
		for coordenada in proyectiles:
			posicion = (coordenada[0]-radio+1,coordenada[1]-radio+1)
			if tipo == "peces":
				fishObj.stop()
				fishObj.play()
				superficie.blit(imagenes["luz"],posicion)
			else:
				explosionObj.stop()
				explosionObj.play()
				superficie.blit(imagenes["explosion"],posicion)
				
	return
	
def dificultad_temporal(time):
	time = time/(60*1000.) #tiempo en minutos
	return (1-exp(-DIFFICULTY_FACTOR*DIFFICULTY_LEVEL*time))

def caera_elemento(time):
	return uniform(0,1)<dificultad_temporal(time)

def actualizar_dificultad(time,speed_factor):
	dificultad = INITIAL_FACTOR+DIFFICULTY_LEVEL*dificultad_temporal(time)
	speed_factor["bolas_fuego"] = int(round(SPEED_FACTOR["bolas_fuego"]*dificultad))
	speed_factor["peces"] = int(round(SPEED_FACTOR["peces"]*dificultad))
	return

def crear_elemento(proyectiles_elementos,elementos):
	posibles = int(round(PROB_BOLA_FUEGO*100))*["bolas_fuego"]+int(round(PROB_PEZ*100))*["peces"]+int(round(PROB_NADA*100))*[None]
	shuffle(posibles)
	tipo = choice(posibles)
	if tipo != None:
		coordenada = (choice(range(44,675,45)),0)	
		proyectil = coordenada
		proyectiles_elementos[tipo].add(proyectil)
	return

def calcular_puntaje(peces,bolas_fuego,time):
	dificultad = INITIAL_FACTOR+DIFFICULTY_LEVEL*dificultad_temporal(time)
	return bolas_fuego*5+peces*10+int(round(dificultad*time/1000.))

def mostrar_informacion(surface,scoreObj,frozzi,time):
	x,y = SCORE_POSITION
	seconds_time = time/1000
	minutos, segundos = seconds_time/60,seconds_time%60
	municion,peces,vidas,bolas_fuego = frozzi["municion"],frozzi["peces"],frozzi["vidas"],frozzi["bolas_fuego"]
	puntaje = calcular_puntaje(peces,bolas_fuego,time)
	scoreTextSurfaceObj = scoreObj.render("Tiempo: {0}:{1}".format(minutos,"0"*(2-len(str(segundos)))+str(segundos)),True,SCORE_COLOR)
	surface.blit(scoreTextSurfaceObj,(x,y))
	scoreTextSurfaceObj = scoreObj.render("Municion: {0}".format(municion),True,SCORE_COLOR)
	surface.blit(scoreTextSurfaceObj,(x,y+SCORE_FONT_SIZE))
	scoreTextSurfaceObj = scoreObj.render("Peces: {0}".format(peces),True,SCORE_COLOR)
	surface.blit(scoreTextSurfaceObj,(x,y+2*SCORE_FONT_SIZE))
	scoreTextSurfaceObj = scoreObj.render("Vida: {0}".format(vidas), True, SCORE_COLOR)
	surface.blit(scoreTextSurfaceObj,(x,y+3*SCORE_FONT_SIZE))
	scoreTextSurfaceObj = scoreObj.render("Bolas de Fuego: {0}".format(bolas_fuego), True, SCORE_COLOR)
	surface.blit(scoreTextSurfaceObj,(x,y+4*SCORE_FONT_SIZE))
	scoreTextSurfaceObj = scoreObj.render("Puntaje Total: {0}".format(puntaje), True, SCORE_COLOR)
	surface.blit(scoreTextSurfaceObj,(x,y+5*SCORE_FONT_SIZE))
	return puntaje

def game_over(surface,gameOverObj):
	gameOverTextSurfaceObj = gameOverObj.render("GAME OVER!",True,GAME_OVER_COLOR)
	surface.blit(gameOverTextSurfaceObj,(WINDOW_WIDTH,WINDOW_HEIGHT))
	return
	
def actualizar_jugador(frozzi,extra_municion_factor,extra_vidas_factor):
	if frozzi["peces"]/extra_municion_factor:
		frozzi["municion"]+= MUNICION_EXTRA
		extra_municion_factor += EXTRA_MUNICION_FACTOR
	if frozzi["bolas_fuego"]/extra_vidas_factor:
		frozzi["vidas"] += VIDAS_EXTRA
		extra_vidas_factor += EXTRA_VIDAS_FACTOR
	return extra_municion_factor,extra_vidas_factor

