#include<iostream.h>
#include<iomanip.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

#define MAT	9
#define STR	15
#define MAX	10

#define ESTA_PORTAGEM	"Portagem_1"

struct DATA{
	int dia,mes,ano;
};
struct VIATURA{
	char matricula[MAT];
	char tipo;
};
struct PRECO{
	char portagem_1[STR];
	char portagem_2[STR];
	float custo_tipo_A;
	float custo_tipo_B;
	float custo_tipo_C;
};
struct DIVIDA{
	char matricula[MAT];
	char portagem[STR];
	DATA data;
	float valor;
};

int val_aleatorio(int , int );

void preencher_lista_viatura(VIATURA lv[],int &llv);
void fazer_matricula(char *);
void listar_lista_viatura(VIATURA lv[],int llv);

void preencher_lista_preco(PRECO lp[]);
void listar_lista_preco(PRECO lp[]);


void listar_lista_divida(DIVIDA ld[],int lld);

void sistema(char *m, char &t, char *p);
void data2str(DATA &d, char *str);

int procurar_port_lista_preco(PRECO lp[], char *p1,char *p2);
int procura_mat_lista_viatura(VIATURA lv[],int llv, char *mat);
void inserir_lista_divida(DIVIDA ld[],int &lld, char *por, char *mat, float custo);
void calcular_valor_a_pagar(PRECO lp[],DIVIDA ld[],int &lld,VIATURA lv[],int llv, char *mat,char tp, char *p);

void main()
{
	srand(time(NULL));
	char mat[MAT], tp, portagem_entrada[STR];
	PRECO lista_preco[10];
	VIATURA lista_viatura[MAX];
	int len_lista_viatura=0;
	DIVIDA lista_divida[MAX];
	int len_lista_divida=0;

	/*Nao era necessário*/
	preencher_lista_viatura(lista_viatura,len_lista_viatura);
	/*Nao era necessário*/
	listar_lista_viatura(lista_viatura,len_lista_viatura);
	/*Nao era necessário*/
	preencher_lista_preco(lista_preco);
	/*Nao era necessário*/
	listar_lista_preco(lista_preco);
	/*Nao era necessário*/
	sistema(mat,tp,portagem_entrada);

	calcular_valor_a_pagar(lista_preco,lista_divida,len_lista_divida,lista_viatura,len_lista_viatura,mat,tp,portagem_entrada);

	/*Nao era necessário*/
	listar_lista_divida(lista_divida,len_lista_divida);
	
	
}
/*Nao era necessário*/
int val_aleatorio(int min, int max)
{
	return (min+(1.0 * rand()/RAND_MAX)*(max-min));
}
/*Nao era necessário*/

void fazer_matricula(char * mat)
{
	for(int i=0;i<MAT;i++){
		switch(i){
			/* numeros*/
			case 0:
			case 1:
			case 6:
			case 7:mat[i]=val_aleatorio(48,57);
				break;

			case 2:
			case 5:mat[i]='-';
				break;
				/* letras*/
			case 3:
			case 4:mat[i]=val_aleatorio(65,90);
				break;
			case 8:mat[i]='\0';
				break;
		}
	}
}
/*Nao era necessário*/

void preencher_lista_viatura(VIATURA lv[],int &llv)
{
	llv=val_aleatorio(5,MAX);
	for(int i=0;i<llv;i++){
		fazer_matricula(lv[i].matricula);
		lv[i].tipo=val_aleatorio(65,67);
	}
}
/*Nao era necessário*/

void listar_lista_viatura(VIATURA lv[],int llv)
{
	cout<<setw(MAT+2)<<"Matricula"<<setw(5)<<"Tipo"<<endl;
	for(int i=0;i<llv;i++){
		cout<<setw(MAT+2)<<lv[i].matricula<<setw(5)<<lv[i].tipo<<endl;
	}
}
int procura_mat_lista_viatura(VIATURA lv[],int llv, char *mat)
{
	for(int i=0;i<llv;i++){
		if(strcmp(lv[i].matricula,mat)==0)
			return i;
	}
	return -1;
}
/*Nao era necessário*/

void preencher_lista_preco(PRECO lp[])
{
	int x=0;
	for(int i=0;i<5;i++){
		for(int j=i+1;j<5;j++){
			sprintf(lp[x].portagem_1,"Portagem_%d",i+1);
			sprintf(lp[x].portagem_2,"Portagem_%d",j+1);
			lp[x].custo_tipo_A=val_aleatorio(5, 10);
			lp[x].custo_tipo_B=lp[x].custo_tipo_A * 1.2;
			lp[x].custo_tipo_C=lp[x].custo_tipo_B * 1.2;
			x++;
		}
	}
}
/*Nao era necessário*/

void listar_lista_preco(PRECO lp[])
{
	cout<<setw(STR+2)<<"Portagem"<<setw(STR+2)<<"Portagem"<<setw(8)<<"Tipo A"<<setw(8)<<"Tipo B"<<setw(8)<<"Tipo C"<<endl;
	for(int i=0;i<10;i++){
		cout<<setw(STR+2)<<lp[i].portagem_1<<setw(STR+2)<<lp[i].portagem_2<<setw(8)<<lp[i].custo_tipo_A<<setw(8)<<lp[i].custo_tipo_B<<setw(8)<<lp[i].custo_tipo_C<<endl;
	}
}

int procurar_port_lista_preco(PRECO lp[], char *p1,char *p2)
{
	for(int i=0;i<10;i++){
		if(	strcmp(p2,p1)!=0 &&
			(strcmp(lp[i].portagem_1,p1)==0 || strcmp(lp[i].portagem_1,p2)==0) &&
			(strcmp(lp[i].portagem_2,p1)==0 || strcmp(lp[i].portagem_2,p2)==0) ){
			return i;
		}
	}
	return -1;
}
/*Nao era necessário*/
void sistema(char *m, char &t, char *p)
{
	fazer_matricula(m);
	t=val_aleatorio(65,67);
	sprintf(p,"Portagem_%d",val_aleatorio(2,5));
}

void inserir_lista_divida(DIVIDA ld[],int &lld, char *por, char *mat, float custo)
{
	time_t tempo;
	struct tm *hoje;
	time(&tempo); //retorna o nş de segundos desde as 00:00:00 de 1 de Janeiro de 1970
	hoje=localtime(&tempo);
	if(lld<MAX){
		strncpy(ld[lld].matricula,mat,MAT);
		strncpy(ld[lld].portagem,por,STR);
		ld[lld].data.dia=hoje->tm_mday;
		ld[lld].data.mes=hoje->tm_mon+1;
		ld[lld].data.ano=hoje->tm_year+1900;
		ld[lld].valor=custo;
		lld++;
	}
}
/*Nao era necessário*/
void data2str(DATA &d, char *str)
{
	sprintf(str,"%d-%d-%d",d.dia,d.mes,d.ano);
}
/*Nao era necessário*/
void listar_lista_divida(DIVIDA ld[],int lld)
{
	char dt[11];
	cout<<"\nDividas"<<endl;
	cout<<setw(STR+2)<<"Portagem"<<setw(MAT+2)<<"Matricula"<<setw(12)<<"Data"<<setw(12)<<"Valor"<<endl;
	for(int i=0;i<lld;i++){
		data2str(ld[i].data,dt);
		cout<<setw(STR+2)<<ld[i].portagem<<setw(MAT+2)<<ld[i].matricula<<setw(12)<<dt<<setw(12)<<ld[i].valor<<endl;
	}
}

void calcular_valor_a_pagar(PRECO lp[],DIVIDA ld[],int &lld,VIATURA lv[],int llv, char *mat,char tp, char *p)
{
	int i,j;
	float custo;
	j=procurar_port_lista_preco(lp,ESTA_PORTAGEM,p);
	switch(tp){
		case 'A': custo=lp[j].custo_tipo_A;
			break;
		case 'B': custo=lp[j].custo_tipo_B;
			break;
		case 'C': custo=lp[j].custo_tipo_C;
			break;

	}
	i=procura_mat_lista_viatura(lv,llv,mat);
	if(i!=-1){
		cout<<"Custo: "<<custo;
	}
	else{
		inserir_lista_divida(ld,lld,p,mat,custo);
	}
}
