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

void iniciar(tListaSudokus& lista) {

	lista.contador = 0;
	for (int i = 0; i < MAX_SDK; i++){
		iniciar(lista.registro[i], "", 0);
	}

}

int numElems(const tListaSudokus& lista) {
	int num = lista.contador;

	return num;
}

bool cargar(tListaSudokus& lista) {
	bool carga = false;
	ifstream archivo;
	tListaSudokus aux;
	int cont = 0;

	iniciar(lista);
	
	archivo.open("registroSudokus.txt");
	if (!archivo.is_open()) {
		cout << "Error al leer los datos." << endl;
		carga = false;
	}
	else {
		while ((lista.contador < MAX_SDK) && (cargar(lista.registro[lista.contador], archivo))) {
			cont = lista.contador;
			while ((cont > 0) && (lista.registro[cont] < lista.registro[cont - 1])) { //(operator<(lista.registro[cont], lista.registro[cont - 1]))
				aux.registro[cont] = lista.registro[cont];
				lista.registro[cont] = lista.registro[cont - 1];
				lista.registro[cont - 1] = aux.registro[cont];
				cont--;
			}
			lista.contador++;
		}
		carga = true;
	}
	archivo.close();

	return carga;
}

void mostrar(const tListaSudokus& lista) {

	cout << endl << right << setw(22) << "FICHERO DE CARGA" << setw(10) << "NIVEL" << endl;
	cout << setfill('-') << setw(45) << "\n" << setfill(char(0));
	for (int i = 0; i < lista.contador; i++) {
		cout << right << i + 1 << "." <<  setw(20) << lista.registro[i].nomTablero << setw(10) << lista.registro[i].puntos << endl;
	}
	cout << setfill('-') << setw(45) << "\n" << setfill(char(0));

}

////

bool guardar(const tListaSudokus& lista) {
	ofstream archivo;
	bool guardado = false;
	int i = 0;

	archivo.open("registroSudokus.txt");
	if (!archivo.is_open()) {
		cout << "Error al guardar." << endl;
	}
	else {
		while ((i < lista.contador) && (!guardado)) {
			if (guardar(lista.registro[i], archivo)) {
				i++;
			}
		}
		guardado = true;
	}

	return guardado;
}

bool buscar(const tListaSudokus& lista, string nombArch) {
	bool encontrado = false;
	int i = 0;

	while ((!encontrado) && (i < lista.contador)) {
		if (lista.registro[i].nomTablero != nombArch) {
			i++;
		}
		else {
			encontrado = true;
		}
	}

	return encontrado;
}

bool insertar(tListaSudokus& lista, const tRegSudoku& sudoku) {
	bool insertado = false;
	tListaSudokus aux;
	int cont = 0;

	if (buscar(lista, sudoku.nomTablero)) {
		cout << "El tablero ya existe." << endl;
	}
	else {
		if (lista.contador < MAX_SDK) {	
			cont = lista.contador;
			while ((cont > 0) && (operator<(sudoku, lista.registro[cont - 1]))) {
				aux.registro[cont] = lista.registro[cont];
				lista.registro[cont] = lista.registro[cont - 1];
				lista.registro[cont - 1] = aux.registro[cont];
				cont--;
			}
			iniciar(lista.registro[cont], sudoku.nomTablero, sudoku.puntos);
			lista.contador++;
			insertado = true;
		}
		else {
			cout << "La lista está llena." << endl;
		}
	}

	return insertado;
}