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

#define MAX 1000


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

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

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

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

void display(int i);	// функция за извеждане на екрана (обвързана е с функцията title_search())
void show_expensive_img();	// показва най скъпата картина

void title_search();	// търси по име на картина
void enter();			// функция за въвеждане
void save();			// функция за съхраняване във файл
void load();			// функция за създаване на файл
void del();				// функция за изтриване

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

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

/* това са 2 глобални променливи */
int top=0; // сочи мястото, на което за последно е съхранявано информация
char filename[11];

void main()
{
  int choice;
  int den,mesec,godina;
  int top=0; // сочи мястото, на което за последно е съхранявал информация
  load(); //Служи за прочитане на каталога
  retry_1: printf("Vavedi den: ");
    scanf("%d",&den);
	fflush(stdin);
	 if(den>31){
		printf("\nopitai pak!\n\n");
		goto retry_1;
	 }
	retry_2: printf("Vavedi mesec: ");
    scanf("%d",&mesec);
	fflush(stdin);
	 if(mesec>31){
		printf("\nopitai pak!\n\n");
		goto retry_2;
	 }
	retry_3: printf("Vavedi godina: ");
    scanf("%d",&godina);
	fflush(stdin);
	 if(godina>2050){
		 printf("\nopitai pak!\n\n");
		 goto retry_3;
	 }

  /*използвам безкраен цикъл за показване на менюто*/
  
	 do {
    choice=menu();
    switch(choice) {
        case 1: enter(); break;				// Въвеждане на книги
        case 2: show_expensive_img(); break;// Показва автора с най-скъпата книга
        case 3: title_search(); break;		// Търси по име на картина
		case 4: show(); break;				// Сортира по име на картина
        case 5: del(); break;				// Изтриване на данните
        case 6: save();						// Съхранява промените във файла
      }
    } while(choice!=7);						// Ако потребителя въведе 7 => изход
 printf("Data:%d.%d.%d\n\n",den,mesec,godina); // извеждане на датата след приключване
exit(0);
}

/* функция меню */

int menu()
{
  int i;
  char str[20];
  printf("\nMenu:\n");
  printf("\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");
  printf("\n");

do {
      printf("Napravete izbora si: ");
      gets(str);	// Попълва низа
      i=atoi(str);	// Преобразуваа въведения низ от тип char в тип int
      printf("\n"); 
  } while(i<1 || i>7);

 return i;
}

/* функция за въвеждане на картини в базата данни */

void enter()
{
  int i;
  char temp[7];
  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 */

	/* Следващите цикли проветяват дали				 //
	// не е въдеден празен ред т.е. натиснат е 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 i,img,k;
  unsigned max=0;
  img=top;
  for(i=0,k=1;i<img;i++) {
      if(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 i,n;
	int p=0;
	show_me();

	/* сравняват се имената на картините по ASCII кодовете на 1 им буква */
	
	for(n=0;n<100;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){ // Извежда информацията за елементите на страници, ако саповече от 10
		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()
{
  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 del(){
	int j,del,i,n;
	
	fflush(stdin);
	printf("Iztrivane po ID:");
	scanf("%d",&del);
	fflush(stdin);
//printf("ID:%d",del);
	for(i=0,j=0;i<10;i++,j++){
	if(del==i) i++;
		printf("ID:%u%u",i,j);
		for(n=0;n<strlen(cat[i].kod);n++){
		temp[j].kod[n]=cat[i].kod[n];
		}
		for(n=0;n<strlen(cat[i].name_author);n++){
		temp[j].name_author[n]=cat[i].name_author[n];
		} 
		for(n=0;n<strlen(cat[i].title);n++){
		temp[j].title[n]=cat[i].title[n];
		}
		for(n=0;n<strlen(cat[i].author_familia);n++){
		temp[j].author_familia[n]=cat[i].author_familia[n];
		
		temp[j].cena=cat[i].cena;

		}
		
		printf("  %-10s || %-12s || %-10s || %-11s || %u\n",
		cat[i].kod,
		cat[i].title,
		cat[i].name_author,
		cat[i].author_familia,
		cat[i].cena);
		printf("temp  %-10s || %-12s || %-10s || %-11s || %u\n",temp[i].kod,temp[i].title,temp[i].name_author,temp[i].author_familia,temp[i].cena);		

	printf("%s\n",temp[i].kod);
	}

	for(i=0,j=0;i<10;i++,j++){
		printf("ID:%u%u",i,j);
		for(n=0;n<strlen(temp[i].kod);n++){
		cat[j].kod[n]=temp[i].kod[n];
		}
		for(n=0;n<strlen(cat[i].name_author);n++){
		cat[j].name_author[n]=temp[i].name_author[n];
		} 
		for(n=0;n<strlen(cat[i].title);n++){
		cat[j].title[n]=temp[i].title[n];
		}
		for(n=0;n<strlen(cat[i].author_familia);n++){
		cat[j].author_familia[n]=temp[i].author_familia[n];
		}
		
		cat[j].cena=temp[i].cena;

	
	}printf("%s\n",cat[del].kod);
	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 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()
{
 printf("\n");

 /* Цикъла ще сшре само, ако съдържанието на filename е 1 */
 while(1){
 printf("Zadajte ime na faila za baza dannite,\nprimer: database.txt:");
 gets(filename);
 if (*filename) break;}
 printf("\n");

 FILE *fp;
  
 /* Отваря се двоичен файл за четене */ 
 if ((fp=fopen(filename,"rb")) == NULL){		
       printf("Faila e uspeshno suzdaden!\n");
       printf("\n");
       return;
   }
 /* записваме броя на съществуващите елементи в поменливата top */
   if(fread(&top, sizeof top, 1 , fp)!=1){		
       printf("Greshka pri chetene.\nIzglejda faila e 0 bytes\n");
       printf("\n");
       exit(1);
   }

   if(fread(cat, sizeof cat, 1 , fp)!=1){
       printf("Greshka pri chetene na bazata danni.\n");
       printf("\n");
       exit(1);
   }
 /* затваряме файла */
 fclose(fp);
}

/* Съхранява файл */
void save()
{
 FILE *fp;
 /* Пише данните в двоичен файл */
   if((fp=fopen(filename,"wb")) == NULL) { 
       printf("Faila ne moje da bade otvoren\n");
       printf("\n");
       exit(1);
   }
   if(fwrite(&top, sizeof top, 1 , fp)!=1){
       printf("Greshka pri zapisa\n");
       printf("\n");
       exit(1);
   }
   if(fwrite(cat, sizeof cat, 1 , fp)!=1){
       printf("Greshka pri suhraniavaneto na baza dannite\n");
       printf("\n");
       exit(1);
   }
 /* затваряме файла */
 fclose(fp);
}