import java.awt.*;
import java.io.*;

public class Info extends Frame
{ // Cria o frame com as informações
	public static Label Número, Jogadas, Tabuleiros, Tempo;
	public static List Lista;
	public static Panel Controles;
	public static EP_1 frame;
	public static int Passo, Passos;
	public static int[][] Retorno;
	public static Pinos[][] PinosTabuleiro;
	public static File Saída;
	Info(int NJogadas)
	{
		super("EP 1 - Monitor");
		Panel Informações = new Panel();
		Informações.setLayout(new GridLayout(0, 1));
		Informações.add(Número = new Label("Número de jogadas * " + String.valueOf(NJogadas) + ":"));
		Informações.add(Jogadas = new Label("Jogadas: "));
		Informações.add(Tabuleiros = new Label("Tabuleiros: "));
		Informações.add(Tempo = new Label("Tempo: "));
		Controles = new Panel();
		Controles.add(new Button("<<"));
		Controles.add(new Button("<"));
		Controles.add(new Button("Gravar"));
		Controles.add(new Button("Fechar"));
		Controles.add(new Button(">"));
		setLayout(new BorderLayout());
		add("North", Informações);
		add("Center", Lista = new List());
		add("South", Controles);
		pack();
		setResizable(false);
	}
// Realiza as movimentações
	private void Volta()
	{
		int X, Y,  Movimento;
		if (Passo < Passos)
		{
			X = Retorno[Passo][0];
			Y = Retorno[Passo][1];
			Movimento = Retorno[Passo][2];
			if (Movimento == 0) // Se foi para cima
			{
				PinosTabuleiro[X][Y].MudaStatus(0);
				PinosTabuleiro[X - 1][Y].MudaStatus(0);
				PinosTabuleiro[X - 2][Y].MudaStatus(1);
			}
			if (Movimento == 1) // Se foi para a direita
			{
				PinosTabuleiro[X][Y].MudaStatus(0);
				PinosTabuleiro[X][Y + 1].MudaStatus(0);
				PinosTabuleiro[X][Y + 2].MudaStatus(1);
			}
			if (Movimento == 2) // Se foi para baixo
			{
				PinosTabuleiro[X][Y].MudaStatus(0);
				PinosTabuleiro[X + 1][Y].MudaStatus(0);
				PinosTabuleiro[X + 2][Y].MudaStatus(1);
			}
			if (Movimento == 3) // Se foi para esquerda
			{
				PinosTabuleiro[X][Y].MudaStatus(0);
				PinosTabuleiro[X][Y - 1].MudaStatus(0);
				PinosTabuleiro[X][Y - 2].MudaStatus(1);
			}
		}

		Passo--;
		X = Retorno[Passo][0];
		Y = Retorno[Passo][1];
		Movimento = Retorno[Passo][2];
		if (Movimento == 0) // Se foi para cima
		{
			PinosTabuleiro[X][Y].MudaStatus(0);
			PinosTabuleiro[X - 1][Y].MudaStatus(0);
			PinosTabuleiro[X - 2][Y].MudaStatus(1);
		}
		if (Movimento == 1) // Se foi para a direita
		{
			PinosTabuleiro[X][Y].MudaStatus(0);
			PinosTabuleiro[X][Y + 1].MudaStatus(0);
			PinosTabuleiro[X][Y + 2].MudaStatus(1);
		}
		if (Movimento == 2) // Se foi para baixo
		{
			PinosTabuleiro[X][Y].MudaStatus(0);
			PinosTabuleiro[X + 1][Y].MudaStatus(0);
			PinosTabuleiro[X + 2][Y].MudaStatus(1);
		}
		if (Movimento == 3) // Se foi para esquerda
		{
			PinosTabuleiro[X][Y].MudaStatus(0);
			PinosTabuleiro[X][Y - 1].MudaStatus(0);
			PinosTabuleiro[X][Y - 2].MudaStatus(1);
		}
		Próxima();
	}
	private void Próximo()
	{
		int X = Retorno[Passo][0], Y = Retorno[Passo][1],  Movimento = Retorno[Passo][2];
		if (Movimento == 0) // Se é para cima
		{
			PinosTabuleiro[X][Y].MudaStatus(1);
			PinosTabuleiro[X - 1][Y].MudaStatus(1);
			PinosTabuleiro[X - 2][Y].MudaStatus(0);
		}
		if (Movimento == 1) // Se é para a direita
		{
			PinosTabuleiro[X][Y].MudaStatus(1);
			PinosTabuleiro[X][Y + 1].MudaStatus(1);
			PinosTabuleiro[X][Y + 2].MudaStatus(0);
		}
		if (Movimento == 2) // Se é para baixo
		{
			PinosTabuleiro[X][Y].MudaStatus(1);
			PinosTabuleiro[X + 1][Y].MudaStatus(1);
			PinosTabuleiro[X + 2][Y].MudaStatus(0);
		}
		if (Movimento == 3) // Se é para esquerda
		{
			PinosTabuleiro[X][Y].MudaStatus(1);
			PinosTabuleiro[X][Y - 1].MudaStatus(1);
			PinosTabuleiro[X][Y - 2].MudaStatus(0);
		}
		Passo++;
		if (Passo < Passos) Próxima();
	}

	public void Próxima()
	{ // Pinta a opção
		Lista.select(Passo);
		int X = Retorno[Passo][0], Y = Retorno[Passo][1],  Movimento = Retorno[Passo][2];
		if (Movimento == 0) // Se é para cima
		{
			PinosTabuleiro[X][Y].MudaStatus(3);
			PinosTabuleiro[X - 1][Y].MudaStatus(3);
			PinosTabuleiro[X - 2][Y].MudaStatus(4);
		}
		if (Movimento == 1) // Se é para a direita
		{
			PinosTabuleiro[X][Y].MudaStatus(3);
			PinosTabuleiro[X][Y + 1].MudaStatus(3);
			PinosTabuleiro[X][Y + 2].MudaStatus(4);
		}
		if (Movimento == 2) // Se é para baixo
		{
			PinosTabuleiro[X][Y].MudaStatus(3);
			PinosTabuleiro[X + 1][Y].MudaStatus(3);
			PinosTabuleiro[X + 2][Y].MudaStatus(4);
		}
		if (Movimento == 3) // Se é para esquerda
		{
			PinosTabuleiro[X][Y].MudaStatus(3);
			PinosTabuleiro[X][Y - 1].MudaStatus(3);
			PinosTabuleiro[X][Y - 2].MudaStatus(4);
		}
	}
	public boolean Gravar_Arq(File NomeArq)
	{ // Grava o arquivo
		if ((NomeArq.delete()) || !NomeArq.exists())
		{
			try
			{
				FileOutputStream Saída = new FileOutputStream(NomeArq);
				DataOutputStream arquivo = new DataOutputStream(Saída);
				int i;
				String Direção = new String();
				for (i = 0; i < Passos; i++)
				{
					switch (Retorno[i][2])
					{
					case 0: Direção = "Para Cima";
						break;
					case 1: Direção = "Para a Direita";
						break;
					case 2: Direção = "Para Baixo";
						break;
					case 3: Direção = "Para a Esquerda";
						break;
					}
					arquivo.writeBytes(String.valueOf(i + 1) + ") " + String.valueOf(Retorno[i][1] + "  ") + String.valueOf(Retorno[i][0]) + "  " + Direção); // Inverte as cordenadas
					arquivo.writeByte(10);
				}
				Saída.close();
			}
			catch (IOException e)
			{
				return false;
			}
			return true;
		}
		return false;
	}

	public boolean Mostra()
	{
		show();
		return true;
	}

    public boolean handleEvent(Event e)
	{ // Função para reconhecer o pedido de saída do usuário
		if (e.id == Event.WINDOW_DESTROY)
		{
			return action(e, "Fechar");
		}
		return super.handleEvent(e);
	}


	public boolean action(Event evt, Object arg)
	{ // Reconhece os pedidos do usuário
		if ("Fechar".equals(arg))
		{
			disable();
			frame.setCursor(Frame.DEFAULT_CURSOR);
			frame.enable();
			hide();
			frame.MostraTabuleiro();
			frame.show();
			frame = null;
			return true;
		}
		else if ("<<".equals(arg))
		{
			frame.MostraTabuleiro();
			Passo = 0;
			Próxima();
			return true;
		}
		else if ("<".equals(arg))
		{
			if (Passo == 0) return true;
			Volta();
			return true;
		}
		else if (">".equals(arg))
		{
			if (Passo == Passos) return true;
			Próximo();
			return true;
		}
		else if ("Gravar".equals(arg))
		{
			Arquivos.MostraMensagem(this, "Gravar", "Digite o nome do Arquivo:");
			if (!Arquivos.Continuar) return true; // Se cancelou:
			Saída = new File(Arquivos.Nome_Arq.getText());
			if (Gravar_Arq(Saída))
			{
				show();
			}
			else
			{
				Mensagem.MostraMensagem(this, "Erro", "Não foi possível gravar o arquivo especificado");
			}
			return true;
		}
		return false;
	}
}