// inheritance FYLLADIO 5 , ASKHSH 3 C++ 2019-2020
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
#define N 10
#define M 100
#define L 70
class stock{
private:
	int code;
	int quantity;
	int date;
	int cost;
public:
	//default constructor
	stock()
	{code=0; quantity=0;date=110;cost=0;}

	void print()
	{cout<<code<<" "<<quantity<<" "<<date<<" "<<cost<<endl;
	}
	// constructor with parameters list
	stock(int in_code, int in_quantity, int in_date,
		int in_cost)
	{code=in_code;
	quantity=in_quantity; date=in_date; cost=in_cost;}


	int get_code() {return code;}
	int get_cost() {return cost;}
	int get_quantity() { return quantity;}

	bool valid_date(){
		int temp;
		temp=(date%100)*100+(date/100);
		if (temp>1219)  return false;
		else return true;
	}

}; // end class definition


class new_stock:public stock
{private:
	int expire_date;
	float pr_cost;
public :
	// default constructor
	new_stock():stock(),expire_date(1219),pr_cost(0.0)
	{};
	// constructor with parameters
	new_stock(int in_code, int in_quantity, int in_date,
		int in_cost, int in_expire_date, float in_pr_cost):
		stock(in_code, in_quantity, in_date,
		in_cost), expire_date(in_expire_date),
		pr_cost(in_pr_cost)
	{};

void print()
{
	cout<<"print inside derived class !!!!!"<<endl;
	stock::print();
	cout<<expire_date<<"  "<<pr_cost<<endl;
}


void expire(int c, int* q, float *ct)
{int temp;
		temp=(expire_date%100)*100+(expire_date/100);
		if (temp<=1219) 
			{ *q=get_quantity(); *ct=pr_cost;}
		else {*q=0; *ct=0.0;}
}

} ; // end new_stock definition


int main()
{
stock alfa[M];
new_stock beta[L];
int t1; float t2;
int in_code, in_quantity, in_date, in_cost;
int sum_quantity[N], sum_cost[N],sum_qt[N],sum1[N];
float sum2[N];
int code_array[N], code_array_counter=0,in_expire_date, in_pr_cost;

srand((unsigned int)time(0));

for (int i=0;i<N;i++)
{sum_quantity[i]=0; sum_cost[i]=0;sum_qt[i]=0;sum1[i]=0;sum2[i]=0.0;}

for (int i=0;i<M;i++) 

{ // RHTH KLHSH STON DEFAULT CONSTRUCTOR
alfa[i]=stock();
alfa[i].print();
}
cout<<"REAL DATA"<<endl;
// DATA INPUT + RHTH KLHSH STON CONSTRUCOTR ME LIST PARAMETERS
for (int i=0;i<M;i++)
{in_code=rand()%N +1;
in_quantity=rand()%1000;
in_date=(rand()%12+1)*100 +(rand()%10+10);
in_cost=rand()%150;

// RHTH KLHSH
alfa[i]=stock(in_code,in_quantity,in_date,in_cost);
alfa[i].print();

if (i<L)
{ in_expire_date=in_date+2;
in_pr_cost=rand()%50;
// RHTH KLHSH STON CONSTRUCTOR THS APORREOUSAS KLASHS
beta[i]=new_stock(in_code, in_quantity, in_date, in_cost, in_expire_date, in_pr_cost);
beta[i].print();
}


} // end for
// ERWTHMA 2 & 3
for (int i=0;i<M;i++)
{
sum_quantity[(alfa[i].get_code())-1]+=alfa[i].get_quantity();
sum_cost[(alfa[i].get_code())-1]+=alfa[i].get_cost(); 
 if (alfa[i].valid_date()) 
	sum_qt[(alfa[i].get_code())-1]+=alfa[i].get_quantity();
}
// print results
for (int i=0;i<N;i++)
cout<<i<<"  "<<sum_quantity[i]<<"    "<<sum_qt[i]<<"  "<<sum_cost[i]<<endl;
for (int i=0;i<N;i++)
{ if ((sum_quantity[i]-sum_qt[i])>0.5*sum_quantity[i])
		{	code_array[code_array_counter]=i;
			code_array_counter++;}
}

if (code_array_counter>0)
		for (int j=0; j<code_array_counter;j++)
			cout<<code_array[j]<<endl;

// ERWTHMA 5
for (int i=0;i<L;i++)
{beta[i].expire(beta[i].get_code(),&t1, &t2);
sum1[beta[i].get_code()-1]+=t1;
sum2[beta[i].get_code()-1]+=t2;
}
for (int i=0;i<N;i++)
cout<<sum1[i]<<"   "<<sum2[i]<<endl;

return 0;
} // end main

