#include <iostream.h>
#include <string.h>
#include <conio.h>

struct data { 						//dichiarazione struct data
	int giorno, mese, anno;
};

struct ora {                  //dichiarazione struct ora
	int minuti, ore;
};

struct scontrino {            //dichiarazione struct scontrino (contiene i dati dello scontrino
	unsigned int importo;
	data data;                 //data di emissione dello scontrino
	ora ora;                   //ora di emissione dello scontrino
	char causale[20];
};

scontrino scontrini[10];
int flag=0;                   //controlla se i dati degli scontrini sono già stati inseriti (1 = si, 0 = no)

void input_scontrini(); 		//lettura dati scontrini
void stampa_scontrino(int);   //stampa dati di uno scontrino
void scontrini_giorno();      //calcola quanti scontrini sono stati emessi in un determinato giorno
void data_scontrino();
void importo_alimenti();
int data_valida(int, int, int); //controlla se una data immessa è valida

int main(){
int esci=0;        				//determina l'uscita dal programma
while(esci==0){               //ciclo di visualizzazione menu di scelta
	clrscr();
	cout<<"\n\t\t\tGESTIONE SCONTRINI\n"<<endl;
	cout<<"1. Inserimento dei dati degli scontrini"<<endl;
	cout<<"2. Stampa del numero degli scontrini emessi in un determinato giorno"<<endl;
	cout<<"3. Stampa la data di emissione di uno scontrino dato l'importo e il genere"<<endl;
	cout<<"4. Stampa dell'importo totale speso in alimenti in un determinato mese"<<endl;
	cout<<"5. Esci dal programma"<<endl;
	cout<<"\nEffettua la tua scelta (1-5): ";
	int scelta;
	cin>>scelta;
	switch(scelta){
		case 1: input_scontrini(); break;
		case 2: scontrini_giorno(); break;
		case 3: data_scontrino(); break;
		case 4: importo_alimenti(); break;
		case 5: esci=1;
	}
}
return 0;
}

void input_scontrini(){
int valida=1;
for(int i=0; i<10; i++){
	clrscr();
	cout<<"SCONTRINO N° "<<(i+1)<<endl;
	cout<<"\n1) Inserire la data di emissione dello scontrino:\n\n";
	cout<<"   Giorno: "; cin>>scontrini[i].data.giorno;  //legge il giorno di emissione dello scontrino
	cout<<"   Mese: "; cin>>scontrini[i].data.mese;      //legge il mese di emissione dello scontrino
	cout<<"   Anno: "; cin>>scontrini[i].data.anno;      //legge l'anno di emissione dello scontrino
	valida=data_valida(scontrini[i].data.giorno, scontrini[i].data.mese, scontrini[i].data.anno);
	while(valida==1){
		cout<<"\nLa data inserita non è valida!!!\nReinserisci la data di emissione dello scontrino: \n\n";
		cout<<"   Giorno: "; cin>>scontrini[i].data.giorno;  //legge il giorno di emissione dello scontrino
		cout<<"   Mese: "; cin>>scontrini[i].data.mese;      //legge il mese di emissione dello scontrino
		cout<<"   Anno: "; cin>>scontrini[i].data.anno;      //legge l'anno di emissione dello scontrino
		valida=data_valida(scontrini[i].data.giorno, scontrini[i].data.mese, scontrini[i].data.anno);
	}
	cout<<"\n2) Inserire l'importo speso: ";
	cin>>scontrini[i].importo;                           //legge l'importo dello scontrino
	cout<<"\n3) Inserire la causale dello scontrino: \n"<<endl;
	cout<<"   1. Dischi"<<endl;
	cout<<"   2. Alimenti"<<endl;
	cout<<"   3. Abbigliamento"<<endl;
	cout<<"\n   Effettua la tua scelta (1-3): ";
	int scelta;
	cin>>scelta;                                     		//legge n° causale dello scontrino

	//assegna al campo "causale" la causale dello scontrino relativa al numero inserito
	switch (scelta){
		case 1: strcpy(scontrini[i].causale, "Dischi"); break;
		case 2: strcpy(scontrini[i].causale, "Alimenti"); break;
		case 3: strcpy(scontrini[i].causale, "Abbigliamento"); break;
	}
	flag=1;

}
}

void scontrini_giorno(){
	int valida=0;
	clrscr();
	int contatore=0;
	if(flag==1){
		data dd;       //struttura dati di tipo data contenente la data da controllare
		cout<<"Inserire la data da controllare: \n"<<endl;
		cout<<"Inserisci il giorno: ";
		cin>>dd.giorno;   //legge il giorno
		cout<<"Inserisci il mese: ";
		cin>>dd.mese;     //legge il mese
		cout<<"Inserisci l'anno: ";
		cin>>dd.anno;     //legge l'anno
		valida=data_valida(dd.giorno, dd.mese, dd.anno);
		while (valida==1){
			cout<<"\n\nLa data inserita non è valida!!!!\nReinserire la data da controllare: \n\n";
			cout<<"Giorno: ";
			cin>>dd.giorno;   //legge il giorno
			cout<<"Mese: ";
			cin>>dd.mese;     //legge il mese
			cout<<"Anno: ";
			cin>>dd.anno;     //legge l'anno
			valida=data_valida(dd.giorno, dd.mese, dd.anno);
		}
		for(int i=0; i<10; i++){
			if(scontrini[i].data.giorno==dd.giorno && scontrini[i].data.mese==dd.mese && scontrini[i].data.anno==dd.anno)
				contatore++;
		}
		cout<<"\nNel giorno immesso sono stati emessi "<<contatore<<" scontrini.\n"<<endl;
		cout<<"Premere un tasto per ritornare al menu principale...";
		getch();
	}
	else{
		cout<<"ERRORE!!"<<endl;
		cout<<"--------"<<endl;
		cout<<"Non sono ancora stati inseriti i dati degli scontrini!!!"<<endl;
		cout<<"Premere un tasto per tornare al menu principale...";
		getch();
	}
}

void data_scontrino(){
clrscr();
int importo, cont=0;
char causale[20];
if(flag==1){
	cout<<"Inserire l'importo dello scontrino da ricercare: ";
	cin>>importo;
	cout<<"Inserire la causale dello scontrino da ricercare: \n"<<endl;
	cout<<"   1. Dischi"<<endl;
	cout<<"   2. Alimenti"<<endl;
	cout<<"   3. Abbigliamento"<<endl;
	cout<<"\n   Effettua la tua scelta (1-3): ";
	int scelta;
	cin>>scelta;                                     		//legge n° causale dello scontrino
	switch (scelta){
		case 1: strcpy(causale, "Dischi"); break;
		case 2: strcpy(causale, "Alimenti"); break;
		case 3: strcpy(causale, "Abbigliamento"); break;
	}
	for(int i=0; i<10; i++){
		if(scontrini[i].importo==importo && strcmp(causale, scontrini[i].causale)==0 ){
			cont++;
			clrscr();
			cout<<"Scontrino trovato ("<<cont<<"):\n\n";
			stampa_scontrino(i);
			cout<<"\n\nPremere un tasto per continuare la ricerca...";
			getch();
		}
	}
	cout<<"\nNon sono stati trovati altri scontrini."<<endl;
	cout<<"Premere un tasto per tornare al menu principale...";
	getch();
}
else{
	cout<<"ERRORE!!"<<endl;
	cout<<"--------"<<endl;
	cout<<"Non sono ancora stati inseriti i dati degli scontrini!!!"<<endl;
	cout<<"Premere un tasto per tornare al menu principale...";
	getch();
}
}

void importo_alimenti(){
clrscr();
if(flag==1){
	int importo=0, mese, anno;
	cout<<"Inserire l'anno da controllare: ";
	cin>>anno;
	cout<<"Inserire il mese da controllare: ";
	cin>>mese;
	for(int i=0; i<10; i++){
		if(scontrini[i].data.mese == mese && scontrini[i].data.anno == anno && strcmp("Alimenti", scontrini[i].causale)==0 ){
			importo += scontrini[i].importo;
		}
	}
	cout<<"L'importo totale speso in alimenti è di "<<importo<<" euro"<<endl;
	cout<<"Premere un tasto per tornare al menu principale...";
	getch();
}
else{
	cout<<"ERRORE!!"<<endl;
	cout<<"--------"<<endl;
	cout<<"Non sono ancora stati inseriti i dati degli scontrini!!!"<<endl;
	cout<<"Premere un tasto per tornare al menu principale...";
	getch();
}
}

void stampa_scontrino(int n){
	cout<<"Data di emissione dello scontrino: ";
	cout<<scontrini[n].data.giorno<<"\\"<<scontrini[n].data.mese<<"\\"<<scontrini[n].data.anno<<endl;
	cout<<"Ora di emissione dello scontrino: "<<scontrini[n].ora.ore<<":"<<scontrini[n].ora.minuti<<endl;
	cout<<"Importo dello scontrino: "<<scontrini[n].importo<<endl;
	cout<<"Causale dello scontrino: "<<scontrini[n].causale<<endl;
}

int data_valida(int g, int m, int a){
	int max_giorni;
	if (m<1 || m>12) return 1; //se il mese passato come parametro non è valido restituisce 1
	else {
		if (a<0) return 1; //se l'anno passato come parametro non è valido restituisce 1
		else {
			switch(m){                //assegna a max_giorni il numero massimo di giorni del mese passato
				case 1: max_giorni=31; break;
				case 2: if ( (a%4) == 0) max_giorni=29;
						  else max_giorni=28;
						  break;
				case 3: max_giorni=31; break;
				case 4: max_giorni=30; break;
				case 5: max_giorni=31; break;
				case 6: max_giorni=30; break;
				case 7: max_giorni=31; break;
				case 8: max_giorni=31; break;
				case 9: max_giorni=30; break;
				case 10: max_giorni=31; break;
				case 11: max_giorni=30; break;
				case 12: max_giorni=31; break;
			}
			if (g<1 || g>max_giorni) return 1;	//se il giorno inserito non è valido restituisce 0
			else return 0;                      //altrimenti restituisce 1
		}
	}
}




