#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_LINE 200
#define MAX_RECORDS 1000

struct osoba
{
	char nazwisko[MAX_LINE];
	char imie[MAX_LINE];
	int wiek;
	float wzrost;
	struct osoba* nastepny;
};

typedef struct osoba OSOBA;

void wyswietl(OSOBA x)
{
	printf("Nazwisko: %s\n", x.nazwisko);
	printf("Imie: %s\n", x.imie);
	printf("Wiek: %d\n", x.wiek);
	printf("Wzrost: %f\n", x.wzrost);
}

/* Funkcja wczytuje linie tekstu do tablicy znakowej. */
char* czytaj_linie(char* napis, int n)
{
	fgets(napis, n, stdin);
	napis[strlen(napis) - 1] = '\0';
	return napis;
}

/* Funkcja zwraca liczbę float podaną przez użytkownika w treminalu */
float czytaj_liczbe()
{
	char linia[MAX_LINE];
	czytaj_linie(linia, MAX_LINE);
	return atof(linia);
}

OSOBA wczytaj()
{
	OSOBA x;
	printf("Nazwisko: ");
	czytaj_linie(x.nazwisko, MAX_LINE);
	printf("Imie: ");
	czytaj_linie(x.imie, MAX_LINE);
	printf("Wiek: ");
	x.wiek = (int)czytaj_liczbe();
	printf("Wzrost: ");
	x.wzrost = czytaj_liczbe();
	return x;
}

/* Funkcja wypisuje menu oraz zwraca wartosc wybrana przez uzytkownika */
int menu()
{
	printf("\n1. Wyswietl baze danych\n");
	printf("2. Dodaj rekord\n");
	printf("3. Usun rekord\n");
	printf("4. Edytuj rekord\n");
	printf("5. Zakoncz program\n");

	printf("Co wybrac? ");
	return (int)czytaj_liczbe();
}

int main()
{

	OSOBA* glowa = NULL;
	OSOBA* o;
	int n = 0;
	int i, k, wybor;

	do
	{
		wybor = menu();
		switch (wybor)
		{
			case 1:
				/* Wypianie calej bazy danych */
				printf("\nIlosc rekordow: %d\n", n);
				i = 0;
				for(o=glowa; o!= NULL; o=o->nastepny)
				{
					printf("\nRekodr nr %d\n", i++);
					wyswietl(*o);
				}
				break;

			case 2:
				/* Dodaj rekord */
				o = (OSOBA*)malloc(sizeof(OSOBA));
				if (!o) printf("Problem z przydzialem pamieci\n");
				else
				{
					*o = wczytaj();
					o->nastepny = glowa;
					glowa = o;
					n++;
				}
				break;

			case 3:
				/* Usun rekord */
				printf("Podaj numer rekordu do usuniecia (od 0 do %d): ", n-1);
				k = (int)czytaj_liczbe();
				if (k < 0 ||  k>=n)
				{
					printf("Zla wartosc %d\n", k);
					break;
				}

				if(k == 0 && glowa != NULL)
				{
					o = glowa;
					glowa = glowa->nastepny;
					free(o);
				}
				else
				{
					OSOBA *usuwana;
					o = glowa;
					for(i=0; i<k-1; i++) o=o->nastepny;
					usuwana=o->nastepny;
					o->nastepny = usuwana->nastepny;
					free(usuwana);
				}
				n--; 

				break;

			case 4:
				/* Edycja rekordu */
				printf("Podaj numer rekordu do edycji (od 0 do %d): ", n-1);
				k = (int)czytaj_liczbe();
				if ( k>= 0 && k< n )
				{

				}
				else printf("Nie ma takiego rekordu\n");

				break;
			case 5:
				break;

			default:
				printf("Nie wiem o co ci chodzi\n");
		}
	} while ( wybor != 5);


	o=glowa;
	while(o != NULL)
	{
		OSOBA* tmp = o;
		o=o->nastepny;
		free(tmp);
	}

	printf("Do widzenia\n");
}
