// By Dede 

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


typedef struct macchina
{
       char targa[7];
       int km_percorsi;
       float costo_km;
       char data[8];
       struct macchina *next;
} car;


// ROUTINE DI GESTIONE DEGLI ERRORI
void GestioneErrori(int ErrCode)
{
	switch(ErrCode)
	{
		case 1:
			printf("Bisogna passare il nome del file come argomento.\n");
		break;
		
		case 2:
			printf("Si č verificato un errore nell'apertura del file.\n");
		break;	
	}
	
	exit(ErrCode);
}


// Alloca lo spazio necessario per un nuovo nodo; usata nella creazione della lista
car *newnode()
{
	return(car *)malloc(sizeof(car));
}


// Funzione per la creazione della lista
car *crea_lista(char *store)
{
	car *lis, *p, *last;
	FILE *fp;
	
	if((fp = fopen(store,"r")) == NULL)
			GestioneErrori(2);
			
	// PRIMO NODO
	last = newnode();		
	if(fscanf(fp,"%s %d %f %s ",&last->targa,&last->km_percorsi,&last->costo_km,&last->data) != EOF)
	{
		lis = last;
		last->next= NULL;	
	}
	else
		lis = NULL;		// CASO DI LISTA VUOTA
	
	// NODI SUCCESSIVI
	p = newnode();
	while (fscanf(fp,"%s %d %f %s ",&p->targa,&p->km_percorsi,&p->costo_km,&p->data) != EOF)
	{
			p->next =NULL;
			last->next=p;
			last=p;
			p = newnode();	
	}
	
	free(p);
fclose(fp);
return(lis);
}
	

// Funzione per la ricerca dell'auto con meno km percorsi
car *min_km(car *lis)
{
	car *temp;
	int min;
	min = lis->km_percorsi;  // imposto la prima come minimo
	temp = lis;
	lis = lis->next;		
	while (lis != NULL)		// scorro la lista dal secondo
	{
		if (lis->km_percorsi < min) 	// se auto corrente ha meno km di min...
			temp = lis;									// ...la imposto come nuovo minimo
		lis = lis->next;
	}	
	return temp;
}


// Funzione per la ricerca dell'auto pių remunerativa
car *max_guadagno(car *lis)
{
	car *temp;
	float max, a;
	max = (lis->km_percorsi * lis->costo_km); // imposto la prima come max
	temp = lis; 
	lis = lis->next;	
	while (lis != NULL)			// scorro la lista dal secondo
	{
		a = lis->km_percorsi * lis->costo_km;
		if (a > max) 												// se auto corrente rende pių di max...
			temp = lis;												// ...la imposto come nuovo max
		lis = lis->next;
	}	
	return temp;	
}


// stampa un elemento di tipo car
void stampa_elemento(car *elem, FILE *fp)
{
		fprintf(fp,"----------------------------\n");
		fprintf(fp,"Targa: %s\n", elem->targa);
		fprintf(fp,"Km: %d\n", elem->km_percorsi);
		fprintf(fp,"Costo al Km: %.2f\n", elem->costo_km);
		fprintf(fp,"Ultima riconsegna: %s\n", elem->data);
		fprintf(fp,"----------------------------\n");
}


// stampa l'intera lista di auto disponibili
// (non richiesta dal programma ma usata in fase di sviluppo)
void stampa_lista(car *lis, FILE *fp)
{

	while (lis != NULL)
	{
		stampa_elemento(lis,fp);
		lis = lis->next;
	}

} 


// Stampa il manu all'utente per la selezione dell'operazione
void stampa_menu()
{
printf("\n+--------------------------------------+\n");
printf("|     MENU DI SELEZIONE OPERAZIONI     |\n");
printf("+--------------------------------------+\n");
printf("|  1) Ricerca veicolo con meno km      |\n");
printf("|  2) Ricerca veicolo pių remunerativo |\n");
printf("|  3) Termina programma                |\n");
printf("+--------------------------------------+\n");
}


// MAIN
main(int argc, char *argv[])
{
car *lista;
int scelta;

	if (argc != 2)
		GestioneErrori(1);

// creo la lista con i dati delle auto		
lista = crea_lista(argv[1]);

/*ciclo do-while che presenta continuamente il menu all'utente
fino a quando non sceglie di terminare il programma */ 
do
{
	stampa_menu();
	printf("Seleziona operazione richiesta: ");
	scanf("%d",&scelta);				// operazione richiesta
	
	switch(scelta) 
	{
		case 1:
					printf("\nIl veicolo ricercato č il seguente:\n");
					stampa_elemento(min_km(lista),stdout);	
		break;
		
		case 2:
					printf("\nIl veicolo ricercato č il seguente:\n");
					stampa_elemento(max_guadagno(lista),stdout);	
		break;
		
		case 3:
					printf("\nPROGRAMMA TERMINATO. Bye Bye\n");
		break;
		
		default:
				printf("Il numero inserito non corrisponde a nessuna operazione valida.\n");
		break;	
	}
	
}while ( scelta != 3);


} // FINE MAIN
