#include "Datum.h"

bool operator ==(const Datum& nap1, const Datum& nap2) {
  return nap1.equal(nap2) || nap2.equal(nap1);
}

static const char *napnevek[] = {"Hetfo", "Kedd", "Szerda", "Csutortok", "Pentek", "Szombat", "Vasarnap"};
int Datum::honap_napok[] = {31, 28, 31, 30, 31, 30,
                                    31, 31, 30, 31, 30, 31};

std::ostream &operator<<(std::ostream &os, napnev nap) {
    return os << napnevek[nap];
}

bool Datum::equal(const Datum &nap2) const{
  return ev == nap2.ev && honap == nap2.honap && nap == nap2.nap;
}

bool Datum::operator!=(const Datum &nap2) const{
  return !(*this == nap2);
}   

int Datum::getEv() const {
    return ev;
}

int Datum::getHonap() const {
    return honap;
}

int Datum::getNap() const {
    return nap;
}

const char *Datum::getMegjegyzes() const {
    return megjegyzes;
}

napnev Datum::getNapnev() {
    Datum n;
    int diff = ((*this) - n);
    diff += 3;
    diff %= 7;
    return (napnev) (diff);
}

int Datum::szokoev() const {
    if (honap <= 2)
        return (ev - 1) / 4 - (ev - 1) / 100 + (ev - 1) / 400;
    return ev / 4 - ev / 100 + ev / 400;
}

int Datum::operator-(const Datum &nap1) const{
    return napszam() - nap1.napszam();
}

int Datum::napszam() const {
    int n = ev * 365 + nap + szokoev();
    for (int i = 0; i < honap - 1; i++)
        n += honap_napok[i];
    return n;
}

Datum::Datum(const Datum &d) : ev(d.ev), honap(d.honap), nap(d.nap) {
    strcpy(megjegyzes, d.megjegyzes);
}

Datum& Datum::operator =(const Datum& d){
  ev = d.getEv();
  honap = d.getHonap();
  nap = d.getNap();
  strcpy(megjegyzes, d.getMegjegyzes());
  return *this;
}

bool Datum::operator<(const Datum &nap) const{
    return napszam() < nap.napszam();
}

bool Datum::operator<=(const Datum &nap) const{
    return napszam() <= nap.napszam();
}

bool Datum::operator>(const Datum &nap) const{
    return napszam() > nap.napszam();
}

bool Datum::operator>=(const Datum &nap) const{
    return napszam() >= nap.napszam();
}

int Datum::getUnixTime() {
    //1 nap = 86400 másodperc
    return ((*this) - Datum()) * 86400;
}
