#include "ListaCitas.h"
using namespace std;

//Funciones auxiliares:
void ampliar(tListaCitas& listaCitas, int); //Amplia la lista de citas en caso de que se haya llegado al límite de su capacidad.
bool buscar(tListaCitas& listaCitas, const tCita& cita, int& ini, int& fin, int& pos); //Búsqueda binaria y recursiva.

void nuevaLista(tListaCitas& listaCitas) {
	listaCitas.capacidad = 5;
	listaCitas.cont = 0;
	listaCitas.lista = new tCita[listaCitas.capacidad];
}

bool inserta(tListaCitas& listaCitas, const tCita& cita) {
	bool insertado = false;
	int ini = 0, fin = listaCitas.cont - 1, pos = 0;

	if (listaCitas.cont == listaCitas.capacidad) {
		ampliar(listaCitas, listaCitas.capacidad*2);
	}
	else {
		if (!buscar(listaCitas, cita, ini, fin, pos)) {
			for (int i = listaCitas.cont; i > pos; i--){
				listaCitas.lista[i] = listaCitas.lista[i - 1];
			}
			listaCitas.lista[pos] = cita;
			listaCitas.cont++;
			insertado = true;
		}
		else {
			listaCitas.lista[pos] = cita;
		}
	}

	return insertado;
}

//
bool buscar(tListaCitas& listaCitas, const tCita& cita, int& ini, int& fin, int& pos){
	bool encontrado = false;

	if (ini <= fin) {
		pos = (ini + fin) / 2;
		if (cita.valoracion < listaCitas.lista[pos].valoracion) {
			fin = pos - 1;
			encontrado = buscar(listaCitas, cita, ini, fin, pos);
		}
		else if(listaCitas.lista[pos].valoracion < cita.valoracion){
			ini = pos + 1;
			encontrado = buscar(listaCitas, cita, ini, fin, pos);
		}
		else {
			encontrado = true;
		}
	}

	return encontrado;
}
//

void muestra(const tListaCitas& listaCitas) {
	cout << "Lista de citas: " << endl;
	for (int i = listaCitas.cont - 1; i >= 0; i--){
		cout << setfill(char('-')) << setw(40) << "\n" << setfill(char(0));
		mostrar(*listaCitas.lista[i].puntero1);
		mostrar(*listaCitas.lista[i].puntero2);
		cout << "Cita en: " << setw(10) << listaCitas.lista[i].lugar << setw(20) << "Valoración: " << listaCitas.lista[i].valoracion << endl;
		cout << setfill(char('-')) << setw(40) << "\n" << setfill(char(0));
	}
}

//
void ampliar(tListaCitas& listaCitas, int ampliacion) {
	listaCitas.capacidad = ampliacion;

	tCita* aux;
	aux = new tCita[listaCitas.capacidad];

	for (int i = 0; i < listaCitas.cont; i++){
		aux[i] = listaCitas.lista[i];
	}
	
	delete[] listaCitas.lista;
	listaCitas.lista = aux;

}
//

void libera(tListaCitas& listaCitas) {
	delete[] listaCitas.lista;
}
