/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Game;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.Random;
import javaPlay.GameStateController;

/**
 *
 * @author Jose Ricardo
 */
public class GamePlayState implements GameStateController{

    // Tela de fundo com efeito de scroll
    private Background tela_fundo;

    // Variavel que armazena o tempo decorrido em segundos
    private float tempo_decorrido = 0;

    // Gerador de números aleatórios para geração da posicao dos inimigos
    private Random random = new Random();

    // Pontuacao
    private static int score = 0;

    // Total de inimigos na tela
    private static int num_inimigos = 0;

    public static int getNum_inimigos() {
        return num_inimigos;
    }

    public static void setNum_inimigos(int num_inimigos) {
        GamePlayState.num_inimigos = num_inimigos;
    }

    public static int getScore() {
        return score;
    }

    public static void setScore(int score) {
        GamePlayState.score = score;
    }
    
    public void load() {
    }

    public void unload() {

    }

    public void start() {
        tela_fundo = new Background();
        tela_fundo.setBackground(Globals.BACKGROUND_IMAGE);
        tela_fundo.setVelocidade_Vertical(1);

        Player player = new Player();
        player.setSprite(Globals.PLAYER_IMAGE, Globals.PLAYER_SPRITE_WIDTH,
                Globals.PLAYSER_SPRITE_HEIGHT);

        Scene.getInstance().addGameObject(player);
        // Centralizar jogador nave na tela
        player.x = (Globals.VIEWPORT_WIDTH / 2) - (Globals.PLAYER_SPRITE_WIDTH / 2);
        player.y = Globals.VIEWPORT_HEIGHT - Globals.PLAYER_SPRITE_WIDTH;

        // resetar numero de inimigos
        num_inimigos = 0;

        // resetar pontos
        score = 0;
    }

    public void step(long timeElapsed) {
        // Aqui estou garantindo a frequencia constante de atualizacoes
        tempo_decorrido += (float)timeElapsed / 1000.0f;

        if (tempo_decorrido > Globals.TIME_PER_FRAME){
            // Atualizar animação da tela de fundo
            tela_fundo.update();

            // Atualizar game objects
            Scene.getInstance().step(timeElapsed);

            // Atualizar geração de inimigos
            EnemyFactoryUpdate();

            // Atualizar tempo decorrido garantindo o número de frames requisitado
            tempo_decorrido -= Globals.TIME_PER_FRAME;
        }
    }

    public void draw(Graphics g) {
        g.clearRect(0, 0, Globals.VIEWPORT_WIDTH, Globals.VIEWPORT_HEIGHT);
        tela_fundo.draw(g);
        Scene.getInstance().draw(g);

        // Desenhar o score
        g.setColor(Color.red);
        g.setFont(new Font("Arial", Font.BOLD, 18));
        g.drawString("Pontuação: " + String.valueOf(score), 20, 50);
    }

    public void stop() {
        Scene.getInstance().clear();
    }

    private void EnemyFactoryUpdate() {
        if (num_inimigos < Globals.TOTAL_ENEMIES){
            int x = random.nextInt(Globals.VIEWPORT_WIDTH -
                    Globals.ORIENTED_ENEMY_SPRITE_WIDTH);
            int y = random.nextInt(Globals.VIEWPORT_HEIGHT);

            OrientedKamikaze enemy = new OrientedKamikaze();
            enemy.setSprite(Globals.ORIENTED_ENEMY_IMAGE,
                    Globals.ORIENTED_ENEMY_SPRITE_WIDTH,
                    Globals.ORIENTED_ENEMY_SPRITE_HEIGHT);
            enemy.x = x;
            enemy.y = -y;
            Scene.getInstance().addGameObject(enemy);

            num_inimigos++;
        }

        

    }

}
