#include "Bankomat.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

UZIVATEL::UZIVATEL(unsigned int id0, const string pin0, const double stavUctu0){
	id = id0;
	pin = pin0;
	stavUctu = stavUctu0;
};

bool UZIVATEL::jeSumaNaUcte(double suma0) {
	if (stavUctu >= suma0) {
		return true;
	}

	return false;
};

void UZIVATEL::odratatZUctu(double suma0) {
	if (jeSumaNaUcte(suma0)) {
		stavUctu -= suma0;
	}
};

double UZIVATEL::zistitStavUctu() {
	return stavUctu;
};

unsigned int UZIVATEL::vratitId() {
	return id;
}

string UZIVATEL::vratitPin() {
	return pin;
}
bool UZIVATEL::operator==(UZIVATEL uzivatel0) {
	if (id == uzivatel0.id && pin == uzivatel0.pin) {
		return true;
	}
	return false;
};

SPRAVCA_UZIVATELOV::SPRAVCA_UZIVATELOV() {
	vector<UZIVATEL> poleUzivatelia;
	pocetUzivatelov = 0;
}

bool SPRAVCA_UZIVATELOV::overUzivatelaId(unsigned int id0) {
	for (std::vector<UZIVATEL>::iterator it = poleUzivatelia.begin(); it != poleUzivatelia.end(); it++) {
		if ((*it).vratitId() == id0) {
			return true;
		}
	}
	return false;
}


bool SPRAVCA_UZIVATELOV::overUzivatela(unsigned int id0, string pin0) {
	for (std::vector<UZIVATEL>::iterator it = poleUzivatelia.begin(); it != poleUzivatelia.end();it++) {
		if ( (*it).vratitId() == id0 && (*it).vratitPin() == pin0 ) {
			return true;
		}
	}
	return false;
}

UZIVATEL SPRAVCA_UZIVATELOV::vratUzivatela(unsigned int id0, string pin0) {
	for (std::vector<UZIVATEL>::iterator it = poleUzivatelia.begin(); it != poleUzivatelia.end(); it++) {
		if ((*it).vratitId() == id0 && (*it).vratitPin() == pin0) {
			return *it;
		}
	}
}

bool SPRAVCA_UZIVATELOV::pridajUzivatela(UZIVATEL uzivatel0) {
	if (!overUzivatelaId(uzivatel0.vratitId())) {
		poleUzivatelia.push_back(uzivatel0);
		return true;
	}
	return false;
};
/*
BANKOMATOVA_NAPLN::BANKOMATOVA_NAPLN() {
	pocet10 = 0;
	pocet20 = 0;
	pocet50 = 0;
	pocet100 = 0;
	pocet200 = 0;
	pocet500 = 0;
	pocetDruhovBankoviek = 6;
};

BANKOMATOVA_NAPLN::BANKOMATOVA_NAPLN(unsigned int pocet_10, unsigned int pocet_20=0, unsigned int pocet_50=0, unsigned int pocet_100=0, unsigned int pocet_200=0, unsigned int pocet_500=0) {
	pocet10 = pocet_10;
	pocet20 = pocet_20;
	pocet50 = pocet_50;
	pocet100 = pocet_100;
	pocet200 = pocet_200;
	pocet500 = pocet_500;
	pocetDruhovBankoviek = 6;
};

void BANKOMATOVA_NAPLN::vloz(unsigned int hodnotaBankovky, unsigned int pocet) {
	switch (hodnotaBankovky) {
	case 10:
		pocet10 += pocet;
		break;
	case 20:
		pocet20 += pocet;
		break;
	case 50:
		pocet50 += pocet;
		break;
	case 100:
		pocet100 += pocet;
		break;
	case 200:
		pocet200 += pocet;
		break;
	case 500:
		pocet500 += pocet;
		break;
	default:
		break;
	};
};

int BANKOMATOVA_NAPLN::vratPocet(unsigned int hodnota) {
	switch (hodnota) {
	case 10:
		return pocet10;
		break;
	case 20:
		return pocet20;
		break;
	case 50:
		return pocet50;;
		break;
	case 100:
		return pocet100;;
		break;
	case 200:
		return pocet200;
		break;
	case 500:
		return pocet500;
		break;
	default:
		return -99999;
		break;
	};
};
void BANKOMATOVA_NAPLN::vyberBankovku(unsigned int hodnotaBankovky, unsigned int pocet) {
	switch (hodnotaBankovky) {
	case 10:
		pocet10 -= pocet;
		break;
	case 20:
		pocet20 -= pocet;
		break;
	case 50:
		pocet50 -= pocet;
		break;
	case 100:
		pocet100 -= pocet;
		break;
	case 200:
		pocet200 -= pocet;
		break;
	case 500:
		pocet500 -= pocet;
		break;
	default:
		break;
	};
};

int BANKOMATOVA_NAPLN::vratPocetDruhovBankoviek() {
	return pocetDruhovBankoviek;
};

BANKOMATOVA_NAPLN & BANKOMATOVA_NAPLN::operator+=(BANKOMATOVA_NAPLN doplnujuca) {
	vloz(10, doplnujuca.vratPocet(10));
	vloz(20, doplnujuca.vratPocet(20));
	vloz(50, doplnujuca.vratPocet(50));
	vloz(100, doplnujuca.vratPocet(100));
	vloz(200, doplnujuca.vratPocet(200));
	vloz(500, doplnujuca.vratPocet(500));
	return *this;
	
}
*/

void SPRAVCA_BANKOVIEK::doplnitBankovky(ZOSTAVA_BANKOVIEK bankovky) {
	bankovkyBankomat.pocet10 += bankovky.pocet10;
	bankovkyBankomat.pocet20 += bankovky.pocet20;
	bankovkyBankomat.pocet50 += bankovky.pocet50;
	bankovkyBankomat.pocet100 += bankovky.pocet100;
	bankovkyBankomat.pocet200 += bankovky.pocet200;
	bankovkyBankomat.pocet500 += bankovky.pocet500;
}

void SPRAVCA_BANKOVIEK::odratatBankovky(ZOSTAVA_BANKOVIEK bankovky) {
	bankovkyBankomat.pocet10 -= bankovky.pocet10;
	bankovkyBankomat.pocet20 -= bankovky.pocet20;
	bankovkyBankomat.pocet50 -= bankovky.pocet50;
	bankovkyBankomat.pocet100 -= bankovky.pocet100;
	bankovkyBankomat.pocet200 -= bankovky.pocet200;
	bankovkyBankomat.pocet500 -= bankovky.pocet500;
}

unsigned int SPRAVCA_BANKOVIEK::vratPocetBankoviek(unsigned int hodnota) {
	switch (hodnota) {
	case 10:
		return bankovkyBankomat.pocet10;
		break;
	case 20:
		return bankovkyBankomat.pocet20;
		break;
	case 50:
		return bankovkyBankomat.pocet50;;
		break;
	case 100:
		return bankovkyBankomat.pocet100;;
		break;
	case 200:
		return bankovkyBankomat.pocet200;
		break;
	case 500:
		return bankovkyBankomat.pocet500;
		break;
	default:
		return -99999;
		break;
	};
}


BANKOMAT::BANKOMAT(SPRAVCA_UZIVATELOV *pUzivatelia0, ZOSTAVA_BANKOVIEK prvotnaNapln, double poplatok0){
	pUzivatelia = pUzivatelia0;
	poplatok = poplatok0;
	spravcaBankoviek.doplnitBankovky(prvotnaNapln);
	SystemovaSprava = "BANKOMAT vytvoreny";
}

bool BANKOMAT::doplnitBankomat(unsigned int ID, string pin0, ZOSTAVA_BANKOVIEK dopln0) {
	if (ID == 0) {
		if (pUzivatelia->overUzivatela(ID, pin0)) {
			spravcaBankoviek.doplnitBankovky(dopln0);
			SystemovaSprava = "Platny administrator, bankomat doplneny";
			return true;
		}
		else
		{
			SystemovaSprava = "Neplatny PIN administratora, bankomat nedoplneny";
			return false;
		}
	}
	else
	{
		SystemovaSprava = "Neplatne ID administratora, bankomat nedoplneny";
		return false;
	}
}

double BANKOMAT::zistitStavUctu(unsigned int ID, string pin0) {
	if (pUzivatelia->overUzivatela(ID, pin0)) {
		SystemovaSprava = "Platny uzivatel, vrateny stav uctu";
		return (pUzivatelia->vratUzivatela(ID, pin0)).zistitStavUctu();
	}
}

VYSLEDOK_VYBERU BANKOMAT::vybratPeniaze(unsigned int ID, string pin0, unsigned int suma) {
	// overit uzivatela
	// overit stav uctu
	// vytvorit objekt ZOSTAVA_BANKOVIEK
	// odratat peniaze zo stavu uctu
	double stavUctu;

	if (pUzivatelia->overUzivatela(ID, pin0)) {
		stavUctu = (pUzivatelia->vratUzivatela(ID, pin0)).zistitStavUctu();
		// if (stavUctu >= suma + poplatok) ide sa dalej
		if (stavUctu >= (suma + suma*poplatok)) {
			VYSLEDOK_VYBERU vysledok = algoritmusZostavyBankoviek(suma);
			if (vysledok.Status) {
				SystemovaSprava = "Peniaze vydane";
				// odratat mu sumu a poplatok
				(pUzivatelia->vratUzivatela(ID, pin0)).odratatZUctu(suma + suma*poplatok);
				// odratat bankovky z bankomatu
				spravcaBankoviek.odratatBankovky(vysledok.bankovky);
				return vysledok;
			}
			else
			{
				SystemovaSprava = "Bankomat nevie vydat pozadovanu sumu";
				VYSLEDOK_VYBERU vysledok;
				vysledok.Status = false;
				return vysledok;
			}
		}
		else
		{
			SystemovaSprava = "Malo penazi na ucte";
			VYSLEDOK_VYBERU vysledok;
			vysledok.Status = false;
			return vysledok;
		}
	}
	else
	{
		SystemovaSprava = "Neplatny uzivatel";
		VYSLEDOK_VYBERU vysledok;
		vysledok.Status = false;
		return vysledok;
	}
}

VYSLEDOK_VYBERU BANKOMAT::algoritmusZostavyBankoviek(unsigned int suma) {
	VYSLEDOK_VYBERU vysledok;
/*
	pocetNaVyber = suma0 % 500;
	if (pocetNaVyber > napln.vratPocet(500)) {
		suma0 -= napln.vratPocet(500) * 500;
		pole[0] = napln.vratPocet(500);
	}
	else {
		suma0 -= pocetNaVyber * 500;
		pole[0] = pocetNaVyber;
	}

	//============================================
	pocetNaVyber = suma0 % 200;
	if (pocetNaVyber > napln.vratPocet(200)) {
		suma0 -= napln.vratPocet(200) * 200;
		pole[1] = napln.vratPocet(200);
	}
	else {
		suma0 -= pocetNaVyber * 200;
		pole[1] = pocetNaVyber;
	}

	pocetNaVyber = suma0 % 100;
	if (pocetNaVyber > napln.vratPocet(100)) {
		suma0 -= napln.vratPocet(100) * 100;
		pole[2] = napln.vratPocet(100);
	}
	else {
		suma0 -= pocetNaVyber * 100;
		pole[2] = pocetNaVyber;
	}

	pocetNaVyber = suma0 % 50;
	if (pocetNaVyber > napln.vratPocet(50)) {
		suma0 -= napln.vratPocet(50) * 50;
		pole[3] = napln.vratPocet(50);
	}
	else {
		suma0 -= pocetNaVyber * 50;
		pole[3] = pocetNaVyber;
	}

	pocetNaVyber = suma0 % 20;
	if (pocetNaVyber > napln.vratPocet(20)) {
		suma0 -= napln.vratPocet(20) * 20;
		pole[4] = napln.vratPocet(20);
	}
	else {
		suma0 -= pocetNaVyber * 20;
		pole[4] = pocetNaVyber;
	}

	pocetNaVyber = suma0 % 10;
	if (pocetNaVyber > napln.vratPocet(10)) {
		suma0 -= napln.vratPocet(10) * 10;
		pole[5] = napln.vratPocet(10);
	}
	else {
		suma0 -= pocetNaVyber * 10;
		pole[5] = pocetNaVyber;
	}
	//=========================
	if (suma0 != 0) {
		return false;
	}
	else {
		//odcitaj z naplne pomocou pola
		//odcitaj sumu*poplatok z uctu uzivatela
	}
}
*/
	return vysledok;
}

string BANKOMAT::vypisatSystemovuSpravu(void) {
	return SystemovaSprava;
}

/*
bool BANKOMAT::vyber(UZIVATEL uzivatel, unsigned int suma0, string pin0) {
	int pocetNaVyber=0;
	int pole[5];
	if (uzivatel.vratPin() == pin0) {
		if (suma0*poplatok <= uzivatel.stavUctu()) {
			//ALGORITMUS NA VYBER BANKOVIEK
			pocetNaVyber = suma0 % 500;
			if (pocetNaVyber > napln.vratPocet(500)) {
				suma0 -= napln.vratPocet(500)*500;
				pole[0] = napln.vratPocet(500);
			}
			else {
				suma0 -= pocetNaVyber*500;
				pole[0] = pocetNaVyber;
			}
			
			//============================================
			pocetNaVyber = suma0 % 200;
			if (pocetNaVyber > napln.vratPocet(200)) {
				suma0 -= napln.vratPocet(200)*200;
				pole[1] = napln.vratPocet(200);
			}
			else {
				suma0 -= pocetNaVyber * 200;
				pole[1] = pocetNaVyber;
			}

			pocetNaVyber = suma0 % 100;
			if (pocetNaVyber > napln.vratPocet(100)) {
				suma0 -= napln.vratPocet(100)*100;
				pole[2] = napln.vratPocet(100);
			}
			else {
				suma0 -= pocetNaVyber * 100;
				pole[2] = pocetNaVyber;
			}

			pocetNaVyber = suma0 % 50;
			if (pocetNaVyber > napln.vratPocet(50)) {
				suma0 -= napln.vratPocet(50)*50;
				pole[3] = napln.vratPocet(50);
			}
			else {
				suma0 -= pocetNaVyber * 50;
				pole[3] = pocetNaVyber;
			}

			pocetNaVyber = suma0 % 20;
			if (pocetNaVyber > napln.vratPocet(20)) {
				suma0 -= napln.vratPocet(20)*20;
				pole[4] = napln.vratPocet(20);
			}
			else {
				suma0 -= pocetNaVyber * 20;
				pole[4] = pocetNaVyber;
			}

			pocetNaVyber = suma0 % 10;
			if (pocetNaVyber > napln.vratPocet(10)) {
				suma0 -= napln.vratPocet(10)*10;
				pole[5] = napln.vratPocet(10);
			}
			else {
				suma0 -= pocetNaVyber * 10;
				pole[5] = pocetNaVyber;
			}
		//=========================
			if (suma0 != 0) {
				return false;
			}
			else {
				//odcitaj z naplne pomocou pola
				//odcitaj sumu*poplatok z uctu uzivatela
			}
		}
		return false;
	}
	return true;
}
double BANKOMAT::stavUctu(UZIVATEL uzivatel, string pin0) {
	if (uzivatel.vratPin() == pin0) {
		return uzivatel.stavUctu();
	}
	return -99999;
}
*/