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

#define MAX_ID_LETA 11
#define MAX_MESTO_POLASKA 4
#define MAX_MESTO_DOLASKA 4

typedef struct let_st {
    char id_leta[MAX_ID_LETA];
    char mesto_polaska[MAX_MESTO_POLASKA];
    char mesto_dolaska[MAX_MESTO_DOLASKA];
    int duzina;
    int broj_presedanja;
    struct let_st *levi;
    struct let_st *desni;
} LET;

void inicijalizacija(LET **pkoren);
LET *napravi_cvor(char *id_leta, char *mesto_polaska, 
                  char *mesto_dolaska, int duzina, int broj_presedanja);
void dodaj_u_stablo(LET **pkoren, LET *novi);
void ispisi_letove(LET *koren);
void obrisi_listu(LET **pkoren);

FILE *safe_fopen(char *ime, char *rezim, int kod_greske);
void ucitaj_letove(FILE *ulazna, LET **pkoren);

int main() {
    LET *koren;

    // printf("Pre: %p\n", koren);
    inicijalizacija(&koren);
    // printf("Posle: %p\n", koren);

    FILE *ulazna = safe_fopen("letovi.txt", "r", 2);
    ucitaj_letove(ulazna, &koren);
    fclose(ulazna);

    ispisi_letove(koren);

    obrisi_listu(&koren);

    return 0;
}

void inicijalizacija(LET **pkoren) {
    *pkoren = NULL;
}

LET *napravi_cvor(char *id_leta, char *mesto_polaska, 
                  char *mesto_dolaska, int duzina, int broj_presedanja) {
    LET *novi = (LET *)malloc(sizeof(LET));

    if(novi == NULL) {
        printf("Greska prilikom zauzimanja memorije!\n");
        exit(1);
    }

    strcpy(novi->id_leta, id_leta);
    strcpy(novi->mesto_polaska, mesto_polaska);
    strcpy(novi->mesto_dolaska, mesto_dolaska);
    novi->duzina = duzina;
    novi->broj_presedanja = broj_presedanja;
    novi->levi = NULL;
    novi->desni = NULL;

    return novi;
}

void dodaj_u_stablo(LET **pkoren, LET *novi) {
    if(*pkoren == NULL) {
        *pkoren = novi;
        return;
    }

    if(strcmp(novi->id_leta, (*pkoren)->id_leta) < 0) {
        dodaj_u_stablo(&(*pkoren)->levi, novi);
    } else {
        dodaj_u_stablo(&(*pkoren)->desni, novi);
    }
}

void ispisi_letove(LET *koren) {
    if(koren != NULL) {
        ispisi_letove(koren->levi);
        printf("%s %s %s %d %d\n", 
                koren->id_leta, koren->mesto_polaska,
                koren->mesto_dolaska, koren->duzina, koren->broj_presedanja
        );
        ispisi_letove(koren->desni);
    }
}

FILE *safe_fopen(char *ime, char *rezim, int kod_greske) {
    FILE *fp = fopen(ime, rezim);

    if(fp == NULL) {
        printf("Datoteka sa imenom %s nije uspesno otvorena!\n", ime);
        exit(kod_greske);
    }

    return fp;
}

void ucitaj_letove(FILE *ulazna, LET **pkoren) {
    char tmp_id_leta[MAX_ID_LETA];
    char tmp_mesto_polaska[MAX_MESTO_POLASKA];
    char tmp_mesto_dolaska[MAX_MESTO_DOLASKA];
    int tmp_duzina;
    int tmp_broj_presedanja;

    while(fscanf(ulazna, "%s %s %s %d %d",
                 tmp_id_leta,
                 tmp_mesto_polaska,
                 tmp_mesto_dolaska,
                 &tmp_duzina,
                 &tmp_broj_presedanja) != EOF) {
        LET *novi = napravi_cvor(
                tmp_id_leta, tmp_mesto_polaska, 
                tmp_mesto_dolaska, tmp_duzina, tmp_broj_presedanja
        );
        dodaj_u_stablo(pkoren, novi);
    }    
}

void obrisi_listu(LET **pkoren) {
    if(*pkoren != NULL) {
        obrisi_listu(&(*pkoren)->levi);
        obrisi_listu(&(*pkoren)->desni);
        free(*pkoren);
        *pkoren = NULL;
    }
}













