#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <process.h>

/*al tanto que si es vol començar una base de dades amb un arxiu buit, primer hem de posar la estructura "fi -333 1 1 1 "*/
/*o semblant, amb numClau=-333 , sinó no tira (bug)*/

/**********al tanto, pq l program funcioni haurem de posar fig.txt i egavga.bgi*/
/*al mateix directori des d'on executem figura.c*/



struct punt{
	int x;
	int y;
	};

struct figura{
	char nom [30];
	int color;
	int n_costats;
	struct punt punts [10];
	};


void guardarNova(void){

	char iarxiu[] = "fig.txt";
	char oarxiu[] = "fig_aux.txt";	

	struct figura nova;

	struct punt punts[10];	

	char nom[30];
	int numClau, n_costats;
	int n, auxNum = 0;

	FILE *ifitxer, *ofitxer;
	
	ifitxer = fopen(iarxiu,"r");
     	ofitxer = fopen(oarxiu,"w");

	printf("\n\tEntreu el nom de la figura:\n\t");
	scanf("%s",&nova.nom);
	
	while(numClau != -333){

		fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
		for(n = 0; n < n_costats; n++){
			fscanf(ifitxer, "%d", &punts[n].x);
			fscanf(ifitxer, "%d", &punts[n].y);
		}

		if(!strcmp(nova.nom, nom)){
			auxNum = 1;
			
		}		
	}
	

	fseek(ifitxer, 0, SEEK_SET);
	
	if(auxNum == 1){
		printf("\n\tError: Una figura amb aquest nom ja existeix.");
	}

	else{
		printf("\n\tEntreu el color de la figura: 0 negre, 1 blau, 2 verd, 3 cian,\n\t");
		printf("4 vermell, 5 magenta, 6 marro, 7 gris clar, 8 gris fosc, 9 blau\n\t");
		printf("clar, 10 verd clar, 11 cian clar, 12 vermell clar, 13 magenta\n\t");
		printf("clar, 14 groc, 15 blanc.\n\t");
		scanf("%d",&nova.color);
		printf("\n\tEntreu el nombre de costats (maxim 10) de la figura:\n\t");
		scanf("%d",&nova.n_costats);
		printf("\n\tEntreu els punts per parelles de valors:\n");
		for(n = 0; n < nova.n_costats; n++){
			scanf("\t%d\t",&nova.punts[n].x);
			if(n == nova.n_costats-1)printf("\n\tEntreu un nombre enter qualsevol.\n\t");
			scanf("\t%d\t",&nova.punts[n].y);
		}
		fflush(stdin);
		fprintf(ofitxer, "%s %d %d ", nova.nom, nova.color, nova.n_costats);
		
		for(n = 0; n < nova.n_costats; n++)fprintf(ofitxer, "%d %d ", nova.punts[n].x, nova.punts[n].y);

		}

		numClau = 0;

		while(numClau != -333){

			fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
		
			for(n = 0; n < n_costats; n++){
				fscanf(ifitxer, "%d", &punts[n].x);
				fscanf(ifitxer, "%d", &punts[n].y);
		}

		fprintf(ofitxer, "%s %d %d ", nom, numClau, n_costats);
		for(n = 0; n < n_costats; n++)fprintf(ofitxer, "%d %d ", punts[n].x, punts[n].y);
	
	
	}
	numClau = 0;
	fclose(ifitxer);
	fclose(ofitxer);
	printf("\n\tPremeu una tecla per continuar...\n\t");
	getch();

}


void modificar(char nomModificar[30]){

	char iarxiu[] = "fig.txt";
	char oarxiu[] = "fig_aux.txt";
	
	struct punt punts[10];	

	char nom[30], resposta[1];
	int numClau, n_costats;
	int n, auxNum = -333;

	FILE *ifitxer, *ofitxer;
	
	ifitxer = fopen(iarxiu,"r");
     	ofitxer = fopen(oarxiu,"w");

	while(numClau != -333){

		fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
		for(n = 0; n < n_costats; n++){
			fscanf(ifitxer, "%d", &punts[n].x);
			fscanf(ifitxer, "%d", &punts[n].y);
		}

		if(!strcmp(nom, nomModificar)){
			auxNum = numClau;
			numClau = -333;
		}		
	}
	fseek(ifitxer, 0, SEEK_SET);
	numClau = 0;
	if(auxNum == -333){
		printf("\n\tError: figura inexistent.");
		
		while(numClau != -333){

		fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
			for(n = 0; n < n_costats; n++){
				fscanf(ifitxer, "%d", &punts[n].x);
				fscanf(ifitxer, "%d", &punts[n].y);
			}
			fprintf(ofitxer, "%s %d %d ", nom, numClau, n_costats);
			for(n = 0; n < n_costats; n++)fprintf(ofitxer, "%d %d ", punts[n].x, punts[n].y);
		}
		printf("\n\tPremeu una tecla per continuar...\n\t");
		getch();
		
		
	}
	else{
		numClau = auxNum;
		printf("\n\tVoleu canviar el nom de la figura??(s/n)\n\t");
		scanf("%s", &resposta);
		if(!strcmp(resposta, "s")){
			printf("\n\tEntreu el nou nom de la figura:\n\t");
			scanf("%s",&nom);
		}
		printf("\n\tVoleu canviar el color de la figura??(s/n)\n\t");
		scanf("%s", &resposta);
		if(!strcmp(resposta, "s")){
			printf("\n\tEntreu el nou color de la figura: 0 negre, 1 blau, 2 verd, 3 cian,\n\t");
			printf("4 vermell, 5 magenta, 6 marro, 7 gris clar, 8 gris fosc, 9 blau\n\t");
			printf("clar, 10 verd clar, 11 cian clar, 12 vermell clar, 13 magenta\n\t");
			printf("clar, 14 groc, 15 blanc.\n\t");
			scanf("%d",&numClau);
		}
		printf("\n\tVoleu canviar numero i els costats de la figura??(s/n)\n\t");
		scanf("%s", &resposta);
		if(!strcmp(resposta, "s")){
			printf("\n\tEntreu el nou nombre de costats (maxim 10) de la figura:\n\t");
			scanf("%d",&n_costats);
			printf("\n\tEntreu els nous punts per parelles de valors:\n\t");
			for(n = 0; n < n_costats; n++){
				scanf("%d",&punts[n].x);
				scanf("%d",&punts[n].y);
			}

			
		}
		
		
		fprintf(ofitxer, "%s %d %d ", nom, numClau, n_costats);
		
		for(n = 0; n < n_costats; n++)fprintf(ofitxer, "%d %d ", punts[n].x, punts[n].y);	
		
		fseek(ifitxer, 0, SEEK_SET);

		while(numClau != -333){

		fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
			for(n = 0; n < n_costats; n++){
				fscanf(ifitxer, "%d", &punts[n].x);
				fscanf(ifitxer, "%d", &punts[n].y);
			}
	
			if(strcmp(nom, nomModificar)){
				fprintf(ofitxer, "%s %d %d ", nom, numClau, n_costats);
				for(n = 0; n < n_costats; n++)fprintf(ofitxer, "%d %d ", punts[n].x, punts[n].y);
			}		
		}
		printf("\n\n\tFigura modificada amb exit.\n");
		printf("\n\tPremeu una tecla per continuar...\n\t");
		getch();
	}	
	fclose(ifitxer);
	fclose(ofitxer);		

}


void eliminar(char nomEliminar[30]){

	struct punt punts[10];

	char iarxiu[] = "fig.txt";
	char oarxiu[] = "fig_aux.txt";
	char nom[30], resposta[1];
	int numClau, n_costats;
	int n, auxNum = 0;

	FILE *ifitxer, *ofitxer;

    	ifitxer = fopen(iarxiu,"r");
    	ofitxer = fopen(oarxiu,"w");

    	
	while(numClau != -333){

		fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
		for(n = 0; n < n_costats; n++){
			fscanf(ifitxer, "%d", &punts[n].x);
			fscanf(ifitxer, "%d", &punts[n].y);
		}

		if(strcmp(nom, nomEliminar)){
			fprintf(ofitxer, "%s %d %d ", nom, numClau, n_costats);
			for(n = 0; n < n_costats; n++)fprintf(ofitxer, "%d %d ", punts[n].x, punts[n].y);	
		}
		else{
			auxNum = 1;		

		}		
	}

	fclose(ifitxer);
	fclose(ofitxer);
	
	if(auxNum == 0){
		printf("\n\tError: Figura inexistent.");
		printf("\n\tPremeu una tecla per continuar...");
		getch();
	}
	else{
		printf("\n\tFigura esborrada amb exit.");
		printf("\n\tPremeu una tecla per continuar...");
		getch();
	}

}


void consultar(char nomConsultar[30]){

	struct punt punts[10];

	char iarxiu[] = "fig.txt";
	char nom[30];
	int numClau, n_costats;
	int n, auxNum = -333;

	FILE *ifitxer;

    	ifitxer = fopen(iarxiu,"r");

    		while(numClau != -333){

			fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
			for(n = 0; n < n_costats; n++){
				fscanf(ifitxer, "%d", &punts[n].x);
				fscanf(ifitxer, "%d", &punts[n].y);
			}	


			if(!strcmp(nom, nomConsultar)){
				auxNum = numClau;
				numClau = -333;
			}		
		}
		

		if(auxNum == -333){
			printf("\n\tError: figura inexistent.\n");
			fclose(ifitxer);
			printf("\n\tPremeu una tecla per continuar...\n\t");
			getch();	
		}
		else{
			numClau = auxNum;
			if(!strcmp(nom, nomConsultar)){
				printf("\n\n\n\t El nom de la figura es %s,", nom);
				printf("\n\t el color es el numero  %d,",numClau);
				printf("\n\t i te %d costats/vertex en els punts:\n", n_costats);
			
				for(n = 0; n < n_costats; n++)printf("\t %d %d ", punts[n].x, punts[n].y);
				printf("\n");
			}		
		

			fclose(ifitxer);
			printf("\n\tPremeu una tecla per continuar...\n\t");
			getch();
		}
}



void consultarTotes(void){

	struct punt punts[10];

	char iarxiu[] = "fig.txt";
	char nom[30];
	int numClau, n_costats;
	int n, m = 0;

	FILE *ifitxer;

    	ifitxer = fopen(iarxiu,"r");

    	while(numClau != -333){

		fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
		for(n = 0; n < n_costats; n++){
			fscanf(ifitxer, "%d", &punts[n].x);
			fscanf(ifitxer, "%d", &punts[n].y);
		}	
		if(numClau != -333){
			printf("\n\n\n\t La figura %s te el color %d i %d costats en els punts:\n", nom, numClau, n_costats);
			for(n = 0; n < n_costats; n++)printf("\t %d %d ", punts[n].x, punts[n].y);
			printf("\n");
			m++;
			if(m == 4){
				printf("\n\tPremeu una tecla per continuar...\n\t");
				getch();
				m = 0;
			}
		}			
		
	}
	fclose(ifitxer);
	printf("\n\tPremeu una tecla per continuar...\n\t");
	getch();
}


void visualitzar(char nomVisualitzar[30]){

	struct punt punts[10];

	char iarxiu[] = "fig.txt";
	char nom[30];
	int numClau, n_costats;
	int n, auxNum = -333;
	int vectorPunts[30];
	int targ, mode, m;

	FILE *ifitxer;

    	ifitxer = fopen(iarxiu,"r");

    	while(numClau != -333){

		fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
		for(n = 0; n < n_costats; n++){
			fscanf(ifitxer, "%d", &punts[n].x);
			fscanf(ifitxer, "%d", &punts[n].y);
		}	


		if(!strcmp(nom, nomVisualitzar)){
			auxNum = numClau;
			numClau = -333;
		}		
	}
		

	if(auxNum == -333){
		printf("\n\tError: figura inexistent.\n");
			
		printf("\n\tPremeu una tecla per continuar...\n\t");
		getch();	
	}
	else{
		numClau = auxNum;
		printf("%s %d %d ", nom, numClau, n_costats);


		punts[n_costats].x=punts[0].x;
		punts[n_costats].y=punts[0].y;

		for(n = 0; n < n_costats + 1; n++){
			vectorPunts[2*n] = punts[n].x;
			vectorPunts[2*n+1] = punts[n].y;
		}

		detectgraph(&targ,&mode);
		if (targ == -2)	{
			printf("\n\tError: no hi ha targeta grafica.");
			scanf("%d", &m);
				exit(0);
		}

		initgraph(&targ,&mode,"");
		if (graphresult())printf("%s",grapherrormsg(graphresult()));
			
		setcolor(numClau);
		drawpoly( n_costats+1, vectorPunts);
		getch();

		closegraph();
		restorecrtmode();
	}
	fclose(ifitxer);
}


void copiarArx(void){

	struct punt punts[10];

	char iarxiu[] = "fig_aux.txt";
	char oarxiu[] = "fig.txt";
	char nom[30];
	int numClau, n_costats;
	int n;

	FILE *ifitxer, *ofitxer;
	
    	ifitxer = fopen(iarxiu,"r");
    	ofitxer = fopen(oarxiu,"w");

    	while(numClau != -333){
		fscanf(ifitxer,"%s %d %d",&nom,&numClau, &n_costats);
		for(n = 0; n < n_costats; n++){
			fscanf(ifitxer, "%d", &punts[n].x);
			fscanf(ifitxer, "%d", &punts[n].y);
		}
		fprintf(ofitxer, "%s %d %d ", nom, numClau, n_costats);
		for(n = 0; n < n_costats; n++)fprintf(ofitxer, "%d %d ", punts[n].x, punts[n].y);
	}

	fclose(ifitxer);
	fclose(ofitxer);
}


void main(void){


	int tria = 0, n, triaCompr = 0;
	FILE *ifitxer, *ofitxer;

	char nom[30];

	do{
		clrscr();
		printf("\n\n\n\n\t1.-Crear una nova figura.\n");
		printf("\t2.-Modificar una figura existent.\n");
		printf("\t3.-Eliminar una figura ja creada.\n");
		printf("\t4.-Consultar una figura.\n");
		printf("\t5.-Consultar totes les figures.\n");
		printf("\t6.-Visualitzar una figura.\n");
		printf("\t7.-Sortir.\n\n");
		printf("\t(No entreu cap caracter que no sigui un nombre.)\n\n\n\t");
		tria = 0;
		
		scanf("%d",&tria);
		
		/*vigilar pq tria tingui valor entre 1 i 7*/
		triaCompr = 0;
		for(n = 1; n < 8; n++)if(tria == n)triaCompr = 1;
		if(triaCompr == 0)tria = 8;		


		switch(tria){
			case 1:
				guardarNova();	
				fflush(ifitxer);
				fflush(ofitxer);
				copiarArx();
				fflush(ifitxer);
				fflush(ofitxer);
				break;

			case 2:
				printf("\n\tQuin es el nom de la figura a modificar?\n\t");
				scanf("%s",&nom);
				modificar(nom);
				fflush(ifitxer);
				fflush(ofitxer);
				copiarArx();
				fflush(ifitxer);
				fflush(ofitxer);
				break;
		
			case 3:
				printf("\n\tQuin es el nom de la figura a eliminar?\n\t");
				scanf("%s",&nom);
				eliminar(nom);
  				fflush(ifitxer);
				fflush(ofitxer);
				copiarArx();
				fflush(ifitxer);
				fflush(ofitxer);
				break;

			case 4:
				printf("\n\tQuin es el nom de la figura a consultar?\n\t");
				scanf("%s",&nom);
				consultar(nom);
				fflush(ifitxer);
				break;

			case 5:
				consultarTotes();
				fflush(ifitxer);
				break;
			
			case 6:
				printf("\n\tQuin es el nom de la figura a visualitzar?\n\t");
				scanf("%s",&nom);
				visualitzar(nom);
				fflush(ifitxer);
				break;

			default:
				break;

		}
	}while (tria != 7);
}