//Examen Febrero 2014 - Grupos A, B e I.
//Fernando Méndez Torrubiano.

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;

//Constantes:
const int NPO = 10;
const int NPNecesitados = 1;


//Tipos:
typedef struct tProducto {
	string nombre;
	float peso;
	float precio;
};
typedef tProducto tProductos[NPO];
typedef struct tListaProductos {
	tProductos producto;
	int contador;
};


//Funciones:
void inicializa(tListaProductos&);
bool cargar(tListaProductos&);
void ejecutarMenu(tListaProductos&);
int menu();
bool guardar(tListaProductos&);
tListaProductos leerCesta(tListaProductos&);
int buscarProducto(tListaProductos&, const string&);
void realizarCompra(tListaProductos&, tListaProductos&);
void mostrarAgotados(tListaProductos&);


int main() {
	tListaProductos productos;

	if (cargar(productos)) {
		ejecutarMenu(productos);
		if (guardar(productos)) {
			cout << "Guardado correctamente." << endl;
		}
		else {
			cout << "Error al guardar." << endl;
		}
	}
	else {
		cout << "Fin del programa." << endl;
	}
	system("PAUSE");

	return 0;
}

void inicializa(tListaProductos& productos) {
	productos.contador = 0;
	for (int i = 0; i < NPO; i++){
		productos.producto[i].nombre = "";
		productos.producto[i].peso = 0;
		productos.producto[i].precio = 0;
	}
}

bool cargar(tListaProductos& productos) {
	bool carga = false;
	ifstream archivo;

	inicializa(productos);
	archivo.open("almacen.txt");
	if (!archivo.is_open()) {
		cout << "No se ha encotrado el archivo." << endl;
		carga = false;
	}
	else {
		getline(archivo, productos.producto[productos.contador].nombre);
		while ((productos.producto[productos.contador].nombre != "XXX") && (productos.contador < NPO)) {
			archivo >> productos.producto[productos.contador].peso;
			archivo >> productos.producto[productos.contador].precio;
			productos.contador++;
			archivo.ignore(1, ' ');
			getline(archivo, productos.producto[productos.contador].nombre);
		}
		carga = true;
	}
	archivo.close();

	return carga;
}

void ejecutarMenu(tListaProductos& productos) {
	tListaProductos cesta;
	int opc = 1;

	while (opc != 0) {
		opc = menu();
		switch (opc){
		case 0: break;
		case 1: realizarCompra(productos, cesta); system("PAUSE"); break;
		case 2: mostrarAgotados(productos); system("PAUSE"); break;
		default:
			break;
		}
		system("cls");
	}
}

int menu() {
	int opc = 0;

	cout << setw(20) << setfill('=') << "MENU" << setw(20) << "\n" << setfill(char(0));
	cout << "1.-Realizar la compra" << endl;
	cout << "2.-Ver productos agotados" << endl;
	cout << "0.-Salir" << endl;
	cout << setw(40) << setfill('=') << "\n" << setfill(char(0));

	do {
		cout << "Introduzca una opcion: ";
		cin >> opc;
	} while (opc < 0 || opc > 2);

	return opc;
}

bool guardar(tListaProductos& productos) {
	bool guardado = false;
	ofstream archivo;

	archivo.open("almacen.txt");
	if (!archivo.is_open()) {
		guardado = false;
	}
	else {
		for (int i = 0; i < productos.contador; i++){
			archivo << productos.producto[i].nombre << endl;
			archivo << productos.producto[i].peso << endl;
			archivo << productos.producto[i].precio << endl;
		}
		archivo << "XXX";
		guardado = true;
	}
	archivo.close();

	return guardado;
}

tListaProductos leerCesta(tListaProductos& productos) {
	tListaProductos cesta;
	cesta.contador = 0;
	string nombre;
	int pos = 0;

	while (cesta.contador < NPNecesitados) {
		do {
			cout << "Introduzca un produto: ";
			getline(cin, nombre);
			pos = buscarProducto(productos, nombre);
		} while (pos == -1);
		cesta.producto[cesta.contador].nombre = nombre;
		do {
			cout << "Introduzca cantidad (KG): ";
			cin >> cesta.producto[cesta.contador].peso;
		} while (cesta.producto[cesta.contador].peso > productos.producto[pos].peso);
		productos.producto[pos].peso -= cesta.producto[cesta.contador].peso;
		cesta.producto[cesta.contador].precio = cesta.producto[cesta.contador].peso * productos.producto[pos].precio;
		cesta.contador++;
	}

	return cesta;
}

//SCARLETT JONHANSON ESTUVO AQUÍ
//No, solo eres eva intentando gastar bromas
//NO NO NO NO NOOOOO, bueno si. Me hacia ilu jo :,(
//Eres idiota
//Teniendo en cunta que tu eres yo y que yo soy tu, te estas llamando idiota a ti misma. 
//-_-
//:3
//PONTE A ESTUDIAR O TE MATO!!
// AH! 0-0 si señora.


int buscarProducto(tListaProductos& productos, const string& nombre) {
	int pos = productos.contador;
	bool encontrado = false;

	while ((!encontrado) && (pos > -1)) {
		if (productos.producto[pos].nombre == nombre) {
			encontrado = true;
		}
		else {
			pos--;
		}
	}

	return pos;
}

void realizarCompra(tListaProductos& productos, tListaProductos& cesta) {

	cout << setw(15) << right << "NOMBRE"
		<< setw(15) << "CANTIDAD"
		<< setw(15) << "PRECIO" << endl;
	cout << setw(25) << setfill('=') << "ALMACEN" << setw(25) << "\n" << setfill(char(0));
	for (int i = 0; i < productos.contador; i++) {
		cout << setw(15) << right << productos.producto[i].nombre
			<< setw(15) << productos.producto[i].peso
			<< setw(15) << productos.producto[i].precio << endl;
	}
	cout << setw(50) << setfill('=') << "\n" << setfill(char(0));

	cesta = leerCesta(productos);

	cout << setw(15) << right << "NOMBRE"
		<< setw(15) << "CANTIDAD"
		<< setw(15) << "PRECIO" << endl;
	cout << setw(25) << setfill('=') << "CESTA" << setw(25) << "\n" << setfill(char(0));
	for (int i = 0; i < cesta.contador; i++){
		cout << setw(15) << right << cesta.producto[i].nombre
			<< setw(15) << cesta.producto[i].peso
			<< setw(15) << cesta.producto[i].precio << endl;
	}
	cout << setw(50) << setfill('=') << "\n" << setfill(char(0));
}

void mostrarAgotados(tListaProductos& productos) {
	cout << setw(15) << right << "NOMBRE"
		<< setw(15) << "CANTIDAD"
		<< setw(15) << "PRECIO" << endl;
	cout << setw(25) << setfill('=') << "AGOTADOS" << setw(25) << "\n" << setfill(char(0));
	for (int i = 0; i < productos.contador; i++) {
		if (productos.producto[i].peso == 0) {
			cout << setw(15) << right << productos.producto[i].nombre
				<< setw(15) << productos.producto[i].peso
				<< setw(15) << productos.producto[i].precio << endl;
		}
	}
	cout << setw(50) << setfill('=') << "\n" << setfill(char(0));
}