/*
	Html/javascriptist tuleb käsk/sisetus punktist X:
	 1) C programm leiab tabelist punkti IDga X
	 2) Leiab teekonna, mida reostus läbib, liites vahemaad ja keskmiseid kiiruseid kokku.
	 3) Väljastab aja (sekundites vist) kaua läheb, et jõuda Ülemisteni.
*/

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

typedef struct{
	
	double Lat;
	double Long;
	
}koordinaat;

typedef struct{

	koordinaat asukoht;
	double Kiirus;
	int suubumisID;
	
}punkt;

void failiNimi(char[20], char*);
void sisestus(int*);
int failiPikkus(FILE*);
void check(FILE*);
void taitmine(FILE*, int x, punkt[x]);
void kontroll(int, int x, punkt[x]);
double ajaLeidmine(int, int x, punkt[x]);
double arvutus(double, double, double, double);


int main(void){
	
	int sisestusID = 2, n, x;
	double aeg;
	char Fnimi[20];
	
	FILE *F;
	
	failiNimi(Fnimi, "Sisetage algandmete fail (.txt): \n");
	// siia tuleb panna reaalse nimekirja aadress
	F = fopen(Fnimi,"r");
	check(F);
	
	n = failiPikkus(F);
	
	punkt punktid[n];
	
	taitmine(F,n,punktid);
	fclose(F); // pole faili enam avatult vaja
	
	sisestus(&sisestusID); //Peaks tulema kasutajaliideselt
	printf("ID on: %d\n", sisestusID);
	
	
	kontroll(sisestusID, n, punktid);
	
	aeg = ajaLeidmine(sisestusID, n, punktid);
	
	x = atoi(aeg);
	return x;
}

void failiNimi(char input[20], char *tekst){
	
	
	printf("%s", tekst);
	scanf("%s", input);
	
}

void sisestus(int* x){
	
	
	printf("Reopunkti algpunkt: \n");
	
	scanf("%d", x);
	
}


void check(FILE *input){
	
	if(input == NULL){
		printf("Faili ei leitud!\n");
		exit(1);
	}
	fclose(input);
	
}

// Kontrollib, kui mitu kirjet failis on
int failiPikkus(FILE *input){
	
	int x = 0,s;
	double a,b,c;

	while(fscanf(input, "%lf %lf %lf %d",&a, &b, &c, &s) != EOF){
		x++;
	}
	rewind(input);
	
	printf("Ridade arv: %d\n", x);
	return x;
}

// Struct massiivi täitmine
void taitmine(FILE *input, int N, punkt punktid[N]){
	
	int i = 0;
	
	while(fscanf(input, "%lf %lf %lf %d",
		&punktid[i].asukoht.Lat,
		&punktid[i].asukoht.Long,
		&punktid[i].Kiirus,
		&punktid[i].suubumisID
	) != EOF){
		i++;
	}
}

// Kontrollib, ega algpunkt ei ole lõpppunkt
void kontroll(int ID, int n, punkt punktid[n]){
	
	printf("Toimub kontroll\n");
	
	if(punktid[ID].suubumisID == -1){
		exit(1);
	}
	
}

// Leiab terve vahemaa ja aja
double ajaLeidmine(int algID, int N, punkt punktid[N]){
	
	int uusID, counter = 0;
	double x, lat1, long1, lat2, long2, vahemaa = 0;
	
	int vanaID = algID;
	double kiirus = punktid[algID].Kiirus;
	
	while(punktid[vanaID].suubumisID != -1){
		
		uusID = punktid[vanaID].suubumisID;
		
		lat1 = punktid[vanaID].asukoht.Lat;
		long1 = punktid[vanaID].asukoht.Long;
		lat2 = punktid[uusID].asukoht.Lat;
		long2 = punktid[uusID].asukoht.Long;
		
		vahemaa += arvutus(lat1, long1, lat2, long2);
		kiirus += punktid[uusID].Kiirus;
		
		counter++;
		
	}
	
	kiirus = kiirus / counter;
	
	x = vahemaa / kiirus;
	
	return x;
}

// arvutab koordinaatide vahelise vahemaa
double arvutus(double Lat1, double Long1, double Lat2, double Long2){
	
	int R = 6371;
	double D;
	
	Lat1 = Lat1 * M_PI / 180;
	Long1 = Long1 * M_PI / 180;
	Lat2 = Lat2 * M_PI / 180;
	Long2 = Long2 * M_PI / 180;
	
	
	D = R * acos(sin(Lat1) * sin(Lat2) + cos(Lat1) * cos(Lat2) * cos(Long2 - Long1));
	
	return D;
}