__author__ = 'Anselmo'

from PPlay.window import *
from PPlay.keyboard import *
from PPlay.gameimage import *
from PPlay.sprite import *

# Definir constantes com letra maiuscula
LARGURA_JANELA = 512
ALTURA_JANELA = 512
# Velocidade da nave
VEL  = 200
VEL_TIRO = 500

#Intervalo de tempo para controle dos tiros
INTERVALO_TIRO = 500

#Cria um objeto da classe Window com 800x600 pixels
# e guarda sua referencia em uma variavel janela
janela  = Window(LARGURA_JANELA,ALTURA_JANELA)
#Modifica a cor de fundo. (0,0,0) e uma tupla, um objeto multivalorado imutável
janela.set_background_color((0,0,0))
#Modifica o titulo da janela
janela.set_title("Galaga")

#Cria um objeto da classe Keyboard e guarda sua referencia na variavel teclado
teclado = Keyboard()

fundoEspaco = GameImage("starfield.jpg")

#Criar nave
spriteNave = Sprite("nave.png")
nave = dict(sprite = spriteNave , posX = LARGURA_JANELA/2-spriteNave.width/2,
            posY = ALTURA_JANELA-spriteNave.height )

#Lista de tiros
tiros = []
#Instante de tempo da última vez que um tiro foi dado
tempoUltimoTiro = janela.last_time

# Posição absolutas do bloco de inimigos
posxBlocoInimigos = 0
posyBlocoInimigos = 0
# Velocidade com o qual o bloco se move
VEL_BLOCO_X = 50
VEL_BLOCO_Y = 50

def criarInimigos(nomeArq, nLin, nCol):

    inimigos = []
    for i in range(0,nLin):
        linhaInimigos = []
        for j in range (0,nCol):
            inimigo = Sprite(nomeArq)
            # posx e posy sao campos injetados nos objetos
            # para armazenar suas posicoes relativas no bloco
            inimigo.posx = j*(inimigo.width+inimigo.width/2)
            inimigo.posy = i*inimigo.height
            linhaInimigos.append(inimigo)
        inimigos.append(linhaInimigos)

    return inimigos

def desenharInimigos(inimigos, posxBloco, posyBloco):
    for i in range (0,len(inimigos)):
        for j in range (0, len(inimigos[i])):
            x = inimigos[i][j].posx
            y = inimigos[i][j].posy
            # somar a posição do bloco a posição relativa de cada inimigo
            # para descobrir sua posição absoluta na tela
            inimigos[i][j].set_position(x+posxBloco,y+posyBloco)
            inimigos[i][j].draw()

def movimentarInimigos(inimigos, posxBloco,posyBloco, VEL_BLOCO_X:
    width = inimigos[0][0]

    if (posxBloco + width*len(inimigos[0])>=LARGURA_JANELA) or posxBloco<0:
        VEL_BLOCO_X *= -1

    deltaT = janela.delta_time():

    posxBloco += VEL_BLOCO_X*deltaT


    return posxBloco, posyBloco, VEL_BLOCO_X

def capturarEntrada(nave, tiros, tempoUltimoTiro):

    x = nave["posX"]
    y = nave["posY"]
    deltaT = janela.delta_time()
    deltaS = VEL*deltaT
    # O método keypressed retorna verdadeiro se a tecla passada como argumento for pressionada
    if teclado.key_pressed("ESC"):
        #Sai do programa
        janela.close()
    # Importante lembrar que no sistema de coordenadas da janela os valores de y crescem
    # para baixo
    if teclado.key_pressed("UP"):
        y = y - deltaS
    elif teclado.key_pressed("DOWN"):
        y = y + deltaS

    if teclado.key_pressed("RIGHT"):
        x = x + deltaS
    elif teclado.key_pressed("LEFT"):
        x = x - deltaS

    if (teclado.key_pressed("SPACE")):
        # verificar se decorreu uma quantidade de tempo necessaria desde que o ultimo tiro
        # foi dado
        if (janela.last_time-tempoUltimoTiro>INTERVALO_TIRO):
            tiro = Sprite("tiropeq.png")
            tiro.set_position(nave["sprite"].x+nave["sprite"].width/2-tiro.width/2, nave["sprite"].y-tiro.height)
            tiros.append(tiro)
            tempoUltimoTiro = janela.last_time

    nave["posX"] = x
    nave["posY"] = y

    #print(deltaT, deltaS)

    return tempoUltimoTiro


def limitarMovimento(largura,altura,nave):

    x = nave["posX"]
    y = nave["posY"]

    if (x<0):
        x = 0
    # Preciso subtrair o a largura da nave da largura da janela porque o par (x,y)
    # que descreve as coordenadas da nave esta no canto superior esquerdo do sprite
    # e nao no seu centro
    elif (x>=largura-nave["sprite"].width):
        x = largura-nave["sprite"].width

    if (y<int((2.0/3.0)*altura)):
        y = int((2.0/3.0)*altura)
    elif (y>altura-nave["sprite"].height):
        y = altura-nave["sprite"].height

    nave["posX"] = x
    nave["posY"] = y

def desenharTiros(tiros):
    for tiro in tiros:
        tiro.draw()

def movimentarTiros(tiros):
    deltaS = VEL_TIRO*janela.delta_time()
    for tiro in tiros:
        posx = tiro.x
        posy = tiro.y-deltaS
        tiro.set_position(posx,posy)

def removerTirosForaDaTela(tiros):
    for tiro in tiros:
        if (tiro.y<=0):
            tiros.remove(tiro)

def desenharTudo(janela,fundoEspaco,nave, tiros, inimigos, posxBlocoInimigos,posyBlocoInimigos):
    # Desenha o fundo da janela
    janela.set_background_color((0,0,0))

    #fundoEspaco.set_position(fundoEspacoPosX,fundoEspacoPosY)
    fundoEspaco.draw()
    desenharInimigos(inimigos,posxBlocoInimigos,posyBlocoInimigos)
    desenharTiros(tiros)

    #desenha a nave
    nave["sprite"].set_position(nave["posX"],nave["posY"])
    nave["sprite"].draw()

inimigos = criarInimigos("redfighter.png",3,4)


while (True):

     #entrada de dados (input)
     tempoUltimoTiro = capturarEntrada(nave,tiros,tempoUltimoTiro)
     limitarMovimento(janela.width,janela.height,nave)
     #desenha tudo (render)
     movimentarTiros(tiros)
     removerTirosForaDaTela(tiros)
     posxBlocoInimigos,posyBlocoInimigos = movimentarInimigos(posxBlocoInimigos,posyBlocoInimigos)

     desenharTudo(janela,fundoEspaco,nave, tiros, inimigos, posxBlocoInimigos,posyBlocoInimigos )
     #Atualiza o conteudo da janela
     janela.update()
