#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX 100

int menu(void);
void show(int *top);
void enter(int *top);
void display(int i);
void save(char *filename, int *top);
void load(char *filename,int *top);
void show_me();
void show_sort(int i);
void show_expensive_img(int *top);
void title_search(int *top);


struct gallery {
   char kod[11];
   char title[31];
   char name_author[21];
   char author_familia[21];
   unsigned cena;
   } cat[MAX];

void main()
{
  int choice,top;
  int den,mesec,godina;
  char filename;
  top=0;
  load(&filename,&top); //Служи за прочитане на структурата
  
	retry_1: printf("Vavedi den: ");
    fflush(stdin);
	scanf("%d",&den);
	 if(den>31){
		printf("\nopitai pak!\n\n");
		goto retry_1;
	 }
	retry_2: printf("Vavedi mesec: ");
    fflush(stdin);
	scanf("%d",&mesec);
	 if(mesec>31){
		printf("\nopitai pak!\n\n");
		goto retry_2;
	 }
	retry_3: printf("Vavedi godina: ");
    fflush(stdin);
	scanf("%d",&godina);
	 if(godina>2050){
		 printf("\nopitai pak!\n\n");
		 goto retry_3;
		 }
  do {
    choice=menu();
	switch(choice) {
		case 1: enter(&top); break; // Въвеждане на книги
        case 2: show_expensive_img(&top); break; // Показва автора с най-скъпата книга
        case 3: title_search(&top); break; // Търси по име на картина
		case 4: show(&top); break;
        case 5: save(&filename,&top); // Съхранява промените във файла
	  }
    } while(choice!=6);
 //printf("Data:%d.%d.%d\n\n",den,mesec,godina);
  exit(0);
}

/* Menu */

int menu(void)
{
  int i;
  char str[10];
  printf("\nMenu:\n\n");
  printf("||========================================||\n");
  printf("||                                        ||\n");
  printf("|| 1. Vuvejdane na novi kartini           ||\n");
  printf("|| 2. Pokaji avtora s nai-skapite kartini ||\n");
  printf("|| 3. Tursi po ime                        ||\n");
  printf("|| 4. Sortieane po azbuchen red           ||\n");
  printf("|| 5. Iztrivane                           ||\n");
  printf("|| 6. Suhrani promenite                   ||\n");
  printf("|| 7. Izhod                               ||\n");
  printf("||                                        ||\n");
  printf("||========================================||\n\n");
  do {
	  printf("Izberi: ");
	  gets(str);
	  i=atoi(str);
	  printf("\n");
  } while(i<1 || i>7);

 return i;
}

void enter(int *top)
{
  int i;
  char temp[7];
  //int i;
  //char temp[7]; /* Въвеждаме временната променлива temp,//
                //която ще съхранява максимално 6 цифрени//
                //суми */
  for(i=*top; i<MAX; i++) {
    printf("Vavdedi nomenklaturen kod na kartinata ili ENTER za izhod: \n");
    gets(cat[i].kod);
    if(!*cat[i].kod)
        break;       /* Тук се преустановява въвеждането,//
                     // ако е натиснат ENTER */
    while(1){
        printf("Vavedi ime na kartina: ");
        gets(cat[i].title);
        if(*cat[i].title) break;
    }
    while(1){
        printf("Vavedi ime na avtora: ");
        gets(cat[i].name_author);
        if(*cat[i].name_author) break;
    }
    while(1){
        printf("Vavedi familia na avtora: ");
        gets(cat[i].author_familia);
        if(*cat[i].author_familia) break;
    }
    while(1){
        printf("Vavedi cena na kartinata: ");
        gets(temp);
        cat[i].cena=(unsigned)atoi(temp);
        if(*temp) break;
    }
  }
  *top = i; /* Тук top показва на кой ред последно//
           //е записвал данни във файла */
}

void show_expensive_img(int *top) {
  int i,max,k;
  max=0;
  for(i=0,k=1;i<*top;i++) {
      if((unsigned)max<cat[i].cena) {
          max=cat[i].cena;
      k=i;}
  } printf("=====================================\n");
  printf(" Naj-skapata kartina e: %d leva\n",max);
  printf(" Avtora e: %s %s\n",cat[k].name_author,cat[k].author_familia);
  printf("=====================================\n");
}
//
void show(int *top){
	int i,n;
	int p=0;
	show_me();
	for(n=0;n<127;n++){
		for(i=0;i<*top;i++)
		{
		if(int(cat[i].title[0])==n){
		p++;
		printf("%d ",p);
		show_sort(i);
		printf("=======================================================================\n");
		if(i%10==0&&i!=0){
		printf("\nNatisnete Enter za da produljite......\n\n");getchar();
		fflush(stdin);
		}}}
	}
}
void show_me(){
	printf("\nID  kod:       || Ime:         || Avtor:     || Familia:    || Cena:\n");
	printf("=======================================================================\n");
}
void show_sort(int i){
    printf("  %-10s || %-12s || %-10s || %-11s || %u\n",
		cat[i].kod,
		cat[i].title,
		cat[i].name_author,
		cat[i].author_familia,
		cat[i].cena);
}

// Търсене по име на картина
void title_search(int *top)
{
  char title[31];
  int i, found;

  printf("Zaglavie: ");
  gets(title);
  found=0;
  for(i=0;i<*top;i++) // top има стойността на i от функцията enter()
      if(!strcmp(title,cat[i].title)){ // срявнява за съвпадения в низа
          display(i);
          found = 1;
          printf("\n");
      }
      if (!found) printf("Tyrseneto ne dade rezultati\n");
                  printf("\n");
}

/* Извеждане на екрана */
void display(int i)
{
    printf("\n");
    printf("||===================================\n");
    printf("|| Kod v database: %s\n", cat[i].kod);
    printf("|| Naimenovanie: %s\n", cat[i].title);
    printf("|| Ot avtor %s",cat[i].name_author);
    printf(" %s\n",cat[i].author_familia);
    printf("|| Cenata na kartinata e: %u leva\n",cat[i].cena);
    printf("||===================================\n");
}

void load(char *filename,int *top)
{
		FILE *fp;
	printf("Vavedete imeto na faila:");
	gets(filename);


	if ((fp=fopen(filename,"rb"))==NULL)
	{
		printf("Failat ne su6testvuva!\n");
	return;
	} else printf("Failut e uspeshno otvoren\n");
	if(fread(top, sizeof top, 1 , fp)!=1){
		printf("Greshka pri chetene na faila! \n");
		exit(1);
	}
	if(fread(cat, sizeof cat, 1 , fp)!=1){
		printf("Greshka pri chetene na faila!  \n");
		exit(1);
	}
	fclose(fp);
}
	void save(char *filename, int *top)
	{
	FILE *fp;

		if((fp=fopen(filename,"wb")) == NULL) {
			printf("Failut ne moze da se otvori! \n");
			exit(1);
		}
	if(fwrite(top, sizeof(top), 1 , fp)!=1){
		printf("Greshka pri chetene na faila! \n");
		exit(1);
	}
	if(fwrite(cat, sizeof cat, 1 , fp)!=1){
		printf("Greshka pri chetene na faila! \n");
		exit(1);
	}

	fclose(fp);
	printf("Failat e zapazen uspe6no!\n");
	}