//Sudoku - Fernando Méndez Torrubiano
#include "JuegoSudoku.h"
using namespace std;

void mostrar(const tJuegoSudoku& juego) {

	mostrar(juego.registro);
	mostrar(juego.tablero);

}

int jugar(const tRegSudoku& sudoku) {
	tJuegoSudoku juego;
	int puntos = 0;
		
	juego.registro.nomTablero = sudoku.nomTablero;
	juego.registro.puntos = sudoku.puntos;
	if (cargar(juego.tablero, sudoku.nomTablero)) {
		clear();
		mostrar(juego);
		ejecutarSubMenu(juego, puntos);
	}
	else {
		cout << "No se ha podido cargar el tablero." << endl;
	}

	return puntos;
}

void ejecutarSubMenu(tJuegoSudoku& juego, int& puntos) {
	tCoor coordenadas;
	char opc = '1';
	int num = 0;
	bool resuelto = false;

	do {
		actulizarCandidatos(juego, coordenadas);
		opc = subMenu();
		switch (opc) {
		case '1':
			pedirCoordenadas(coordenadas);
			mostrarCandidatos(juego.tablero, coordenadas);
			pausa();
			break;
		case '2':
			pedirCoordenadas(coordenadas);
			do {
				cout << endl << "Introduzca un numero [1-9]: ";
				cin >> num;
			} while ((num < 1) || (num > MAXDIM));

			if (actualizar(juego.tablero, coordenadas, num)) {
				cout << "Casilla actualizada correctamente." << endl;
			}
			else {
				cout << "No se ha podido actualizar esa casilla." << endl;
			}
			pausa();
			break;
		case '3':
			pedirCoordenadas(coordenadas);
			if (borrar(juego.tablero, coordenadas)) {
				cout << "Borrado correctamente." << endl;
			}
			else {
				cout << "No se puede borrar esa casilla." << endl;
			}
			pausa();
			break;
		case '4':
			if (cargar(juego.tablero, juego.registro.nomTablero)) {
				cout << "Tablero reiniciado correctamente." << endl;
			}
			pausa();
			break;
		case '5':
			completarSimples(juego.tablero);
			break;
		}

		if (numVacias(juego.tablero) == 0) {
			resuelto = true;
			puntos = juego.registro.puntos;
		}
		clear();
		mostrar(juego);
	} while ((opc != '0') && (!resuelto));
}

char subMenu() {
	char opc = '1';

	cout << endl << "<" << setfill(char('-')) << setw(35) << "OPCIONES DE JUEGO" << setw(18) << ">" << "\n" << setfill(char(0));
	cout << "1 - Ver posibles valores de una casilla vacía" << endl;
	cout << "2 - Colocar valor en una casilla" << endl;
	cout << "3 - Borrar valor de una casilla" << endl;
	cout << "4 - Reiniciar el tablero" << endl;
	cout << "5 - Autocompletar celdas simples" << endl;
	cout << "0 - Abortar la resolución y volver al menú principal" << endl;
	cout << "<" << setfill(char('-')) << setw(53) << ">" << "\n" << setfill(char(0));


	cout << "Seleccione una opcion: ";
	cin >> opc;
	while (opc != '0' && opc != '1' && opc != '2' && opc != '3' && opc != '4' && opc != '5') {
		cout << "Seleccione una opción del menu (entre 0 y 5): ";
		cin >> opc;
	}

	return opc;
}

void pedirCoordenadas(tCoor& coordenadas) {
	do {
		cout << "Introduzca fila [1-9]: ";
		cin >> coordenadas.fila;
	} while ((coordenadas.fila < 1) || (coordenadas.fila > MAXDIM));
	coordenadas.fila -= 1;
	do {
		cout << "Introduzca columna [1-9]: ";
		cin >> coordenadas.col;
	} while ((coordenadas.col < 1) || (coordenadas.col > MAXDIM));
	coordenadas.col -= 1;
}

void actulizarCandidatos(tJuegoSudoku& juego, tCoor& coordenadas) {
	for (int i = 0; i < MAXDIM; i++) {
		for (int j = 0; j < MAXDIM; j++) {
			coordenadas.fila = i;
			coordenadas.col = j;
			cargarCandidatos(juego.tablero, coordenadas);
		}
	}
}