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


#define MAX 1000

int menu();
int podmenu();
void display(int i);
void show_expensive_img();
void title_search();
void enter();
void save();
void load();
void del_all();
void show();
void show_me();
void show_sort(int i);


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

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

void main()
{
  //char date[11];
  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_all(); break;// Изтриване на данните
        case 6: save(); // Съхранява промените във файла
      }
    } while(choice!=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;
}

// Подменю
int podmenu()
{ int i;
  char str[41];
    printf("\n");
    printf("||==========================================||\n");
    printf("||                                          ||\n");
    printf("|| 1. Iztrivane                             ||\n");
    printf("|| 2. Vrashtane kam glavnoto menu           ||\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>3);
 return i;
}

//Въвеждане на картини в базата данни
void enter()
{
  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 i,img,max,k;
  char str[21];
  img=top;
  max=0;
  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;
	show_me();
	for(n=0;n<100;n++){
		for(i=0;i<top;i++)
		{
		if(int(cat[i].title[0])==n){
		show_sort(i);
		printf("=======================================================================\n");
		if(i%5==0&&i!=0){
		printf("Obshto artikuli %d\n\n",i);
		printf("Natisnete Enter za da produljite......\n\n");getchar();
		fflush(stdin);
		}}}
	}
}
void show_me(){
	printf("\nID nomer:       || Ime:         || Avtor:     || Familia:    || Cena:\n");
	printf("=======================================================================\n");
}
void show_sort(int i){
    printf("%-15s || %-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");
}

// del
void del_all(){
}

//Извеждане на екрана
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");
 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;
   }
   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); // затваря файла
}