#ifndef HF_NAPTAR_DATUM_H
#define HF_NAPTAR_DATUM_H
#include <cstring>
#include <iostream>

enum napnev {
	     HETFO = 0,
	     KEDD = 1,
	     SZERDA = 2,
	     CSUTORTOK = 3,
	     PENTEK = 4,
	     SZOMBAT = 5,
	     VASARNAP = 6
};

std::ostream &operator<<(std::ostream &os, napnev nap);

/*!
 * @brief Egy naptár alapját napok képzik. Ezeket ebben az osztályban tároljuk.
 * Ez tárolja az adott dátum évét, hónapját és napját.
 * Opcionálisan tárolhat egy 128 karakterből álló megjegyzést is.
 */
class Datum {
  //! A dátum éve
  int ev;
  //! A dátum hónapja
  int honap;
  //! A dátum napja
  int nap;
  //! Megjegyzés a dátumhoz
  char megjegyzes[129];
protected:
  static int honap_napok[12];
public:
  /*!
   * @brief Kiszámítja, hogy mennyi nap telt el a dátum óta
   * @return Az eltelt napok száma
   */
  int napszam() const;

  /*!
   * @brief Kiszámítja a dátum óta eltelt szökőnapok számát. napszam() függvényhez szükséges.
   * @return A dátum óta eltelt szökőnapok száma
   */
  int szokoev() const;


  /*!
   * @brief Alap konstruktor. Alap értéke: 1970.01.01. (Unix timestamp kezdete)
   */
  Datum() : ev(1970), honap(1), nap(1) {
    strcpy(megjegyzes, "Unix timestamp");
  }

  /*!
   * @brief Paraméterrel hívható konstruktor
   * @param ev @copybrief ev
   * @param honap @copybrief honap
   * @param nap @copybrief nap
   * @param note @copybrief megjegyzes
   */
  Datum(int ev, int honap, int nap, const char *note = "") : ev(ev), honap(honap), nap(nap) {
    strcpy(megjegyzes, note);
  }

  /*!
   * @brief Másoló konstruktor
   * @param datum A lemásolandó Datum osztály
   */
  Datum(const Datum &datum);

  Datum& operator=(const Datum& date);

  virtual ~Datum() {}
  virtual bool equal(const Datum& d) const;
  /*!
   * @brief Egyenlőséget ellenőrző operátor
   * @param nap2 Az a Datum,amivel össze akarjuk hasonlítani a jelenlegi dátumot.
   * @return Az egyenlőséget jelző logikai érték
   */
  friend bool operator==(const Datum&nap1,const Datum &nap2);

  /*!
   * @brief Egyenlőtlenséget ellenőrző operátor
   * @param nap2 Az a Datum,amivel össze akarjuk hasonlítani a jelenlegi dátumot.
   * @return Az egyenlőtlenséget jelző logikai érték
   */
  virtual bool operator!=(const Datum &nap2) const;

  /*!
   * @brief Két dátum idejének összehasonlítása
   * @param nap Az a Datum,amivel össze akarjuk hasonlítani a jelenlegi dátumot.
   * @return Logikai érték
   */
  virtual bool operator<(const Datum &nap) const;

  /*!
   * @copybrief operator<
   * @copydetails operator<
   */
  virtual bool operator<=(const Datum &nap) const;

  /*!
   * @copybrief operator<
   * @copydetails operator<
   */
  virtual bool operator>(const Datum &nap) const;

  /*!
   * @copybrief operator<
   * @copydetails operator<
   */
  virtual bool operator>=(const Datum &nap) const;

  /*!
   * @brief Kivonás operátor
   * @param nap2 Az a Datum,amivel össze akarjuk hasonlítani a jelenlegi dátumot.
   * @return A két dátum közötti napok száma
   */
  virtual int operator-(const Datum &nap2) const;

  /*!
   * @brief Megadja a dátum hónapját
   * @return A dátum hónapjának száma (1-12)
   */
  int getHonap() const;

  /*!
   * @brief Megadja a dátum évét
   * @return @copybrief ev
   */
  int getEv() const;

  /*!
   * @brief Megadja a dátum napját
   * @return @copybrief nap
   */
  int getNap() const;

  /*!
   * @brief Kiszámítja, hogy az adott dátum milyen napra esik.
   * @return A dátum napjának neve (napnev típus)
   */
  napnev getNapnev();

  /*!
   * Megadja a dátumhoz tartozó megjegyzést
   * @return A Datum-hoz tartpozó megjegyzés
   */
  virtual const char *getMegjegyzes() const;

  /*!
   * @brief Kiszámítja a dátumhoz tartozó UNIX-időt
   * @return  A Datum UNIX-ideje
   * @note Az időt éjfélnek veszi
   */
  int getUnixTime();
};

std::ostream &operator<<(std::ostream &os, const Datum &d);
#endif
