/*
Apellidos: Verdú Rodríguez
Nombre: Eva
DNI: 51220965B
Puesto: 15
*/

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

//Constantes:
const int MAX_NAV = 24;
const string CENT = "XXX";

typedef struct tNavios{
	string nom;
	string empr;
	float esl;
	float ton;
	string pag;
};

typedef tNavios tListaNav[MAX_NAV];

typedef struct tListaNavios {
	tListaNav lista;
	int cont;
};

//Funciones:
int menu();
bool cargar(tListaNavios & lista); //Carga el archivo.
void muestraNavios(const tListaNavios lista);
float peajeNavio(const tNavios navio);
float peajePagado(const tListaNavios lista);
void crearNavio(tListaNavios & lista);
bool insertaNavio(const tNavios navio, tListaNavios & lista);
bool cobrarNavio(tListaNavios & lista, string name);


int main() {
	tListaNavios lista;
	string name;
	bool cobrar = true;
	bool ok = cargar(lista);
	int opc=0;
	if (ok) {
		do{
			opc = menu();
			switch (opc) {
			case 1:
				muestraNavios(lista);
				break;
			case 2:
				crearNavio(lista);
				break;
			case 3:
				cout << "Introduce Nombre del Navio: ";
				cin >> name;
				cobrar = cobrarNavio(lista , name);
				if (!cobrar) {
					cout << "Error. Barco no encontrado" << endl;
				}
				break;
			}
		} while (opc != 0);
	}
	else {
		cout << "Error al abrir el archivo" << endl;
	}
	system("pause");
	return 0;
}

int menu() {
	int opc;
	cout << "---------------------------------" << endl;
	cout << "Elige una opcion: " << endl;
	cout << "1 - Muestra la lista" << endl;
	cout << "2 - Nuevo navio" << endl;
	cout << "3 - Pagar navio" << endl;
	cout << "0 - Salir" << endl;
	cout << "---------------------------------" << endl;
	cin >> opc;
	while (opc < 0 || opc > 3) {
		cout << "Error. Ponga un valor entre 0 y 3." << endl;
	}
	return opc;
}

bool cargar(tListaNavios & lista){
	bool ok = true;
	string aux;
	ifstream archivo;
	lista.cont = 0;

	archivo.open("navios.txt");
	if (archivo.is_open()) {
		archivo >> lista.lista[lista.cont].nom;
		while((lista.lista[lista.cont].nom != CENT) && (lista.cont < MAX_NAV)) {
			archivo >> lista.lista[lista.cont].empr;
			archivo >> lista.lista[lista.cont].esl;
			archivo >> lista.lista[lista.cont].ton;
			archivo >> lista.lista[lista.cont].pag;
			lista.cont++;
			archivo >> lista.lista[lista.cont].nom;
		}
		archivo.close();
	}
	else {
		ok = false;
	}
	
	return ok;
}

void muestraNavios(const tListaNavios lista) {
	int i = 0;
	float peaje = 0;
	cout << "Navio" << setw(20) << "Empresa" << setw(20) << "Eslora" << setw(20) << "Toneladas" << setw(20) << "Peaje" << setw(20) << endl;
	cout << setw(100) << setfill('=') << "\n";
	cout << setw(100) << setfill(' ') << "\n";
	for (int i = 0; i < lista.cont; i++){
		cout << setw(20) << left << lista.lista[i].nom;
		cout << setw(20) << lista.lista[i].empr;
		cout << fixed << setprecision(2) << setw(15) << lista.lista[i].esl;
		cout << setw(15) << lista.lista[i].ton;
		peaje = peajeNavio(lista.lista[i]);
		if (lista.lista[i].pag == "true") {
			cout << setw(10) << right << peaje  << " Pagado"  << endl;
		}
		else {
			cout << setw(10) << right << peaje << " No Pagado" << endl;
		}
	}
	cout << setw(100) << setfill('=') << '\n';
	float total = peajePagado(lista);
	cout << "Precio total: " << total << endl;
	cout << setw(100) << setfill(' ') << '\n';
}

float peajeNavio(const tNavios navio) {
	float peaje;
	if (navio.esl < 100) {
		peaje = navio.ton * 2;
	}
	else {
		peaje = navio.ton * 3;
	}
	return peaje;
}

float peajePagado(const tListaNavios lista) {
	float total = 0;
	for (int i = 0; i < lista.cont; i++){
		if (lista.lista[i].pag == "true") {
			float peaje = peajeNavio(lista.lista[i]);
			total += peaje;
		}
	}
	return total;
}

void crearNavio(tListaNavios & lista) {
	tNavios navio;
	cout << "Introduzca nombre: ";
	cin >> navio.nom;
	cout << "Introduzca compañia: ";
	cin >> navio.empr;
	cout << "Introduzca eslora: ";
	cin >> navio.esl;
	cout << "Introduzca tonaledas: ";
	cin >> navio.ton;
	navio.pag = "false";
	if (insertaNavio(navio, lista)) {
		cout << "Se ha insertado correctamente" << endl;
		cout << setw(100) << setfill(' ') << '\n';
	}
	else {
		cout << "No se pudo introducir" << endl;
		cout << setw(100) << setfill(' ') << '\n';
	}
}

bool insertaNavio(const tNavios navio, tListaNavios & lista) {
	bool insertar = true;;
	if (lista.cont < MAX_NAV) {
		lista.lista[lista.cont].nom = navio.nom;
		lista.lista[lista.cont].empr = navio.empr;
		lista.lista[lista.cont].esl = navio.esl;
		lista.lista[lista.cont].ton = navio.ton;
		lista.lista[lista.cont].pag = navio.pag;
		lista.cont++;
	}
	else {
		insertar = false;
	}
	return insertar;
}
	
bool cobrarNavio(tListaNavios & lista, string name) {
	bool cobrar = false;
	int i = 0;
	while (!cobrar && i < lista.cont ) {
		if (lista.lista[i].nom == name) {
			lista.lista[i].pag = "true";
			cobrar = true;
		}
		i++;
	}
	return cobrar;
}