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

typedef struct
{
	int i;
	char S[30];
} Kirje;

int fileExist (char *filename); // kontrollib faili olemasolu
int howManyLines(char *failiNimi); // loeb ära mitu rida failis on
void kirjedSisse (Kirje **, char *filename); // loeb andmed sisse
void sort (Kirje *nimekiri, int T); // sorteerib andmed
void valjastus (Kirje *nimekiri, int T); // väljastab sorteeritud andmed

int main ()
{
	// kontrollib faili olemasolu, kui ei eksisteeri siis lõpetab programm töö
	if (fileExist ("E1.txt") != 0) 
	{
		printf ("Faili ei asu programmiga samas kaustas");
		return 1;
	}

	int T;
	T = howManyLines ("E1.txt"); // loeb ära read failis

	Kirje nimekiri[T]; // massiiv andmete hoidmiseks
	Kirje *kirjeviit = nimekiri;

	kirjedSisse (&kirjeviit, "E1.txt"); // loeb sisse andmed

	sort (nimekiri, T); // sorteerib
	valjastus (nimekiri, T); // väljastab tulemused faili ja ekraanile

	return 0;
}

int fileExist (char *filename)
{
	FILE *fp;
	fp = fopen (filename, "r");

	if (fp == NULL)
	{
		return 1;
	}
	else
	{
		fclose (fp);
		return 0;
	}
}

int howManyLines(char *failiNimi)
{
	FILE *data;
	data = fopen (failiNimi, "r");

	int c = 0;
	int read = 0;

	while ((c = fgetc(data)) != EOF)
	{
		if (c == '\n')
			read++;
	}
	fclose(data);

	if (read == 0)
	{
		printf ("Fail %s on tühi", failiNimi);
		return 1;
	}
	else
	{
		return read;
	}
}

void kirjedSisse (Kirje **kirjeviit, char *filename)
{
	int i = 0; // loendurid
	int j;

	FILE *fp; // avab faili, mille nimi anti kaasa
	fp = fopen (filename, "r");

	// loeb sisse andmed failist
	while (fscanf (fp, "%d %s", &(*kirjeviit + i)->i, (*kirjeviit +i)->S) != EOF)
	{
		i++;
	}
	fclose (fp);

	// väljastab tulemused ekraanile
	for (j = 0; j < i; j++)
	{
		printf ("%d, %s\n", (*kirjeviit + j)->i, (*kirjeviit + j)->S);
	}
	printf ("\n");
}

void sort (Kirje *nimekiri, int T)
{
	int i, j;
	Kirje temp;

	for (i = 0; i < T; i++)
	{
		for (j = 1; j < T; j++)
		{
			if (nimekiri[j-1].i > nimekiri[j].i) // kui eelnev fail on suurem, vahetab kohad
			{
				temp = nimekiri[j];
				nimekiri[j] = nimekiri[j-1];
				nimekiri[j-1] = temp;
			}
			else if (nimekiri[j-1].i == nimekiri[j].i) 
			{ // kui arvud on võrdsed kontrollib tähestikulist järjestust ja vajadused vahetab kohad
				if (strcmp (nimekiri[j-1].S, nimekiri[j].S) > 0) 
				{
					temp = nimekiri[j];
					nimekiri[j] = nimekiri[j-1];
					nimekiri[j-1] = temp;
				}
			}
		}
	}
}

void valjastus (Kirje *nimekiri, int T)
{
	int i;
	FILE *output; // loob faili
	output = fopen ("E2.txt", "w");

	for (i = 0; i < T; i++)
	{
		fprintf (output, "%d, %s\n", nimekiri[i].i, nimekiri[i].S);
		printf ("%d, %s\n", nimekiri[i].i, nimekiri[i].S);
	}
}