#include "include.h"


void dibujarFondo(GLuint textura) {
	glEnable(GL_TEXTURE_2D);
	glDisable(GL_DEPTH_TEST);
	glBindTexture(GL_TEXTURE_2D, textura);
	glColor4f(1, 1, 1, 1);
	glBegin(GL_POLYGON); {
		glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 1.0);
		glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 1.0);
		glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 0.0);
		glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 0.0);
	} glEnd();
	glEnable(GL_DEPTH_TEST);
	glDisable(GL_TEXTURE_2D);
}

void dibujarCursor(double x, double y, double size) {
	glDisable(GL_DEPTH_TEST);
	glBegin(GL_POLYGON); {
		glColor3f (1.0, 0, 1.0);
		glVertex3f (x, y, 0);
		glVertex3f (x, y + size, 0);
		glVertex3f (x + size, y + size, 0);
		glVertex3f (x + size, y, 0);
	} glEnd();
	glEnable(GL_DEPTH_TEST);
}

Menu::Menu() {
	this->opcion = 0;
	this->fondoMenu = loadTexture("texturas/fondo_menu.jpg");
	this->fondoAyuda = loadTexture("texturas/fondo_ayuda.jpg");
	this->fondoConfig = loadTexture("texturas/fondo_config.jpg");
	this->estado = ESTADO_MENU;
	this->opciones[OPCION_INICIO] = "Inicio";
	this->opciones[OPCION_AYUDA] = "Ayuda";
	this->opciones[OPCION_CONFIG] = "Configuracion";
	this->opciones[OPCION_SALIR] = "Salir";
}

void Menu::init() {
	glClearColor(0, 0, 0, 1);
}

void Menu::reshape(int w, int h) {
	glViewport (0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity ();
	if (w == 0 || h == 0) return;
	if (w < h) {
		glOrtho(0, 1, h/(double)w, 0, 0, 20);
	} else {
		glOrtho(0, w/(double)h, 1, 0, 0, 20);
	}
	glMatrixMode(GL_MODELVIEW);
}

void Menu::special(int key, int x, int y) {
	if (this->estado == ESTADO_MENU) {
		if (key == GLUT_KEY_UP) {
			this->opcion = (this->opcion == 0?CANT_OPCIONES - 1:this->opcion - 1);
		} else if (key == GLUT_KEY_DOWN) {
			this->opcion = (this->opcion == CANT_OPCIONES - 1?0:this->opcion + 1);
		}
	} else if (this->estado == ESTADO_CONFIG) {
		if (key == GLUT_KEY_UP) {
			if (this->opcionConfig == 0) {
				if (Config::luzEnabled && Config::luzSolar) {
					this->opcionConfig = CONFIG_COLOR;
				} else if (Config::luzEnabled) {
					this->opcionConfig = CONFIG_LUZ_SOL;
				} else {
					this->opcionConfig = CONFIG_LUZ;
				}
			} else {
				this->opcionConfig--;
			}
		} else if (key == GLUT_KEY_DOWN) {
			if (this->opcionConfig == CONFIG_LUZ && !Config::luzEnabled ||
					this->opcionConfig == CONFIG_LUZ_SOL && !Config::luzSolar ||
					this->opcionConfig == CONFIG_COLOR) {
				this->opcionConfig = 0;
			} else {
				this->opcionConfig++;
			}
		}
	}
}

void Menu::keyboard(unsigned char key, int x, int y) {
	if (key == 'q' || key == 'Q') {
		exit(0);
	} else if (key == 27) {
		if (this->estado == ESTADO_MENU) {
			exit(0);
		} else {
			this->estado = ESTADO_MENU;
		}
	} else if (key == 13) {
		if (this->estado == ESTADO_MENU) {
			if (this->opcion == OPCION_SALIR) {
				exit(0);
			} else if (this->opcion == OPCION_INICIO) {
				goTo(getJuego());
			} else if (this->opcion == OPCION_AYUDA) {
				this->estado = ESTADO_AYUDA;
			} else if (this->opcion == OPCION_CONFIG) {
				this->estado = ESTADO_CONFIG;
				this->opcionConfig = 0;
			}
		} else if (this->estado == ESTADO_CONFIG) {
			if (this->opcionConfig == CONFIG_VEL) {
				if (Config::velocidadJuego == 1) {
					Config::velocidadJuego = 3;
				} else if (Config::velocidadJuego > 1) {
					Config::velocidadJuego = 0.3;
				} else {
					Config::velocidadJuego = 1;
				}
			} else if (this->opcionConfig == CONFIG_POLI) {
				if (Config::wireframe == WF_PUNTOS) {
					Config::wireframe = WF_LINEAS;
				} else if (Config::wireframe == WF_LINEAS) {
					Config::wireframe = WF_RELLENO;
				} else {
					Config::wireframe = WF_PUNTOS;
				}
			} else if (this->opcionConfig == CONFIG_FACETADO) {
				Config::facetado = !Config::facetado;
			} else if (this->opcionConfig == CONFIG_TEXTURA) {
				Config::textura = !Config::textura;
			} else if (this->opcionConfig == CONFIG_MATERIAL) {
				Config::material = !Config::material;
			} else if (this->opcionConfig == CONFIG_LUZ) {
				Config::luzEnabled = !Config::luzEnabled;
			} else if (this->opcionConfig == CONFIG_LUZ_SOL) {
				Config::luzSolar = !Config::luzSolar;
			} else if (this->opcionConfig == CONFIG_COLOR) {
				if (Config::luzColor == COLOR_BLANCO) {
					Config::luzColor = COLOR_ROJO;
				} else if (Config::luzColor == COLOR_ROJO) {
					Config::luzColor = COLOR_VERDE;
				} else if (Config::luzColor == COLOR_VERDE) {
					Config::luzColor = COLOR_AZUL;
				} else {
					Config::luzColor = COLOR_BLANCO;
				}
			}
		}
	}
}


void Menu::display() {

	glLoadIdentity();
	if (this->estado == ESTADO_MENU) {
		dibujarFondo(this->fondoMenu);

		glColor3f(1, 1, 1);
		dibujarTexto(this->opciones[0], 0.3, 0.18, 0.1);
		dibujarTexto(this->opciones[1], 0.3, 0.28, 0.1);
		dibujarTexto(this->opciones[2], 0.3, 0.38, 0.1);
		dibujarTexto(this->opciones[3], 0.3, 0.48, 0.1);

		dibujarCursor(0.2, 0.2 + this->opcion/10.0, 0.05);

	} else if (this->estado == ESTADO_AYUDA) {
		dibujarFondo(this->fondoAyuda);

		glColor3f(1.0, 0.0, 1.0);
		dibujarTexto("Ayuda", 0.36, 0.02, 0.09);
		glColor3f(0, 1.0, 1.0);
		dibujarTexto("Nave:", 0.4, 0.17, 0.07);
		dibujarTexto("Juego:", 0.38, 0.62, 0.07);
		glColor3f(1, 1, 1);
		dibujarTexto("Movimiento:\nAcelerar:\nDesacelerar:\nDisparar:\nTeletransportar:", 0.47, 0.27, 0.05, true);
		dibujarTexto("Mouse\nFlecha Arriba\nFlecha Abajo\nBarra espaciadora\nInicio", 0.53, 0.27, 0.05);
		dibujarTexto("Pausa:\nCamara:\nSalir:\nVolver:", 0.47, 0.72, 0.05, true);
		dibujarTexto("P\nC\nQ\nESC", 0.53, 0.72, 0.05);
	} else {
		dibujarFondo(this->fondoConfig);
		glColor3f(1.0, 0.0, 1.0);
		dibujarTexto("Configuracion", 0.2, 0.02, 0.09);
		glColor3f(1.0, 1.0, 1.0);
		
		dibujarTexto("Velocidad del Juego:", 0.1, 0.16, 0.05);
		if (Config::velocidadJuego == 1) {
			dibujarTexto("Normal", 0.7, 0.16, 0.05);
		} else if (Config::velocidadJuego < 1) {
			dibujarTexto("Lenta", 0.7, 0.16, 0.05);
		} else if (Config::velocidadJuego > 1) {
			dibujarTexto("Rapida", 0.7, 0.16, 0.05);
		}

		dibujarTexto("Dibujado de Poligonos:", 0.1, 0.21, 0.05);
		if (Config::wireframe == WF_PUNTOS) {
			dibujarTexto("Puntos", 0.7, 0.21, 0.05);
		} else if (Config::wireframe == WF_LINEAS) {
			dibujarTexto("Lineas", 0.7, 0.21, 0.05);
		} else if (Config::wireframe == WF_RELLENO) {
			dibujarTexto("Relleno", 0.7, 0.21, 0.05);
		}

		dibujarTexto("Facetado:", 0.1, 0.26, 0.05);
		if (Config::facetado) {
			dibujarTexto("Activado", 0.7, 0.26, 0.05);
		} else {
			dibujarTexto("Desactivado", 0.7, 0.26, 0.05);
		}

		dibujarTexto("Textura:", 0.1, 0.31, 0.05);
		if (Config::textura) {
			dibujarTexto("Activado", 0.7, 0.31, 0.05);
		} else {
			dibujarTexto("Desactivado", 0.7, 0.31, 0.05);
		}

		dibujarTexto("Material:", 0.1, 0.36, 0.05);
		if (Config::material) {
			dibujarTexto("Activado", 0.7, 0.36, 0.05);
		} else {
			dibujarTexto("Desactivado", 0.7, 0.36, 0.05);
		}

		dibujarTexto("Luz:", 0.1, 0.41, 0.05);
		if (Config::luzEnabled) {
			dibujarTexto("Activado", 0.7, 0.41, 0.05);
		} else {
			dibujarTexto("Desactivado", 0.7, 0.41, 0.05);
		}

		if (Config::luzEnabled) {
			dibujarTexto("Luz Solar:", 0.1, 0.46, 0.05);
			if (Config::luzSolar) {
				dibujarTexto("Activado", 0.7, 0.46, 0.05);
			} else {
				dibujarTexto("Desactivado", 0.7, 0.46, 0.05);
			}
			if (Config::luzSolar) {
				dibujarTexto("Color Luz Sol:", 0.1, 0.51, 0.05);
				if (Config::luzColor == COLOR_BLANCO) {
					dibujarTexto("Blanco", 0.7, 0.51, 0.05);
				} else if (Config::luzColor == COLOR_ROJO) {
					dibujarTexto("Rojo", 0.7, 0.51, 0.05);
				} else if (Config::luzColor == COLOR_VERDE) {
					dibujarTexto("Verde", 0.7, 0.51, 0.05);
				} else if (Config::luzColor == COLOR_AZUL) {
					dibujarTexto("Azul", 0.7, 0.51, 0.05);
				}
			}
		}

		dibujarCursor(0.03, 0.17 + this->opcionConfig/20.0, 0.03);
	}
}
