#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include "sonnenverlauf.h"

int strtod_error( const char *str, double *value )	{
	
	char *endptr;
	if ( *str == '\0' ) return 1;
	*value = strtod( str, &endptr);
	if ( *endptr != '\0' ) return 1;
	return 0;
}

int main( int argc, char *argv[] ) {
	
	struct tm t = { .tm_mday = 1, .tm_mon = 0, .tm_year = 122, .tm_hour = 0, .tm_min = 0, .tm_sec = 0 };
	double Zeitzone = 1.0;
	Sonnenverlauf_t Sonnenverlauf;
	double GeographischeBreite;
	double GeographischeLaenge;
	int opt;
	int GeographischeBreiteGelesen = 0;
	int GeographischeLaengeGelesen = 0;

	while ( ( opt = getopt( argc, argv, "b:l:z:" ) ) != -1 ) {	
    	switch ( opt ) {
			case 'b':
				if ( strtod_error( optarg, &GeographischeBreite ) ) {
					fprintf( stderr, "Geographische Breite konnte nicht gelesen werden. Parameter -b ist fehlerhaft!\n" );
					return 1;
				}
				GeographischeBreiteGelesen = 1;
				break;
			case 'l':
				if ( strtod_error( optarg, &GeographischeLaenge ) ) {
					fprintf( stderr, "Geographische Laenge konnte nicht gelesen werden. Parameter -l ist fehlerhaft!\n" );
					return 1;
				}
				GeographischeLaengeGelesen = 1;
				break;
			case 'z':
				if ( strtod_error( optarg, &Zeitzone ) ) {
					fprintf( stderr, "Zeitzone konnte nicht gelesen werden. Parameter -z ist fehlerhaft!\n" );
					return 1;
				}
				break;
      		default: return 1;
      	}
	}
	
	if ( !GeographischeBreiteGelesen ) {
		fprintf( stderr, "Geographische Breite wurde nicht angegeben. Parameter -b fehlt.\n" );
		return 1;
	}

	if ( !GeographischeLaengeGelesen ) {
		fprintf( stderr, "Geographische Laenge wurde nicht angegeben. Parameter -l fehlt.!\n" );
		return 1;
	}
	
	while ( ( t.tm_year + 1900 ) < 2023 ) {
		Sonnenverlauf = BerechneSonnenverlauf( t.tm_mday, t.tm_mon + 1, t.tm_year + 1900, Zeitzone, GeographischeBreite, GeographischeLaenge );
		printf( "Datum : %02d.%02d.%d\t\t%02d:%02d\n", Sonnenverlauf.Tag, Sonnenverlauf.Monat, Sonnenverlauf.Jahr, Sonnenverlauf.AufgangStunden, Sonnenverlauf.AufgangMinuten );
		t.tm_mday += 1;
		mktime(&t);
	}
	
	return 0;
}