package cl.cromer.estructuras;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;

import java.net.URL;
import java.util.ResourceBundle;
import java.util.Scanner;

/**
 * Esta clase es para controlar todos la interfaz de Cola.
 *
 * @author Chris Cromer
 */
public class ColaController implements Initializable {
	/**
	 * La caja para ingresar textos.
	 */
	@FXML
	private TextFieldLimited valorCola;

	/**
	 * Donde poner el contenido de array.
	 */
	@FXML
	private VBox contenidoCola;

	/**
	 * Donde va el codigo a mostrar a la pantalla.
	 */
	@FXML
	private Text codigoCola;

	/**
	 * La escena donde está cosas graficas.
	 */
	private Scene scene;

	/**
	 * Donde está guardado los idiomas.
	 */
	private ResourceBundle resourceBundle;

	/**
	 * La cola usado en la aplicación.
	 */
	private Cola cola;

	/**
	 * Grafico rectangulos.
	 */
	private Grafico grafico;

	/**
	 * Inicializar todos los datos y dibujar las graficas.
	 *
	 * @param location URL: El URL de fxml en uso.
	 * @param resourceBundle ResourceBundle: Tiene datos de idioma.
	 */
	@Override
	public void initialize(URL location, ResourceBundle resourceBundle) {
		this.resourceBundle = resourceBundle;

		cola = new Cola();

		scene = null;
		Colores colores = new Colores();

		for (int i = 9; i >= 0; i--) {
			contenidoCola.getChildren().addAll(Grafico.crearCaja(colores, String.valueOf(i)));
			colores.siguinteColor();
		}
	}

	/**
	 * Llenar la cola con numeros al azar.
	 */
	@FXML
	protected void botonLlenar() {
		if (scene == null) {
			scene = contenidoCola.getScene();
			grafico = new Grafico(scene);
		}

		cola.llenar();
		generarGrafico();
	}

	/**
	 * Vaciar la cola de todos los valores.
	 */
	@FXML
	protected void botonVaciar() {
		if (scene == null) {
			scene = contenidoCola.getScene();
			grafico = new Grafico(scene);
		}

		cola = new Cola();
		generarGrafico();
	}

	/**
	 * Push un valor a la cola y mostrar el codigo en la pantalla.
	 */
	@FXML
	protected void botonPush() {
		if (scene == null) {
			scene = contenidoCola.getScene();
			grafico = new Grafico(scene);
		}

		// Mostrar el codigo
		String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/cola/push")).useDelimiter("\\Z").next();
		codigoCola.setText(codigoTexto);

		if (valorCola.getText() != null && ! valorCola.getText().trim().equals("")) {
			try {
				if (cola.size() < 10) {
					cola.push(Integer.valueOf(valorCola.getText()));
					valorCola.setText("");
					generarGrafico();
				}
				else {
					Main.mostrarError(resourceBundle.getString("colaLlena"), resourceBundle);
				}
			}
			catch (NumberFormatException exception) {
				// El error no es fatal, sigue
				Main.mostrarError(resourceBundle.getString("colaNoValor"), resourceBundle);
			}
		}
		else {
			Main.mostrarError(resourceBundle.getString("colaNoValor"), resourceBundle);
		}
	}

	/**
	 * Pop un valor de la pila si existe y mostrar el codigo en la pantalla.
	 */
	@FXML
	protected void botonPop() {
		if (scene == null) {
			scene = contenidoCola.getScene();
			grafico = new Grafico(scene);
		}

		// Mostrar el codigo
		String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/cola/pop")).useDelimiter("\\Z").next();
		codigoCola.setText(codigoTexto);

		if (cola.size() > 0) {
			if (! cola.pop()) {
				Main.mostrarError(resourceBundle.getString("colaVacia"), resourceBundle);
			}
			else {
				generarGrafico();
			}
		}
		else {
			Main.mostrarError(resourceBundle.getString("colaVacia"), resourceBundle);
		}
	}

	/**
	 * Peek a ver si existe un elemento en la pila y mostrar el codigo en la pantalla
	 * Si existe un valor destacarlo.
	 */
	@FXML
	protected void botonPeek() {
		if (scene == null) {
			scene = contenidoCola.getScene();
			grafico = new Grafico(scene);
		}

		// Mostrar el codigo
		String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/cola/peek")).useDelimiter("\\Z").next();
		codigoCola.setText(codigoTexto);

		int encontrado = cola.peek();
		if (encontrado != Integer.MIN_VALUE) {
			generarGrafico();
			grafico.destacar("#caja_" + 0, Grafico.RECTANGULO);
			grafico.destacar("#texto_" + 0, Grafico.TEXTO);
		}
		else {
			Main.mostrarError(resourceBundle.getString("colaVacia"), resourceBundle);
		}
	}

	/**
	 * Poner los valores en el grafico.
	 */
	private void generarGrafico() {
		grafico.removerDestacar();
		for (int i = 0; i < 10; i++) {
			Text text = (Text) scene.lookup("#texto_" + String.valueOf(i));
			text.setText(cola.getIndice(i));
		}
	}
}