#include "listaLonja.h"
using namespace std;

//Funciones auxiliares:
bool busquedaRecursiva(tListaLotes & lista, tLotes& nuevo, int& ini, int& fin, int& pos);


void inicializar(tListaLotes & lista){
	lista.cont = 0;
}

int numLotes(tListaLotes & lista){
	return lista.cont;
}

bool insertar(tListaLotes & lista, tLotes& nuevo){
	bool insertado = false;
	int pos = 0;


	if (!buscar(lista, nuevo, pos)) {
		lista.lote[lista.cont] = new tLotes;
		lista.lote[lista.cont]->lote = nuevo.lote;
		lista.lote[lista.cont]->tipo = nuevo.tipo;
		lista.lote[lista.cont]->precio = nuevo.precio;
		lista.lote[lista.cont]->peso = nuevo.peso;
		lista.cont++;
	}
	else {
		lista.lote[lista.cont] = new tLotes;
		for (int i = lista.cont; i > pos; i--){
			lista.lote[i] = lista.lote[i - 1];
		}
		lista.lote[pos]->tipo = nuevo.tipo;
		lista.lote[pos]->lote = nuevo.lote;
		lista.lote[pos]->precio = nuevo.precio;
		lista.lote[pos]->peso = nuevo.peso;
		lista.cont++;
		insertado = true;
	}

	return insertado;
}

bool cargar(tListaLotes & lista){
	bool carga = false;
	ifstream archivo;
	tLotes aux;
	inicializar(lista);

	archivo.open("datos.txt");
	if (!archivo.is_open()) {
		cout << "Error al caragar el archivo." << endl;
	}
	else {
		while (!archivo.fail() && lista.cont < MAX_LOTES) {
			archivo >> aux.lote;
			archivo >> aux.tipo;
			archivo >> aux.precio;
			archivo >> aux.peso;
			if (!archivo.eof()) {
				insertar(lista, aux);
			}
		}
		carga = true;
	}

	return carga;
}

bool buscar(tListaLotes& lista, tLotes& nuevo, int& pos){
	bool encontrado = false;
	int ini = 0, fin = lista.cont - 1;

	encontrado = busquedaRecursiva(lista, nuevo, ini, fin, pos);

	return encontrado;
}

bool busquedaRecursiva(tListaLotes& lista, tLotes& nuevo, int& ini, int& fin, int& pos) {
	bool encontrado = false;

	if (ini <= fin) {
		pos = (ini + fin) / 2;
		if (nuevo < *lista.lote[pos]) {
			fin = pos - 1;
			encontrado = busquedaRecursiva(lista, nuevo, ini, fin, pos);
		}
		else if (*lista.lote[pos] < nuevo){
			ini = pos + 1;
			encontrado = busquedaRecursiva(lista, nuevo, ini, fin, pos);
		}
		else {
			encontrado = true;
		}
	}

	return encontrado;
}

void obeternerLote(tListaLotes& lista, tLotes* lote, int& pos){
	lote = lista.lote[pos];
}

void mostrar(tListaLotes& lista, tListaComprador& comprador){
	for (int i = 0; i < comprador.cont; i++){
		mostrarPrecio(*lista.lote[i], *comprador.comprador[i]);
	}
}

void liberar(tListaLotes & lista){
	for (int i = 0; i < lista.cont; i++){
		delete lista.lote[i];
	}
}
