#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <ctype.h>
#include <math.h>
#include "databaze.h"

/* nazvy sloupcu */
/* podle nich se tez zjistuji skutecne indexy sloupcu */
/* (takze nemusi byt v databazi v tomto poradi) */
char *sloupec[32][64] = {"Příjmení", "Jméno", "Telefon", "Poznámka",
     "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
     "", "", "", "", "", "", "", "", "", "", "", "", ""};
int sirka_dtb = 4;

/* vrati 1 v pripade zmacknuti klavesy "A", jinak 0 */
int answer() {
    char klavesa;
    fflush(stdin);
    klavesa = tolower(getchar());
    if (klavesa == 'a') return 1;
    else return 0;
}
    
/* precte informace o dtb (pocet a nazvy sloupcu) */
void cti_info(tUkDtb UkDtb) {
    int i;
    sirka_dtb = UkDtb -> UkDtbHeader -> pocet;
    for (i = 0; i < sirka_dtb; i++) strcpy((char*)sloupec[i], (char*)UkDtb -> UkDtbHeader -> nazev[i]);
    return;
}

/* zobrazi informace o dtb */
void ukaz_info(tUkDtb UkDtb) {
    char *n[32];
    int i;
    printf("Informace o databazi:\n pocet sloupcu: %d, pocet radku: %d\n", UkDtb -> UkDtbHeader -> pocet, pocet_radku(UkDtb));
    printf(" sloupce: ");
    for (i = 0; i < UkDtb -> UkDtbHeader -> pocet; i++) {
        if (i > 0) printf("          ");
        printf("%d: %s [%d]\n", i, UkDtb -> UkDtbHeader -> nazev[i], UkDtb -> UkDtbHeader -> velikost[i]);
    }
    return;
}

/*  vypise seznam na obrazovku */
void vypis(tUkDtb UkDtb) {
    tUkPolozka Polozka;
    int i, j;
    printf("\nVypis databaze: (celkem %d polozek)\n", pocet_radku(UkDtb));

    Polozka = UkDtb -> Polozky;
    for (i = 0; i < pocet_radku(UkDtb); i++) {
        if ((i > 0) && (fmod(i, 23) == 0)) system("PAUSE");
        printf("%d: ", i+1); 
        for (j = 0; j < sirka_dtb; j++) {
            if (j > 0) printf(", ");
            printf("%s", cti_polozku(UkDtb, Polozka, hledej_sloupec(UkDtb, (char*)sloupec[j])));
        }
        printf("\n");
        Polozka = Polozka -> Next;
    }
    return;
}

/* smaze zaznam ze seznamu */
void smaz(tUkDtb UkDtb) {
     int cislo, i;
     tUkPolozka Polozka;
     vypis(UkDtb);
     printf("Zvolte cislo zaznamu, ktery chcete odstranit: ");
     scanf("%d", &cislo);
     if ((cislo > 0) && (cislo <= pocet_radku(UkDtb))) {
         Polozka = UkDtb -> Polozky;
         for (i = 1; i < cislo; i++) Polozka = Polozka -> Next;
         Polozka = smaz_radek(UkDtb, Polozka);
     }
     vypis(UkDtb);
     return;
}

/* upravi zvoleny zaznam */
void uprav(tUkDtb UkDtb) {
     char *vstup[500];
     int cislo, i, j;
     tUkPolozka Polozka;
     vypis(UkDtb);
     printf("Zvolte cislo zaznamu, ktery chcete upravit: ");
     scanf("%d", &cislo);
     if ((cislo > 0) && (cislo <= pocet_radku(UkDtb))) {
         Polozka = UkDtb -> Polozky;
         for (i = 1; i < cislo; i++) Polozka = Polozka -> Next;
         printf("\n%d: ", i);
         for (j = 0; j < sirka_dtb; j++) {
             if (j > 0) printf(", ");
             printf("%s", cti_polozku(UkDtb, Polozka, hledej_sloupec(UkDtb, (char*)sloupec[j])));
         }
         printf("\n");
         fflush(stdin);
         for (j = 0; j < sirka_dtb; j++) {
             printf("%s: ", sloupec[j]);
             gets((char*)vstup);
             if (cti_velikost(UkDtb, hledej_sloupec(UkDtb, (char*)sloupec[j])) < strlen((char*)vstup))
                 zmen_velikost(UkDtb, hledej_sloupec(UkDtb, (char*)sloupec[j]), strlen((char*)vstup));
             zapis_polozku(UkDtb, Polozka, hledej_sloupec(UkDtb, (char*)sloupec[j]), (char*)vstup);
         }
     }
     vypis(UkDtb);
     return;
}

/* ulozi dtb do souboru */
void uloz(tUkDtb UkDtb) {
    char *soubor[500];
    printf("Zadejte jmeno souboru: ");
    scanf("%s", soubor);
    printf("Ukladam do souboru %s ... ", soubor);
    if (uloz_dtb(UkDtb, (char*)soubor)) printf("\n! chyba pri zapisu do souboru %s.\n", soubor);
    else printf("ok.\n"); 
    return;
}

/* exportuje databazi do HTML v podobe tabulky */
void exportH(tUkDtb UkDtb) {
    char *soubor[128], *page[128];
    printf("Zadejte jmeno .HTML souboru: ");
    scanf("%s", soubor);
    fflush(stdin);
    printf("Zadejte nazev stranky: ");
    gets((char*)page);
    printf("\nExport databaze do souboru %s ... ", soubor);
    if (export_HTML(UkDtb, (char*)soubor, (char*)page)) printf("\n! chyba pri zapisu do souboru %s.\n"); 
    else printf("ok.\n");
    return;
}

/* exportuje databazi do CSV formatu */
void exportC(tUkDtb UkDtb) {
    char *soubor[128];
    printf("Zadejte jmeno .CSV souboru: ");
    scanf("%s", soubor);
    printf("\nExport databaze do souboru %s ... ", soubor);
    if (export_CSV(UkDtb, (char*)soubor, 1)) printf("\n! chyba pri zapisu do souboru %s.\n"); 
    else printf("ok.\n");
    return;
}

/* pripoji k dtb dalsi soubor */
void pripoj(tUkDtb UkDtb) {
    char *soubor[500];
    int pocet;
    printf("Zadejte jmeno souboru: ");
    scanf("%s", soubor);
    printf("Pripojuji k databazi soubor %s ... ", soubor);
    pocet = pripoj_dtb(UkDtb, (char*)soubor, 0);
    if (pocet == -1) printf("\n! chyba pri cteni ze souboru %s.\n", soubor);
    else printf("ok.\nVlozeno %d novych radku.", pocet);
    cti_info(UkDtb);
    return;
}

/* prida novy zaznam */
void pridej(tUkDtb UkDtb) {
    char *vstup[500];
    int j;
    tUkPolozka Polozka;
    printf("\nPridavani zaznamu");
    do {
          Polozka = vytvor_radek(UkDtb);
          if (Polozka == NULL) {
              printf("! chyba pri vytvareni noveho zaznamu");
              return;
          }
          printf("\n");
          fflush(stdin);
          for (j = 0; j < sirka_dtb; j++) {
              printf("%s: ", sloupec[j]);
              gets((char*)vstup);
              if (cti_velikost(UkDtb, hledej_sloupec(UkDtb, (char*)sloupec[j])) < strlen((char*)vstup))
                  zmen_velikost(UkDtb, hledej_sloupec(UkDtb, (char*)sloupec[j]), strlen((char*)vstup));
              zapis_polozku(UkDtb, Polozka, hledej_sloupec(UkDtb, (char*)sloupec[j]), (char*)vstup);
          }
          printf("Vytvorit dalsi kontakt? [A/N] ");
    } while (answer() != 0);
    return;
}

/* hleda zadany retezec v dtb */
void hledej(tUkDtb UkDtb) {
    char *text[128];
    int index, i, j;
    tUkPolozka Polozka;
    ukaz_info(UkDtb);
    printf("Ve kterem sloupci hledat? ");
    scanf("%d", &index);
    fflush(stdin);
    printf("Zadejte hledany text: ");
    gets((char*)text);
    printf("\nHledam \"%s\" ... ", text);
    Polozka = UkDtb -> Polozky;
    i = 0;
    while ((Polozka != NULL) && ((Polozka = hledej_radek(UkDtb, Polozka, index, (char*)text)) != NULL)) {
        printf("\n%d: ", ++i); 
        for (j = 0; j < sirka_dtb; j++) {
            if (j > 0) printf(", ");
            printf("%s", cti_polozku(UkDtb, Polozka, hledej_sloupec(UkDtb, (char*)sloupec[j])));
        }
        Polozka = Polozka -> Next;
    }
    if (i == 0) printf("shoda nenalezena.");
    printf("\n");
    system("PAUSE");
    return;
}

tUkDtb dtb(tUkDtb UkDtb) {
    char odpoved;
    while (odpoved != '0') {
        printf("\nSprava zaznamu:\n");
        printf("\
 [1] Vypis zaznamu\n\
 [2] Pridat zaznam\n\
 [3] Upravit zaznam\n\
 [4] Smazat zaznam\n\
 [5] Setrideni\n\
 [6] Hledat zaznam\n\
 [7] Zmensit velikost databaze\n\
\n\
 [0] Hlavni menu\n\
--------------------\n");
        printf("Vase volba? ");
        fflush(stdin);
        odpoved = getchar();
        switch (odpoved) {
            case '1':
                vypis(UkDtb);
                system("PAUSE");
                break;
            case '2':
                pridej(UkDtb);
                break;
            case '3':
                uprav(UkDtb);
                break;
            case '4':
                smaz(UkDtb);
                break;
            case '5':
                setrid_dtb(UkDtb, 1, 0);
                break;
            case '6':
                hledej(UkDtb);
                break;
            case '7':
                zmensi_dtb(UkDtb);
                ukaz_info(UkDtb);
                break;
            case '0':
                break;
            default:
                printf("! Zvlastni volba... nu coz :-)\n");
        }
    }
    return UkDtb;
}

tUkDtb otevri(char *soubor) {
    tUkDtb UkDtb;
    UkDtb = nacti_dtb((char*)soubor); 
/*    UkDtb = import_CSV((char*)soubor); */
    if (UkDtb == NULL) printf("! chyba pri otevirani souboru %s.\n", soubor);
    else {
        cti_info(UkDtb);
        ukaz_info(UkDtb);
        system("PAUSE");
    }
    return UkDtb;
}

tUkDtb import(void) {
    char *soubor[500];
    printf("Zadejte jmeno .CSV souboru: ");
    scanf("%s", soubor);
    tUkDtb UkDtb;
    UkDtb = import_CSV((char*)soubor, 1);
    if (UkDtb == NULL) printf("! chyba pri otevirani souboru %s.\n", soubor);
    else {
        cti_info(UkDtb);
        ukaz_info(UkDtb);
        system("PAUSE");
    }
    return UkDtb;
}

int main(int argc, char *argv[])
{
  tUkDtb TelefonniSeznam=NULL;
  tUkPolozka Polozka;
  char *soubor[500];
  char odpoved;
  int i;

  printf("Editor databaze (.DBS)\n======================\n\n");
  
  if (argc > 1)  {
  /* otevira soubor zadany jako parametr na prikazovem radku */
      strcpy((char*)soubor, argv[1]);
      TelefonniSeznam = otevri((char*)soubor);
  }
  while (odpoved != '0') {
        printf("\nHlavni nabidka programu:\n");
        if (TelefonniSeznam != NULL) printf(" [1] Sprava zaznamu\n");
        printf("\
 [2] Vytvorit novou databazi\n\
 [3] Otevrit databazi\n\
 [4] Import .CSV souboru\n\
 [5] Export do .CSV\n\
 [6] Export do HTML\n\
 [7] Ulozeni\n\
 [8] Pripojit databazi\n\
\n\
 [0] Konec\n\
-----------------------------\n");
        printf("Vase volba? ");
        fflush(stdin);
        odpoved = getchar();
        switch (odpoved) {
            case '1':
                if (TelefonniSeznam != NULL) TelefonniSeznam = dtb(TelefonniSeznam);
                else printf("! databaze neexistuje.");
                break;
            case '2':
                TelefonniSeznam = smaz_dtb(TelefonniSeznam);
                printf("* vytvarim novou databazi.\n");
                if ((TelefonniSeznam = nova_dtb()) == NULL) {
                    printf("! chyba pri vytvareni databaze.\n");
                } else for (i = 0; i < sirka_dtb; i++)
                    if (vytvor_sloupec(TelefonniSeznam, (char*)sloupec[i], 0, 8)) printf("! chyba pri vytvareni \"%s\"\n", sloupec[i]);
                break;
            case '3':
                TelefonniSeznam = smaz_dtb(TelefonniSeznam);
                printf("Zadejte jmeno souboru: ");
                scanf("%s", soubor);
                TelefonniSeznam = otevri((char*)soubor);
                break;
            case '4':
                TelefonniSeznam = smaz_dtb(TelefonniSeznam);
                TelefonniSeznam = import();
                break;
            case '5':
                exportC(TelefonniSeznam);
                break;
            case '6':
                exportH(TelefonniSeznam);
                break;
            case '7':
                uloz(TelefonniSeznam);
                break;
            case '8':
                pripoj(TelefonniSeznam);
                ukaz_info(TelefonniSeznam);
                break;
            case '0':
                TelefonniSeznam = smaz_dtb(TelefonniSeznam);
                break;
            default:
                printf("! Zvlastni volba... nu coz :-)\n");
        }
  }
  return 0;
  /* konec programu */
}
