// bank Account header
#include <iostream>
using namespace std;

class BankAccount
{
public:
	BankAccount();
	BankAccount(char *name, int AccountNumber, double balance);
	BankAccount(BankAccount&copy);

	void Deposit(double AMT);
	double Balance1();
	virtual	void WithDraw(double AMT);
	virtual	void ViewAccount();
	virtual	~BankAccount();


private:
	char *name;
	int AccountNumber;
	double Balance;

};

// bank Account cpp header


BankAccount::BankAccount()
{
}

BankAccount::BankAccount(char *name, int AccountNumber, double balance)
{
	int i = 0;
	while (name[i] != '\0')
	{
		this->name[i] = name[i];
	}
	this->name[i] = '\0';
	this->AccountNumber = AccountNumber;
	this->Balance = balance;

}
BankAccount::BankAccount(BankAccount&copy)
{
	int i = 0;
	while (name[i] != '\0')
	{
		this->name[i] = copy.name[i];
	}
	this->AccountNumber = copy.AccountNumber;
	this->Balance = copy.Balance;
}

void BankAccount::Deposit(double AMT)
{
	if (AMT < 0)
	{
		cout << "Invalid or negative amount. Payment canceled " << endl;

	}
	else
		Balance += AMT;
}

void BankAccount::WithDraw(double AMT)
{
	if (AMT < 0)
	{
		cout << "Invalid or negative amount. Payment canceled " << endl;
	}
	else if (AMT <= Balance)
	{
		Balance -= AMT;
	}
	else
	{
		cout << "There are not enough funds in your account " << endl;
	}
}

void BankAccount::ViewAccount()
{
	cout << "name: " << name << endl;
	cout << "balance: " << Balance << endl;
	cout << "AccountNumber: " << AccountNumber << endl;
}

double BankAccount::Balance1()
{
	return Balance;
}

BankAccount::~BankAccount()
{
	delete[] name;
}

using namespace std;

class BankAccountPlus:public BankAccount
{
private:
	double MaxLoan;
	double Rate;
	double OwesBank;

public:
	BankAccountPlus();
	BankAccountPlus(char *name, int AccountNumber, double Balance, double MaxLoan, double Rate);
	BankAccountPlus(const BankAccount&Balance1, double MaxLoan, double Rate);
	BankAccountPlus(BankAccountPlus&copy);


	virtual void ViewAccount();
	virtual void WithDraw(double AMT);
	virtual  ~BankAccountPlus();

	void StartLoan(double Maxloan1);
	void StartRate(double Rate1);
	void StartOwes();

};

BankAccountPlus::BankAccountPlus()
{

}

BankAccountPlus::BankAccountPlus(char *name, int AccountNumber, double Balance, double MaxLoan, double Rate) :BankAccount(name, AccountNumber, Balance)
{
	MaxLoan = MaxLoan;
	OwesBank = 0;
	Rate = Rate;
}

BankAccountPlus::BankAccountPlus(const BankAccount&Balance1, double MaxLoan, double Rate)
{
	this->MaxLoan = MaxLoan;
	this->Rate = Rate;
	this->OwesBank = 0;
}

BankAccountPlus::BankAccountPlus(BankAccountPlus&copy)
{
	this->MaxLoan = copy.MaxLoan;
	this->Rate = copy.Rate;
	this->OwesBank = copy.OwesBank;
}

void BankAccountPlus::ViewAccount()
{
	BankAccount::ViewAccount(); // przywolywanie elementow  z klasy bazowej
	cout << " Max debit is: " << MaxLoan << " PLN " << endl;
	cout << " Liabilities to the bank " << OwesBank << endl;
	cout << " Interest rate " << 100 * Rate << endl;
}

void BankAccountPlus::WithDraw(double AMT)
{
	double balance = Balance1();
	if (AMT < balance)
	{
		BankAccount::WithDraw(AMT);
	}
	else if (AMT <= balance + MaxLoan - OwesBank)
	{
		double more = AMT - balance;
		OwesBank += more*(1 + Rate);
		cout << " Real Loan: " << more << endl;
		cout << " interest: " << more*Rate << " zl" << endl;
		Deposit(more);
		BankAccount::WithDraw(AMT);

	}
	else
	{
		cout << " Your limit is overrated. Operation canceled " << endl;
	}


}

BankAccountPlus::~BankAccountPlus()
{
}

// MAIN 
#include <iostream>
#include <istream>
const int clients = 4;


using namespace std;
int main()
{
	char Name[50];
	int AccountNumber, choice;
	double Balance;

	BankAccount *P_Clients[clients];
	for (int i = 0; i < clients; i++)
	{
		cout << "Enter Basic Informations - including: Name, Account Number and Balance " << endl;
		system("cls");
		cout << "Name" << endl;
		cin >> Name;
		cout << "AccountNumber" << endl;
		cin >> AccountNumber;
		cout << "Balance " << endl;
		cin >> Balance;
		cout << " Which acccount would you choose  ? If you press 1 - Standrad Account If you press 2- LoAccount" << endl;
		cin >> choice;
		if (choice == 1)
		{
			P_Clients[i] = new BankAccount(Name, AccountNumber, Balance);
		}
		else if (choice == 2)
		{
			double Loan, RatePlus;
			cout << " eneter value of your max debit " << endl;
			cin >> Loan;
			cout << " enter interest rate | decimal format like: xx.zzz " << endl;
			cin >> RatePlus;
			P_Clients[i] = new BankAccountPlus(Name, AccountNumber, Balance, Loan, RatePlus);
		}
		cout << endl;

	}
	cout << "Show a member of bank." << endl;
	for (int i = 0; i<clients; i++)
	{
		P_Clients[i]->ViewAccount(); // wskazanie na informacje o danym czlonku ( w zaleznosci od wyboru konta  za pomoca -> ) // uzycie metody virtuanej 
		cout << endl;
	}
	for (int i = 0; i < clients; i++)
	{
		delete[] P_Clients[i]; // zwalanianie pamieci 
	}

	return 0;
}


