#include <stdio.h>     //включваме библиотека за стандартен в/и
#include <stdlib.h>    //стандартна библиотека (за exit())
#include <string.h>    //библиотека за низове
#include <conio.h>     //нестандартна библиотека за в/и

#define MAX 100

/* дефинираме структурите, които  ще	//
// пазят информация за				//
// отделните детайли                	*/

struct gallery {         	//дефинираме структура gallery
   char kod[11];			//структурата съдържа информация
   char title[31];		//за: код, име и фамилия на автор
   char name_author[21];	//на картината, както и
   char author_familia[21];	//нейната цена
   unsigned cena;
   } cat[MAX];	//Редовете в каталога не трябва да
			//превишават мексимума

/* дефиниране на функциите в програмата */

int menu(); // функция за менюто

/* следеващите 3 функции са взаимно свързани, //
// гланата функция е show(), a show_me //
// show_sort са вложени */

void show(int *top);    // служи за сортиране на елементите
void show_me();		// спомагателна функция
void show_sort(int i);	// спомагателна функция

void enter(int *top);	// функция за въвеждане
void display(int i);	// функция за извеждане на екрана (обвързана е с 
				// функцията title_search())
void save(char *filename, int *top); // функция за съхраняване във файл
void load(char *filename,int *top);  // функция за създаване на файл

void show_expensive_img(int *top); // показва най скъпата картина
void title_search(int *top);	   	// търси по име на картина

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_1 */
	retry_2: printf("Vavedi mesec: ");
    fflush(stdin);
	scanf("%d",&mesec);
	 if(mesec>31){
		printf("\nopitai pak!\n\n");
		goto retry_2;			/* ако е въведен некоректен месец */
	 }						/* ни връща отново на retry_2 */
	retry_3: printf("Vavedi godina: ");
    fflush(stdin);
	scanf("%d",&godina);
	if(godina<2007 || godina>2050){
		 printf("\nopitai pak!\n\n");
		 goto retry_3;			/* ако е въведен некоректна година */
	}						/* ни връща отново на 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;
  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. Suhrani promenite                   ||\n");
  printf("|| 6. Izhod                               ||\n");
  printf("||                                        ||\n");
  printf("||========================================||\n\n");
  do {
	  printf("Izberi: ");
	  fflush(stdin);
	  scanf("%d",&i);
  } while(i<1 || i>7);

 return i;
}

void enter(int *top)
{
  int i;
  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;
    }
        printf("Vavedi cena na kartinata: ");
		fflush(stdin);
        scanf("%s",&cat[i].cena);
  }
  *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;	// i обхожда редовете, n брои ASCII кодовете
	int p=0;	// брояч
	show_me();	// извежда резултатите ред по ред
	for(n=0;n<127;n++){ /* този цикъл го използвам да борои ASCII кодовете 
					и после имената картините ще се сравняват по
стойността на 1 им буква */
		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, kl;

  printf("Zaglavie: ");
  gets(title);
  kl=0;	// декларираме си ключ който ще приема 1/0 в зависимост  от резултата от търсенето
  for(i=0;i<*top;i++)	// top има стойността на i от функцията enter()
      if(!strcmp(title,cat[i].title)){ // срявнява за съвпадения в низа
          display(i);	// ако е маерен елемента викаме функцията за извеждане
          kl = 1;		// търсенето е дало резултат и ключа става 1 
          printf("\n");
      }
      if (!kl) 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");
	}
