#include "meni.h"
Meni::Meni(const char* naziv, const int& brPolica, const int& duzina) :
b(naziv, brPolica, duzina), opcija(0) {
	
	try {
		Komplet* komplet = new Komplet("Francis Ford Coppola", "Trilogija Kum");
		*komplet += new Disk("Mario Puzo", "Kum 1", 178, 4.2);
		*komplet += new Disk("Mario Puzo", "Kum 2", 200, 4.2);
		*komplet += new Disk("Mario Puzo", "Kum 3", 170, 4.2);

		b += new Knjiga("Jovan Sterija Popovic", "Kir Janja", 170, 5);
		b += new Knjiga("Migel de Servantes", "Don Kihot", 360, 9);
		b += new Knjiga("Petar Petrovic Njegos", "Gorski vijenac", 238, 6.6);
		b += new Knjiga("Ivo Andric", "Most na Zepi", 203, 4.2);
		b += new Knjiga("Lav Tolstoj", "Ana Karenjina", 816, 21.3);
		b += new Knjiga("Antoan de Sent Egziperi", "Mali Princ", 96, 2);
		b += komplet;
		b += new Disk("Frenk Darabont", "Bekstvo iz Sosenkna", 142, 4.2);
		b += new Knjiga("Ivo Andric", "Na Drini Cuprija", 333, 8.5);
		b += new Knjiga("Borislav Stankovic", "Necista krv", 248, 8);
		b += new Disk("Majkl Kertis", "Kazablanka", 102, 4.2);
		
	}
	catch (Greska& g) {
		cout << g;
	}
}

void Meni::setOpcija() {
	cin >> opcija;
	if (cin.fail())
		opcija = 0;
	this->nastavak(false);
}

void Meni::radi() {
	switch (opcija) {
	case 1: {
		cout << b;
		opcija = 0;
		clrscr();
		break;
	}
	case 2: {
		try {
			cout << "Polica sa rednim brojem? ";
			int rbr; cin >> rbr;
			cout << b[rbr-1];
		}
		catch (Greska g) {
			cout << g;
		}
		nastavak();
		break;
	}
	case 3: nabaviDelo(); break;
	case 4: {
		Delo* d = unesiDelo();
		try {
			b += d;
			cout << "Uspesno dodato delo u biblioteku." << endl;
		} catch (Greska& g) {
			cout << g;
		}
		nastavak();
		break;
	}
	case 5: {
		cout << "Autor? ";
		char autor[80+1];
		cin.get(autor, 80);
		PromNiz<Delo *, 1> p = b.delaAutora(autor);
		cout << "VRS ID  AUTOR\t\t\t NASLOV\t\t\t  DEB\tDUZ";
		cout << endl << p;
		nastavak();
		break;
	}
	case 6: {
		int rbr;
		cout << "Identifikator dela? ";
		cin >> rbr;
		while(cin.fail()) {
			cin.clear(); cin.ignore(INT_MAX, '\n');
			cout << "Redni broj dela? ";			
			cin >> rbr;
		}
		try {
			Delo* d = b(rbr);
			cout << "Iz biblioteke izvadjeno:\n";
			cout << *d << endl;
		} catch (Greska& g) {
			cout << g;
		}
		nastavak();
		break;
	}
	case 7: {
		int rbr;
		cout << "Polica sa rednim brojem? ";
		cin >> rbr;
		while(cin.fail()) {
			cin.clear(); cin.ignore(INT_MAX, '\n');
			cout << "Polica sa rednim brojem? ";
			cin >> rbr;
		}
		try {
			b[rbr-1].prazni();
			cout << "Uspesno ste ispraznili policu." << endl;
		} catch (Greska& g) {
			cout << g;
		}
		nastavak();
		break;
	}
	}
	prikaziMeni();
}

void Meni::prikaziMeni() {
	char a = 201, b = 205, c = 187, d = 186;
	char e = 200, f = 188, g = 204, h = 185;

	
	cout << endl << endl << endl;
	cout << "\t\t      Autor: Dusan Rajcevic NRT-1/12" << endl;

	cout << "\t\t" << a;
	for (int i = 0; i < 39; i++)
		cout << b; cout << c << endl;

	cout << "\t\t" << d << "\t\tBiblioteka\t\t" << d << endl;
	
	cout << "\t\t" << g;
	for (int i = 0; i < 39; i++)
		cout << b; cout << h << endl;

	cout << "\t\t" << d << "\t1. Prikaz cele biblioteke\t" << d << endl;
	cout << "\t\t" << d << "\t2. Prikaz jedne police\t\t" << d << endl;
	cout << "\t\t" << d << "\t3. Nabavka dela\t\t\t" << d << endl;
	cout << "\t\t" << d << "\t4. Smestanje dela\t\t" << d << endl;
	cout << "\t\t" << d << "\t5. Pretraga po autoru\t\t" << d << endl;
	cout << "\t\t" << d << "\t6. Izvlacenje dela\t\t" << d << endl;
	cout << "\t\t" << d << "\t7. Praznjenje police\t\t" << d << endl;
	cout << "\t\t" << d << "\t8. Izlaz\t\t\t" << d << endl;

	cout << "\t\t" << e; for (int i = 0; i < 39; i++) cout << b;
	cout << f << endl << "\t\tIzbor: ";
}

Delo* Meni::unesiDelo() {
	char izbor;
	do {
		cout << "Disk/Knjiga? ";
		izbor = cin.get(); cin.clear(); cin.ignore(INT_MAX, '\n');
	} while (izbor != 'k' && izbor != 'K' &&
			 izbor != 'd' && izbor != 'D');

	cout << "Autor? ";
	char autor[40 + 1];
	cin.get(autor, 40); cin.clear(); cin.ignore(INT_MAX, '\n');

	cout << "Naslov? ";
	char naslov[40 + 1]; cin.get(naslov, 40);

	double debljina;
	do {
		cin.clear(); cin.ignore(INT_MAX, '\n');
		cout << "Debljina? ";
		cin >> debljina;
	} while (cin.fail());

	int velicina;
	do {
		cin.clear(); cin.ignore(INT_MAX, '\n');
		cout << ((izbor == 'k' || izbor == 'K') ?
				"Broj stranica? " : "Trajanje (u minutima)? ");
		cin >> velicina;
	} while (cin.fail());

	if (izbor == 'k' || izbor == 'K')
		return new Knjiga(autor, naslov, velicina, debljina);
	else
		return new Disk(autor, naslov, velicina, debljina);
}

void Meni::nabaviDelo() {
	char da;
	do {
		cout << "Komplet (Da/Ne)? ";
		da = cin.get();
		cin.clear(); cin.ignore(INT_MAX, '\n');
	} while (da != 'n' && da != 'N' && da != 'd' && da != 'D');
	if (da == 'n' || da == 'N') {		
		Delo* delo = unesiDelo();

		int brPrimeraka;
		cout << "Koliko primeraka? ";
		cin >> brPrimeraka;
		while (cin.fail()) {
			cin.clear(); cin.ignore(INT_MAX, '\n');
			cout << "Koliko primeraka? ";
			cin >> brPrimeraka;
		}
		try {
			b.nabavi(brPrimeraka, *delo);
			cout << "Delo je smesteno na police." << endl;
		} catch (Greska& g) {
			cout << g;
		}
		delete delo;
	}
	else {
		cout << "Autor? ";
		char autor[40 + 1];
		cin.get(autor, 40);
		cin.clear(); cin.ignore(INT_MAX, '\n');

		cout << "Naslov? ";
		char naslov[40 + 1];
		cin.get(naslov, 40);
		cin.clear(); cin.ignore(INT_MAX, '\n');

		Komplet* k = new Komplet(autor, naslov);
		cout << endl;
		while (dodajUKomplet(k)) {}
		try {
			b += k;
			cout << "Delo je smesteno na police." << endl;
		} catch (Greska& g) {
			cout << g;
		}
	}
	nastavak();
}

bool Meni::dodajUKomplet(Komplet* k) {
	Delo* d = unesiDelo();
	*k += d;
	cin.clear(); cin.ignore(INT_MAX, '\n');
	cout << "Jos dela (Da/Ne)? ";
	char izbor = cin.get(); cin.clear(); cin.ignore(INT_MAX, '\n');
	cout << endl;
	return izbor == 'd' || izbor == 'D';
}

void Meni::nastavak(const bool& enter) {
	if(enter) {
		cout << "ENTER za nastavak.";
		cin.get();
	}
	cin.clear();
	cin.ignore(INT_MAX, '\n');
	clrscr();
}