/**
 * File:		andmebaas1.c
 * Author:		Rainer Liis
 * Created:		14.02.2018
 * Last edit:	14.02.2018
 *
 * Description: programm, mis loeb sisse ühest failist tudengite andmed
 * 				ja teisest ainete andmed ja prindib uude faili eksamipileti.
 */

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

int tudengidSisse (FILE *tudengid, Student *tudeng, Student *tudeng_massiiv);
int ainedSisse (FILE *ained, Subject *aine, Subject *aine_massiiv);
void yhildus (Subject *aine_massiiv, Student *tudeng_massiiv, Pilet *pileti_liige, int counter_sub, int counter_stud);
int sortimine (Pilet *pileti_liige, int counter_sub);
void eksamileht (Pilet *pileti_liige, int counter_sub, int ainete_hulk);

int main (void)
{
	FILE *tudengid, *ained; // tekitab pointerid failidele

	Pilet pileti_liige[30]; // muutuja ainete ja tudengite ühildamiseks
	Student tudeng[30]; // muutuja tudengi andmete hoiustamiseks
	Subject aine[30]; // muutuja aine andmete hoiustamiseks
	Student tudeng_massiiv[30]; // massiiv tudengite hoidmiseks
	Subject aine_massiiv[30]; // massiiv ainete hoiustamiseks
	int counter_stud; // tudengite loendur
	int counter_sub; // ainete loendur
	int ainete_hulk; // loeb ära mitu erinevat ainet on

	tudengid = fopen ("tudengid.txt", "r"); // avab faili tudengid
	ained = fopen ("ained.txt", "r"); // avab faili andmed

	counter_stud = tudengidSisse (tudengid, tudeng, tudeng_massiiv);
	counter_sub = ainedSisse (ained, aine, aine_massiiv);

	fclose (tudengid);
	fclose (ained);

	yhildus (aine_massiiv, tudeng_massiiv, pileti_liige, counter_sub, counter_stud);

	ainete_hulk = sortimine (pileti_liige, counter_sub);
	printf ("Aineid kokku: %d\n", ainete_hulk);

	eksamileht (pileti_liige, counter_sub, ainete_hulk);

	return 0;
}

int tudengidSisse (FILE *tudengid, Student *tudeng, Student *tudeng_massiiv)
{
	int i = 0;
	int counter = 0;

	while (fscanf (tudengid, "%s %s %d", tudeng->eesnimi, tudeng->perenimi, &tudeng->matrikkel) != EOF)
	{
		strcpy (tudeng_massiiv[i].eesnimi, tudeng->eesnimi);
		strcpy (tudeng_massiiv[i].perenimi, tudeng->perenimi);
		tudeng_massiiv[i].matrikkel = tudeng->matrikkel;
		i++;
		counter++;
	}

	for (i = 0; i < counter; i++)
	{
		printf ("%s, %s, %d\n", tudeng_massiiv[i].eesnimi, tudeng_massiiv[i].perenimi, tudeng_massiiv[i].matrikkel);
	}

	printf (" \n");

	return counter;
}

int ainedSisse (FILE *ained, Subject *aine, Subject *aine_massiiv)
{
	int i = 0;
	int counter = 0;

	while (fscanf (ained, "%s %s %d %d", aine->nimi, aine->kood, &aine->matrikkel, &aine->tulemus) != EOF)
	{
		strcpy (aine_massiiv[i].nimi, aine->nimi);
		strcpy (aine_massiiv[i].kood, aine->kood);
		aine_massiiv[i].matrikkel = aine->matrikkel;
		aine_massiiv[i].tulemus = aine->tulemus;
		i++;
		counter++;
	}

	for (i = 0; i < counter; i++)
	{
		printf ("%s, %s, %d, %d\n", aine_massiiv[i].nimi, aine_massiiv[i].kood, aine_massiiv[i].matrikkel, aine_massiiv[i].tulemus);
	}

	printf (" \n");

	return counter;
}

void yhildus (Subject *aine_massiiv, Student *tudeng_massiiv, Pilet *pileti_liige, int counter_sub, int counter_stud)
{
	int i;
	int j;
	int k = 0;
	int counter = 0;

	for (i = 0; i < counter_sub; i++)
	{
		for (j = 0; j < counter_stud; j++)
		{
			if (aine_massiiv[i].matrikkel == tudeng_massiiv[j].matrikkel)
			{
				strcpy (pileti_liige[k].aineNimi, aine_massiiv[i].nimi);
				strcpy (pileti_liige[k].perenimi, tudeng_massiiv[j].perenimi);
				strcpy (pileti_liige[k].eesnimi, tudeng_massiiv[j].eesnimi);
				pileti_liige[k].matrikkel = tudeng_massiiv[j].matrikkel;
				pileti_liige[k].tulemus = aine_massiiv[i].tulemus;
				k++;
				counter++;
			}
		}
	}

	for (i = 0; i < counter; i++)
	{
		printf ("%s, %s, %s, %d, %d\n", pileti_liige[i].aineNimi, pileti_liige[i].perenimi, pileti_liige[i].eesnimi, pileti_liige[i].matrikkel, pileti_liige[i].tulemus);
	}

	printf (" \n");

	return;
}

int sortimine (Pilet *pileti_liige, int counter_sub)
{
	Pilet temp;
	int i, j;
	int ainete_hulk = 0;


	for (i = 0; i < counter_sub; i++)
	{
		for (j = 0; j < counter_sub; j++)
		{
			if (strcmp (pileti_liige[j-1].aineNimi, pileti_liige[j].aineNimi) == 0)
			{
				if (strcmp (pileti_liige[j-1].perenimi, pileti_liige[j].perenimi) > 0)
				{
					temp = pileti_liige[j-1];
					pileti_liige[j-1] = pileti_liige[j];
					pileti_liige[j] = temp;
				}
			}
		}
	}

	for (i = 0; i < counter_sub; i++)
	{
		if (strcmp (pileti_liige[i-1].aineNimi, pileti_liige[i].aineNimi) != 0)
		{
			ainete_hulk++;
		}
	}

	for (i = 0; i < counter_sub; i++)
	{
		printf ("%s, %s, %s, %d, %d\n", pileti_liige[i].aineNimi, pileti_liige[i].perenimi, pileti_liige[i].eesnimi, pileti_liige[i].matrikkel, pileti_liige[i].tulemus);
	}

	printf (" \n");

	return ainete_hulk;
}

void eksamileht (Pilet *pileti_liige, int counter_sub, int ainete_hulk)
{
	int i;
	int j = 0;
	Pilet ainete_loend[ainete_hulk];

	FILE *output;

	for (i = 0; i < counter_sub; i++)
	{
		if (strcmp (pileti_liige[i-1].aineNimi, pileti_liige[i].aineNimi) != 0)
		{
			strcpy (ainete_loend[j].aineNimi, pileti_liige[i].aineNimi);
			j++;
		}
	}

	for (i = 0; i < ainete_hulk; i++)
	{
		output = fopen (ainete_loend[i].aineNimi, "r");
		if (output)
		{
			printf ("Avati fail %s\n", ainete_loend[i].aineNimi);
			fclose (output);
		}
		else
		{
			output = fopen (ainete_loend[i].aineNimi, "w");
			fprintf (output, "%s\n Perenimi Eesnimi Matrikkel Tulemus\n", ainete_loend[i].aineNimi);
			printf ("Loodi fail %s\n", ainete_loend[i].aineNimi);
			fclose (output);
		}
	}

	for (i = 0; i < ainete_hulk; i++)
	{
		output = fopen (ainete_loend[i].aineNimi, "a");
		for (j = 0; j < counter_sub; j++)
		{
			if (strcmp (ainete_loend[i].aineNimi, pileti_liige[j].aineNimi) == 0)
			{
				fprintf (output, "%s %s %d %d\n", pileti_liige[j].perenimi, pileti_liige[j].eesnimi, pileti_liige[j].matrikkel, pileti_liige[j].tulemus);
				printf ("Faili nimega %s prinditi: %s %s %d %d\n", pileti_liige[j].aineNimi, pileti_liige[j].perenimi, pileti_liige[j].eesnimi, pileti_liige[j].matrikkel, pileti_liige[j].tulemus);
			}
		}
		fclose (output);
	}

	return;
}