#include "DateTime.h"

/**********************************************************
Konstruktor
**********************************************************/
DateTime::DateTime()
{}


/*---------------------------------------------------------
Name:           DateTime

Beschreibung:   Konstruktor mit Übergabe der Datum und Uhrzeit            
 
Eingänge:       unsigned char year
                   Jahr

                unsigned char month
                   Monat

                unsigned char day
                   Tag

                unsigned char weekday
                   Wochentag (0: Sonntag, 1: Montag ...)

                unsigned char hour
                   Stunde

                unsigned char minute
                   Minute

                unsigned char second
                   Sekunde

Ausgang:        void
---------------------------------------------------------*/
DateTime::DateTime(	unsigned char year, unsigned char month, unsigned char day, unsigned char weekday,
					unsigned char hour, unsigned char minute, unsigned char second)
{
	this->year = year;
	this->month = month;
	this->day = day;
	this->weekday = weekday;
	this->hour = hour;
	this->minute = minute;
	this->second = second;
}

/**********************************************************
öffentliche Methoden
**********************************************************/

/*---------------------------------------------------------
Name:           addSecond

Beschreibung:   addiert eine Sekunde auf die aktuell
                gespeicherte Zeit inkl. Auswertung aller
                Überträge
 
Eingänge:       void

Ausgang:        void
---------------------------------------------------------*/
void DateTime::addSecond(void)
{
	this->second++;

	if(this->second >= 60)
	{
		this->second = 0;
		this->minute++;

		if(this->minute >= 60)
		{
			this->minute = 0;
			this->hour++;

			if(this->hour >= 24)
			{
				this->hour = 0;
				this->day++;

				this->weekday = (this->weekday + 1) % 7;

				if(this->day >= daysInMonth(month, year))
				{
					this->day = 1;
					this->month++;

					if(this->month > 12)
					{
						this->month = 1;
						this->year++;
					}
				}
			}
		}
	}
}

/*---------------------------------------------------------
Name:           daysInMonth

Beschreibung:   gibt die Anzahl der Tages eines Monats zurück
 
Eingänge:       unsigned char month
                  Monat für den die Anzahl der Tage gesucht wird

                unsigned char year
                  Jahr in dem sich der Monat befindet
                  (wird bei der Entscheidung benötigt, ob
                  der Februar 28 oder 29 Tage hat)

Ausgang:        unsigned char
                  Anzahl der Monatstage
---------------------------------------------------------*/
unsigned char DateTime::daysInMonth(unsigned char month, unsigned char year)
{
	unsigned char days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	unsigned char daysInMonth = days[month];

	if(month == 2 && isLeapyear(year))
	{
		daysInMonth = 29;
	}	

	return daysInMonth;
}

/*---------------------------------------------------------
Name:           isLeapyear

Beschreibung:   gibt zurück ob das übergebene Jahr ein Schaltjahr ist
                
                Hinweis:
                Bei der Auswertung wird nur kontrolliert, ob das Jahr
                durch 4 teilbar ist. 
 
Eingänge:       unsigned char year
                  Jahr, das auf Schaltjahr geprüft werden soll
                  (Angabe als 2stelliger Wert)

Ausgang:        unsigned char
                  Jahr ist ein Schaltjahr?

                  0: kein Schaltjahr
                  1: Schaltjahr
---------------------------------------------------------*/
unsigned char DateTime::isLeapyear(unsigned char year)
{
	unsigned char leapyear = 0;

	if(year & 0x03 == 0)
	{
		leapyear = 1;
	}

	return leapyear;
}

/*---------------------------------------------------------
Name:           getDateTimeString

Beschreibung:   gibt die gespeicherte Zeit als Zeichenkette
                zurück
 
Eingänge:       char* dateTimeString
                  enthält am Ende der Funktion die gespeicherte
                  Zeit (Datum und Uhrzeit)

                  Mindestgröße: 18 Byte

                  Ausgabeformat: dd.MM.yy-hh:mm:ss

Ausgang:        void
---------------------------------------------------------*/
void DateTime::getDateTimeString(char* dateTimeString)
{
	getDateString(dateTimeString);

	dateTimeString[8] = '-';

	getTimeString(dateTimeString + 9);
}

/*---------------------------------------------------------
Name:           getDateString

Beschreibung:   gibt das gespeicherte Datum als Zeichenkette
                zurück
 
Eingänge:       char* dateString
                  enthält am Ende der Funktion das gespeicherte
                  Datum

                  Mindestgröße: 9 Byte

                  Ausgabeformat: dd.MM.yy

Ausgang:        void
---------------------------------------------------------*/
void DateTime::getDateString(char* dateString)
{
	dateString[0] = (this->day / 10) + '0';	
	dateString[1] = (this->day % 10) + '0';
	dateString[2] = '.';
	dateString[3] = (this->month / 10) + '0';	
	dateString[4] = (this->month % 10) + '0';
	dateString[5] = '.';
	dateString[6] = (this->year / 10) + '0';	
	dateString[7] = (this->year % 10) + '0';
	dateString[8] = '\n';
}

/*---------------------------------------------------------
Name:           getTimeString

Beschreibung:   gibt die gespeicherte Uhrzeit als Zeichenkette
                zurück
 
Eingänge:       char* timeString
                  enthält am Ende der Funktion die gespeicherte
                  Uhrzeit

                  Mindestgröße: 9 Byte

                  Ausgabeformat: hh:mm:ss

Ausgang:        void
---------------------------------------------------------*/
void DateTime::getTimeString(char* timeString)
{
	timeString[0] = (this->hour / 10) + '0';	
	timeString[1] = (this->hour % 10) + '0';
	timeString[2] = ':';
	timeString[3] = (this->minute / 10) + '0';	
	timeString[4] = (this->minute % 10) + '0';
	timeString[5] = ':';
	timeString[6] = (this->second / 10) + '0';	
	timeString[7] = (this->second % 10) + '0';
	timeString[8] = '\n';
}
