package ip.exemplos.aula17;
import ip.exemplos.aula15.MinhaJanelaErroComLigacaoComJanelaAnterior;
import br.ufpe.cin.miniJava.exception.InvalidConversionException;
import br.ufpe.cin.miniJava.gui.Button;
import br.ufpe.cin.miniJava.gui.Component;
import br.ufpe.cin.miniJava.gui.Label;
import br.ufpe.cin.miniJava.gui.TextField;
import br.ufpe.cin.miniJava.gui.Window;
import br.ufpe.cin.miniJava.util.MiniJavaSystem;

public class MinhaJanelaComLaco extends Window {
	Button botaoSomatorio;
	Button botaoFatorial;
	Button botaoSaida;
	TextField campoEntrada;
	TextField campoResultado;
	MinhaJanelaErroComLigacaoComJanelaAnterior janelaErro;
	
	MinhaJanelaComLaco() {
		Label rotuloEntrada;
		Label rotuloResultado;
		
		botaoSomatorio = this.criarBotao("Somatorio", 250, 65);
		botaoFatorial = this.criarBotao("Fatorial",250 , 135);
		botaoSaida = this.criarBotao("Sair", 250, 205);	
		campoEntrada = this.criarCampo(100,60);		
		campoResultado = this.criarCampo(100, 90);
		
		rotuloEntrada = new Label("Entrada");
		rotuloResultado = new Label("Resultado");			
		this.include(rotuloEntrada,40,60);
		this.include(rotuloResultado,40,90);
				
		this.setTitle("Minha Janela");	
		this.setSize(500,400);
		
		janelaErro = new MinhaJanelaErroComLigacaoComJanelaAnterior(this);
		janelaErro.exitOnClose(false);
		this.exitOnClose(true);
	}

	private TextField criarCampo(int x, int y) {
		TextField campo = new TextField();
		this.include(campo,x,y);
		return campo;
	}

	private Button criarBotao(String texto, int x, int y) {
		Button botao = new Button();
		botao.setText(texto);
		this.include(botao,x,y);
		return botao;
	}
	
	public void clickEvent(Component c) {
		if (c == botaoSomatorio) { 
			acaoBotaoSomatorio();		
		} else { 
			if (c == botaoSaida) { 
				fecharPrograma();
			} else if ( c == botaoFatorial ){
				acaoBotaoFatorial();
			}
		}
	}
	
	
	private void acaoBotaoSomatorio() {
		try {
			int entrada;
			entrada = campoEntrada.getIntExc();
			long resultado;
			resultado = this.somatorio(entrada);			
			campoResultado.setText(resultado+"");	
		} catch (InvalidConversionException e) {
			campoResultado.setText("");
			this.setVisible(false);
			janelaErro.setVisible(true);
		} 
		campoEntrada.setText("");
	}
	
	
	private void acaoBotaoFatorial() {
		try {
			int entrada;
			entrada = campoEntrada.getIntExc();
			long resultado;
			resultado = this.fatorialComLoop(entrada);			
			campoResultado.setText(resultado+"");	
		} catch (InvalidConversionException e) {
			campoResultado.setText("");
			this.setVisible(false);
			janelaErro.setVisible(true);
		} 
		campoEntrada.setText("");
	}
	
//	 Nos vários métodos abaixo, deveria-se verificar
//	 se n>=0 pois todos os conceitos associados só
//	 são definido para os naturais, não os inteiros.	
			
		int somatorio(int n) {	
			int somatorio;
			somatorio = 0;
			for (int i = 0; i <= n; i = i + 1) {
				somatorio = somatorio + i;
			}
			return somatorio;
		}
		int somatorioComWhile(int n) {	
			int somatorio;
			somatorio = 0;
			int i = 0;
			while(i <= n) {
				somatorio = somatorio + i;
				i++;
			}
			return somatorio;
		}
		int somatorioComDoWhile(int n) {
			int somatorio;
			somatorio = 0;
			int i = 0;
			do {
				somatorio = somatorio + i;
				i++;
			}while(i <= n);
				
			return somatorio;
		}
		
		int somaParesMaisEficiente(int n) {
			int somaPares;
			somaPares = 0;
			for (int i = 0; i <= n; i = i + 2) {
				somaPares = somaPares + i;
			}
			return somaPares;
		}
		
		int somaParesMaisClaro(int n) {
			int somaPares;
			somaPares = 0;
			for (int i = 0; i <= n; i = i + 1) {
				if (i % 2 == 0) somaPares = somaPares + i;
			}
			return somaPares;
		}
		
		int somaParesNaoClaroNaoEficiente(int n) {
			int somaPares;
			somaPares = 0;
			for (int i = 0; i <= n/2; i = i + 1) {
				somaPares = somaPares + (i*2);
			}
			return somaPares;
		}
		
		int somaImpares(int n) {
			int somaImpares;
			somaImpares = 0;
			for (int i = 1; i <= n; i = i + 2) {
				somaImpares = somaImpares + i;
			}
			return somaImpares;
		}
		
//		 Só funciona para os naturais, teria que ser
//		 adaptado para funcionar bem para os inteiros
			
			int multiplicar(int x, int y) {
				int res;
				res = 0;
				for(int i=0;i < x; i = i + 1){
					res = res + y;
				}
				return res;
			}
			int multiplicarComWhile(int x, int y) {
				int res = 0, i = 0;
				while(i < x) {
					res = res + y;
					i++;
				}
				return res;
			}
			
			int fatorialComLoop(int n){
				int resultado;
				resultado = 1;
				for (int i = 1; i <= n; i = i + 1) {  
					resultado = resultado * i;
				}
				return resultado;
			}
			int fatorialComLoopDoWhileDecrementando(int n){
				int i = n;
				int resultado = 1;
				do {
					resultado = resultado * i;
					i--;
				} while (i > 0);
				return resultado;
			}
			
			
			int fatorialComLoopMaisIntuitivo(int n){
				int resultado;
				resultado = 1;
				for (int i = n; i >= 1; i = i - 1) {  
					resultado = resultado * i;
				}
				return resultado;
			}

	private void fecharPrograma() {
		MiniJavaSystem system;
		system = new MiniJavaSystem();
		system.close();
	}
}