import javax.microedition.lcdui.*;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;


public class DTTCanvas extends Canvas implements CommandListener {
	Pantalla pantalla;
	Figura figura;
	private Command exitCommand;
	private Command opc1_1, opc1_2, opc2_1, opc2_3, opc3_1, opc3_2;
	private Alert alerta1, alerta2, alerta3, alerta4;
	private Form formulario, formulario1;
	private TextField campoTexto, campoTexto1, campoTexto2, campoTexto3;
	private static RecordStore rs;
	private StringItem string;
	private int anchoCelda = -1;
	private int anchoCeldaX = getWidth() / 8;
	private int anchoCeldaY = getHeight() / 9;

	public DTTCanvas(Pantalla t) {
		try {
			setCommandListener(this);
			// exitCommand = new Command("Salid", Command.EXIT, 1);
			// this.addCommand(exitCommand);
						
			opc1_1 = new Command("Agregar/Cambiar clase", Command.SCREEN, 1);
			opc1_2 = new Command("Borrar todo", Command.SCREEN, 1);

			opc2_1 = new Command("Ver detalle", Command.SCREEN, 1);
			opc2_3 = new Command("Eliminar clase", Command.SCREEN, 1);

			opc3_1 = new Command("Guardar", Command.SCREEN, 1);
			opc3_2 = new Command("Volver", Command.SCREEN, 1);

			this.addCommand(opc1_1);
			this.addCommand(opc2_1);
			this.addCommand(opc2_3);
			this.addCommand(opc1_2);

			alerta1 = new Alert("Registros borrados",
					"  Se han borrado todos los registros del horario", null,
					AlertType.INFO);
			alerta2 = new Alert("Clase eliminada",
					"  La clase seleccionada ha sido eliminada", null,
					AlertType.INFO);
			alerta3 = new Alert("Clase guardada",
					"  La clase ha sido guardada satisfactoriamente.", null,
					AlertType.INFO);
			alerta4 = new Alert("Cargando...",
					"   Espere un momento por favor", null, AlertType.INFO);
			alerta1.setTimeout(3000);
			alerta2.setTimeout(3000);
			alerta3.setTimeout(3000);
			alerta3.setTimeout(1000);

			pantalla = t;
			inicioRecordStore();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void paint(Graphics g) {
		Font fuente = Font.getFont(Font.FONT_STATIC_TEXT, Font.STYLE_PLAIN,
				Font.SIZE_SMALL);
		g.setFont(fuente);
		if (anchoCelda == -1) {
			anchoCelda = Math.min(getWidth()
					/ pantalla.getRejilla().getAnchura(), (getHeight())
					/ pantalla.getRejilla().getAltura());
		}
		g.setColor(0xFFFFFF);
		g.fillRect(0, 0, getWidth(), getHeight());
		g.setColor(0x0);
		dibujaRejilla(g);
		dibujaFigura(pantalla.getFigura(), g);
		g.drawString("    DTT", 3 * getWidth() / 8, 0, Graphics.TOP
				| Graphics.LEFT);
		g.drawString("  L", 1 * getWidth() / 8, 2 * getWidth() / 27,
				Graphics.TOP | Graphics.LEFT);
		g.drawString("  M", 2 * getWidth() / 8, 2 * getWidth() / 27,
				Graphics.TOP | Graphics.LEFT);
		g.drawString("  M", 3 * getWidth() / 8, 2 * getWidth() / 27,
				Graphics.TOP | Graphics.LEFT);
		g.drawString("  J", 4 * getWidth() / 8, 2 * getWidth() / 27,
				Graphics.TOP | Graphics.LEFT);
		g.drawString("  V", 5 * getWidth() / 8, 2 * getWidth() / 27,
				Graphics.TOP | Graphics.LEFT);
		g.drawString("  S", 6 * getWidth() / 8, 2 * getWidth() / 27,
				Graphics.TOP | Graphics.LEFT);
		g.drawString("  1-2", 0, getHeight() / 9, Graphics.TOP | Graphics.LEFT);
		g.drawString("  3-4", 0, 2 * getHeight() / 9, Graphics.TOP
				| Graphics.LEFT);
		g.drawString("  5-6", 0, 3 * getHeight() / 9, Graphics.TOP
				| Graphics.LEFT);
		g.drawString("  7-8", 0, 4 * getHeight() / 9, Graphics.TOP
				| Graphics.LEFT);
		g.drawString(" 9-10", 0, 5 * getHeight() / 9, Graphics.TOP
				| Graphics.LEFT);
		g.drawString("11-12", 0, 6 * getHeight() / 9, Graphics.TOP
				| Graphics.LEFT);
		g.drawString("13-14", 0, 7 * getHeight() / 9, Graphics.TOP
				| Graphics.LEFT);
	}

	protected void keyPressed(int keyCode) {
		if (keyCode == getKeyCode(LEFT)) {
			if (!pantalla.getRejilla().seChoca(pantalla.getFigura(),
					Figura.IZQUIERDA)) {
				pantalla.getFigura().mueve(Figura.IZQUIERDA);
				if (pantalla.getCanvas() != null)
					pantalla.getCanvas().repaint();
			}
		} else if (keyCode == getKeyCode(RIGHT)) {
			if (!pantalla.getRejilla().seChoca(pantalla.getFigura(),
					Figura.DERECHA)) {
				pantalla.getFigura().mueve(Figura.DERECHA);
				// if(pantalla.getRejilla().)
				if (pantalla.getCanvas() != null)
					pantalla.getCanvas().repaint();
			}
		} else if (keyCode == getKeyCode(UP)) {
			if (!pantalla.getRejilla().seChoca(pantalla.getFigura(),
					Figura.ARRIBA)) {
				pantalla.getFigura().mueve(Figura.ARRIBA);
				if (pantalla.getCanvas() != null)
					pantalla.getCanvas().repaint();
			}
		} else if (keyCode == getKeyCode(DOWN)) {
			if (!pantalla.getRejilla().seChoca(pantalla.getFigura(),
					Figura.ABAJO)) {
				pantalla.getFigura().mueve(Figura.ABAJO);
				if (pantalla.getCanvas() != null)
					pantalla.getCanvas().repaint();
			}
		}
	}

	protected void pointerPressed(int x, int y) {
	}

	protected void pointerReleased(int x, int y) {
	}

	public void commandAction(Command c, Displayable d) {
		if (c == exitCommand) {
			destroyApp(false);
			// notifyDestroyed();
		} else if (c == opc1_1) { 	// Agregar clase LISTO!!

			formulario = new Form("Ingresar Clase");

			campoTexto = new TextField("Sala:     ", "", 30, 0);
			campoTexto1 = new TextField("Ramo:     ", "", 30, 0);
			campoTexto2 = new TextField("Sigla:    ", "", 30, 0);
			campoTexto3 = new TextField("Profesor: ", "", 30, 0);

			formulario.append(campoTexto);
			formulario.append(campoTexto1);
			formulario.append(campoTexto2);
			formulario.append(campoTexto3);

			formulario.addCommand(opc3_1);
			formulario.addCommand(opc3_2);
			formulario.setCommandListener(this);

			Pantalla.screen.setCurrent(formulario);
		}

		else if (c == opc1_2) { 	// Borrar todo LISTO!!

			for (int j = 1; j < 8; j++) {
				for (int k = 1; k < 7; k++) {
					destruirRecordStore(k-1 + "_" + j);
					Rejilla.celdas[k][j] = 0;
				}
			}
			Pantalla.screen.setCurrent(alerta1, this);

		} else if (c == opc2_1) { 	// Ver detalle LISTO!!! 
			String a = Pantalla.figura.getXOrigen() + "_" + Pantalla.figura.getYOrigen();
			abrirRecordStore(a);
			leerRegistros();
			cerrarRecordStore();

		}


		else if (c == opc2_3) { 	// Eliminar clase LISTO!!!
			
			String a = Pantalla.figura.getXOrigen() + "_" + Pantalla.figura.getYOrigen();
			destruirRecordStore(a);
			Rejilla.celdas[Pantalla.figura.getXOrigen() + 1][Pantalla.figura.getYOrigen()] = 0;
			Pantalla.screen.setCurrent(alerta2, this);
		}

		else if (c == opc3_1) { // Guardar LISTO!!!
			
			String a = Pantalla.figura.getXOrigen() + "";
			String b = Pantalla.figura.getYOrigen() + "";
			
			destruirRecordStore(a + "_" + b);
			abrirRecordStore(a + "_" + b);
			escribirDatos(a, b, campoTexto.getString(),	campoTexto1.getString(), campoTexto2.getString(), campoTexto3.getString());
			cerrarRecordStore();
			Pantalla.screen.setCurrent(alerta3, this);
		}

		else if (c == opc3_2) {
			System.out.println("Entra a la funcion de alerta4");
			Pantalla.screen.setCurrent(alerta4, this);

		}
	}

	public static void abrirRecordStore(String bloque) {
		try {
			rs = RecordStore.openRecordStore(bloque, true);
		} catch (RecordStoreException e) {
			System.out.println("Error al abrir el Record Store");
		}
	}

	public void inicioRecordStore() {
		for (int j = 2; j < 4; j++) {
			for (int k = 2; k < 4; k++) {
				try {
					rs = RecordStore.openRecordStore(j + "_" + k, true);
					System.out.println("Pintar");
					leerInicializacion();

				} catch (RecordStoreException e) {
					System.out.println("Error al abrir el Record Store");
				}
			}
		}
	}

	public void escribirDatos(String x, String y, String sala, String ramo,
			String sigla, String profe) {
		Rejilla.celdas[Pantalla.figura.getXOrigen() + 1][Pantalla.figura
				.getYOrigen()] = 3; // pinta el cuadrado de ocupado
		System.out.println(Pantalla.figura.getXOrigen() + ","
				+ Pantalla.figura.getYOrigen() + " - Escrita");
		escribirRegistro(x); // dia
		escribirRegistro(y); // bloque
		escribirRegistro(sala);
		escribirRegistro(ramo);
		escribirRegistro(sigla);
		escribirRegistro(profe);
	}

	public void escribirRegistro(String entrada) {
		byte[] registro;
		registro = entrada.getBytes();
		try {
			rs.addRecord(registro, 0, registro.length);
		} catch (RecordStoreException e) {
			System.out.println("Error al insertar registro");
		}
	}

	public void leerRegistros() {
		byte[] registro = new byte[75];
		int longitud;

		String sala = new String();
		String ramo = new String();
		String sigla = new String();
		String profe = new String();
		String dia = new String();
		String bloque = new String();

		try {
			for (int i = 1; i <= rs.getNumRecords(); i++) {
				longitud = rs.getRecordSize(i);
				registro = rs.getRecord(i);
				String campo = new String(registro, 0, longitud);
				System.out.println("Registro " + i + ": " + campo);

				switch (i) {
				case 1: {
					if (campo.equals("0")) {
						dia = "Lunes";
					} else if (campo.equals("1")) {
						dia = "Martes";
					} else if (campo.equals("2")) {
						dia = "Miercoles";
					} else if (campo.equals("3")) {
						dia = "Jueves";
					} else if (campo.equals("4")) {
						dia = "Viernes";
					} else if (campo.equals("5")) {
						dia = "Sabado";
					} else
						dia = "Error indicador dia";
					break;
				}
				case 2: {
					if (campo.equals("1")) {
						bloque = " 1-2 \n     8:00-9:30 hrs.";
					} else if (campo.equals("2")) {
						bloque = " 3-4 \n    10:00-11:30 hrs.";
					} else if (campo.equals("3")) {
						bloque = " 5-6 \n    12:00-13:30 hrs.";
					} else if (campo.equals("4")) {
						bloque = " 7-8 \n    14:00-15:30 hrs.";
					} else if (campo.equals("5")) {
						bloque = " 9-10 \n    15:40-17:10 hrs.";
					} else if (campo.equals("6")) {
						bloque = " 11-12 \n    17:20-18:50 hrs.";
					} else if (campo.equals("7")) {
						bloque = " 13-14 \n    19:00-20:30 hrs.";
					} else
						bloque = "  bloque" + campo;
					break;
				}
				case 3: {
					sala = campo;
					break;
				}
				case 4: {
					ramo = campo;
					break;
				}
				case 5: {
					sigla = campo;
					break;
				}
				case 6: {
					profe = campo;
					break;
				}
				}
			}

			string = new StringItem("\n     Detalle", "\n\n     " + dia
					+ bloque + "\n     " + sala + "\n\n     " + ramo
					+ "\n     " + sigla + "\n     " + "Profesor: " + profe);
			formulario1 = new Form("");
			formulario1.append(string);
			formulario1.addCommand(opc3_2);
			formulario1.setCommandListener(this);

			Pantalla.screen.setCurrent(formulario1);

		} catch (RecordStoreException e) {
			System.out.println("Error al leer los registros");
		}
		registro = null;
	}

			
	public static void leerInicializacion() {
		for (int j = 1; j < 8; j++) {
			for (int k = 0; k < 6; k++) {
				String a = k + "_" +j;
				if(intentar(a))Rejilla.celdas[k+1][j]=3;
			}
		}
	}	
	
	public static boolean intentar(String a) {
		byte[] registro1 = new byte[75];
		byte[] registro2 = new byte[75];
		boolean x=false;
		try {
			
			abrirRecordStore(a);
			registro1 = rs.getRecord(1);
			registro2 = rs.getRecord(2);
			if(registro1!=null && registro2!=null)x=true;
			else x=false;
			cerrarRecordStore();
		} catch (RecordStoreException e) {
			System.out.println("No se encontro el registro");
		}
		
		return x;
	}
		

	public static void cerrarRecordStore() {
		try {
			rs.closeRecordStore();
		} catch (RecordStoreException e) {
			System.out.println("Error al cerrar el Record Store");
		}
	}

	public void destruirRecordStore(String nombre) {
		try {
			RecordStore.deleteRecordStore(nombre);
		} catch (RecordStoreException e) {
			System.out.println("No existe el Record Store: " + nombre);
		}
	}

	public void destroyApp(boolean unconditional) {
	}

	public void dibujaRejilla(Graphics g) {
		int i, j;
		Rejilla rejilla = pantalla.getRejilla();
		int xoffset = 0 * anchoCelda;// offset del "bloque"
		for (i = 0; i < rejilla.getAnchura(); i++) {
			for (j = 0; j < rejilla.getAltura(); j++) {
				if (rejilla.getTipoCelda(i, j) == Rejilla.VACIA) {
					g.setColor(0x0);
					g.drawRect(xoffset + i * anchoCeldaX, j * anchoCeldaY,
							anchoCeldaX, anchoCeldaY);
				} else if (rejilla.getTipoCelda(i, j) == Rejilla.OCUPADO) {
					g.setColor(0xFFA500);
					g.fillRect(xoffset + i * anchoCeldaX, j * anchoCeldaY,
							anchoCeldaX, anchoCeldaY);
					g.setColor(0x0);
					g.drawRect(xoffset + i * anchoCeldaX, j * anchoCeldaY,
							anchoCeldaX, anchoCeldaY);
				}
			}
		}
	}

	void dibujaFigura(Figura fig, Graphics g) {
		if (fig != null) {
			Elemento elemento;
			int xoffset = fig.getXOrigen() * anchoCeldaX;// Offset de partida
															// de la celda
			int yoffset = fig.getYOrigen() * anchoCeldaY;
			for (int i = 0; i < fig.getNElements(); i++) {
				elemento = fig.getElementAt(i);
				System.out
						.println("Estado celda:"
								+ Rejilla.celdas[fig.getXOrigen() + 1][fig
										.getYOrigen()]);
				if (Rejilla.celdas[fig.getXOrigen() + 1][fig.getYOrigen()] == 3)
					g.setColor(0xFF0000);
				else
					g.setColor(fig.getColor());
				g.fillRect(xoffset + elemento.getColumna() * anchoCeldaX, 7
						* elemento.getFila() + yoffset + elemento.getFila()
						* anchoCeldaY, anchoCeldaX, anchoCeldaY);
				g.setColor(0x0);
				g.drawRect(xoffset + elemento.getColumna() * anchoCeldaX, 7
						* elemento.getFila() + yoffset + elemento.getFila()
						* anchoCeldaY, anchoCeldaX, anchoCeldaY);
			}
		}
	}

	public void crearFormulario(String sala, String ramo, String sigla,
			String profe) {
		formulario.deleteAll();
		formulario.append(campoTexto);
		formulario.append(campoTexto1);
		formulario.append(campoTexto2);
		formulario.append(campoTexto3);

		formulario.addCommand(opc3_1);
		formulario.setCommandListener(this);

		Pantalla.screen.setCurrent(formulario);

	}
}
