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

#include <stdio.h> // print and scan
#include <stdlib.h> // exit
#include <string.h> // stringi operatsioonid
#include <unistd.h> // faili olemasolu kontroll
#include "struktuurid.h" // struktuurid
#include "function.h" // universaalsed funktsioonid

// loeb sisse tudengi failist F1
void tudengidSisse (Student *tudeng_massiiv, int T);

// loeb sisse ained failist F2
void ainedSisse (Subject *aine_massiiv, int A);

// seob andmed omavahel kolmandasse massiivi
void yhildus (Subject *aine_massiiv, Student *tudeng_massiiv, Pilet *pileti_liige, int A, int T, char choice);

// sorterib andmed
int sortimine (Pilet *pileti_liige, int A, char choice);

// väljastab tulemused faili ja ekraanile
void eksamileht (Pilet *pileti_liige, int A, int ainete_hulk);

int main (void)
{
	int T = howManyLines ("F1.txt"); // tudengite massiivi suurus
	int A = howManyLines ("F2.txt"); // ainete massiivi suurus

	Student tudeng_massiiv[T]; // massiiv tudengite hoidmiseks
	Subject aine_massiiv[A]; // massiiv ainete hoiustamiseks
	Pilet pileti_liige[T+A]; // muutuja ainete ja tudengite ühildamiseks
	int ainete_hulk; // loeb ära mitu erinevat ainet on
	char choice; // hoiab kasutaja valikut

	// küsib kasutajalt, kas iga funktsioon prindib oma tulemuse ekraanile
	printf ("Print all or silent?[p/s]:"); 
	do
	{
		choice = getchar (); 
	}
	while (choice != 'p' && choice != 's');

	tudengidSisse (tudeng_massiiv, T);
	ainedSisse (aine_massiiv, A);

	yhildus (aine_massiiv, tudeng_massiiv, pileti_liige, A, T, choice);

	ainete_hulk = sortimine (pileti_liige, A, choice);

	eksamileht (pileti_liige, A, ainete_hulk);

	return 0;
}

void tudengidSisse (Student *tudeng_massiiv, int T)
{
	int i = 0;

	FILE *tudengid;
	tudengid = fopen ("F1.txt", "r"); // avab faili tudengid

	// loeb sisse kogu info failist F1.txt
	while (fscanf (tudengid, "%s %s %s", tudeng_massiiv[i].eesnimi, tudeng_massiiv[i].perenimi, tudeng_massiiv[i].matrikkel) != EOF)
	{
		i++;
	}
	fclose (tudengid); // sulgeb faili

	// väljastab sisse loetud info ekraanile
	printf ("tudengidSisse tulemus:\n");
	for (i = 0; i < T; i++)
	{
		printf ("%s, %s, %s\n", tudeng_massiiv[i].eesnimi, tudeng_massiiv[i].perenimi, tudeng_massiiv[i].matrikkel);
	}
	printf (" \n");
}

void ainedSisse (Subject *aine_massiiv, int A)
{
	int i = 0;

	FILE *ained;
	ained = fopen ("F2.txt", "r"); // avab faili andmed

	// loeb sisse kogu info failist F2.txt
	while (fscanf (ained, "%s %s %s %d", aine_massiiv[i].nimi, aine_massiiv[i].kood, aine_massiiv[i].matrikkel, &aine_massiiv[i].tulemus) != EOF)
	{
		i++;
	}
	fclose (ained);

	// väljastab sisse loetud info ekraanile
	printf ("ainedSisse tulemus:\n");
	for (i = 0; i < A; i++)
	{
		printf ("%s, %s, %s, %d\n", aine_massiiv[i].nimi, aine_massiiv[i].kood, aine_massiiv[i].matrikkel, aine_massiiv[i].tulemus);
	}
	printf (" \n");
}

void yhildus (Subject *aine_massiiv, Student *tudeng_massiiv, Pilet *pileti_liige, int A, int T, char choice)
{
	int i, j;
	int k = 0;

	
	for (i = 0; i < A; i++)
	{
		for (j = 0; j < T; j++)
		{
			// võrdleb kahe massiivi liikmeid ja kui mõlema matrikkel on võrdne, seob nad kokku kolmandas massiivis
			if ( strcmp (aine_massiiv[i].matrikkel, tudeng_massiiv[j].matrikkel) == 0)
			{
				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);
				strcpy (pileti_liige[k].matrikkel, tudeng_massiiv[j].matrikkel);
				pileti_liige[k].tulemus = aine_massiiv[i].tulemus;
				k++;
			}
		}
	}

	// kui kasutaja sisestatud täht oli 'p', väljastab tulemuse ekraanile
	if (choice == 'p')
	{
		printf ("yhildus tulemus:\n");
		for (i = 0; i < k; i++)
		{
			printf ("%s, %s, %s, %s, %d\n", pileti_liige[i].aineNimi, pileti_liige[i].perenimi, pileti_liige[i].eesnimi, pileti_liige[i].matrikkel, pileti_liige[i].tulemus);
		}
		printf (" \n");
	}
}

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

	// mullisort, järjestab iga aine siseselt tudengid tähestiku alusel
	for (i = 0; i < A; i++)
	{
		for (j = 0; j < A; 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;
				}
			}
		}
	}

	// loeb ära mitu erinevat ainet on
	for (i = 0; i < A; i++)
	{
		if (strcmp (pileti_liige[i-1].aineNimi, pileti_liige[i].aineNimi) != 0)
		{
			ainete_hulk++;
		}
	}

	// kui kasutaja sisestatud täht on 'p' väljastab tulemuse ekraanile
	if (choice == 'p')
	{
		printf ("sortimine tulemus:\n");
		printf ("aineid kokku: %d\n", ainete_hulk);
		for (i = 0; i < A; i++)
		{
			printf ("%s, %s, %s, %s, %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 A, int ainete_hulk)
{
	int i;
	int j = 0;
	Pilet ainete_loend[ainete_hulk];

	FILE *output; // faili pointer

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

	/* kontrollib, kas vastava aine nimeline fail on olemas,
	 * kui ei ole, loob selle */
	for (i  = 0; i < ainete_hulk; i++)
	{
		if (access (ainete_loend[i].aineNimi, F_OK) != 0)
		{
			output = fopen (ainete_loend[i].aineNimi, "w");
			fclose (output);
		}
	}

	/* pindib iga aine nimelisse faili vastavad tulemused
	 * koos õpilaste andmetega */
	for (i = 0; i < ainete_hulk; i++)
	{
		output = fopen (ainete_loend[i].aineNimi, "a");
		for (j = 0; j < A; j++)
		{
			if (strcmp (ainete_loend[i].aineNimi, pileti_liige[j].aineNimi) == 0)
			{
				fprintf (output, "%s %s %s %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 %s %d\n", pileti_liige[j].aineNimi, pileti_liige[j].perenimi, pileti_liige[j].eesnimi, pileti_liige[j].matrikkel, pileti_liige[j].tulemus);
			}
		}
		fclose (output);
	}
}