#include <iostream>
#include <string.h>
#include <time.h>
#include "datum.h"
using namespace std;

int datum::anzahl_tage(void)
{
   switch(monat)
   {
   case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
   case 4: case 6: case 9: case 11:  return 30;
   }
   if(is_schaltjahr()) return 29;
   else return 28;
}
bool datum::is_schaltjahr(void)
{
   if(jahr%400==0) return true;
   if(jahr%100==0) return false;
   if(jahr%4==0) return true;
   return false;
}
void datum::heute(void)
{
   time_t zeit_in_sec;
   zeit_in_sec=time(NULL);
   struct tm zeit;
   zeit=*localtime(&zeit_in_sec);
   tag=zeit.tm_mday;
   monat=zeit.tm_mon+1;
   jahr=zeit.tm_year+1900;
}
datum::datum(void)
{
   heute();
}
datum::datum(int t)
{
   heute();
   tag=t;
}
datum::datum(int t, int m)
{
   heute();
   tag=t; monat=m;
}
datum::datum(int t, int m, int j)
{
   tag=t; monat=m; jahr=j;
}
datum::datum(const char s[])
{
   char buf[5]="";
   int zahl;
   
   heute();
   memcpy(buf, s, 2);
   zahl=atoi(buf);
   if(zahl!=0) tag=zahl;
   
   memcpy(buf, s+3, 2);
   zahl=atoi(buf);
   if(zahl!=0) monat=zahl;
   
   memcpy(buf, s+6, 4);
   zahl=atoi(buf);
   if(zahl!=0) jahr=zahl;
}
void datum::display(void)
{
    if(!istgueltig()) 
       cout << "ungueltiges Datum";
    else
       cout << tag << "." << monat << "." << jahr;
}
void datum::tag_vor(void)
{
   if(!istgueltig()) 
   {
       cout << "Fehler! Ungueltiges Datum!" <<endl; 
       return;
   }
   ++tag;
   if(tag>anzahl_tage())
   {
      ++monat;
      tag=1;
      if(monat>12)
      {
         ++jahr;
         monat=1;
      }
   }
}
void datum::tag_zurueck(void)
{
   if(!istgueltig()) 
   {
      cout << "Fehler! Ungueltiges Datum!" <<endl; 
      return;
   }
   --tag;
   if(tag<1)
   {
      --monat;
      if(monat<1)
      {
         --jahr;
         monat=12;
      }
      tag=anzahl_tage();
   }
}
bool datum::istgueltig(void)
{
   if(jahr<1)               return false;
   if(monat>12||monat<1)    return false; 
   if(tag>anzahl_tage()||tag<1) return false;
   return true;
}
bool datum::istgleich(datum d2)
{
   if(jahr==d2.jahr && monat==d2.monat && tag==d2.tag)
      return true;
   return false;
}
