#pragma once

#include <string>

class Date {
 public:
Date(int year, int month, int day) {
    Date::date_year = year;
    Date::date_month = month;
    Date::date_day = day;
}

bool IsLeap() const {
if (date_year % 4 == 0) {
    if (date_year % 100 == 0) {
        if (date_year % 400 == 0) {
            return true;
        } else {
          return false;
        }
    } else {
      return true;
    }
}
return false;
}

std::string ToString() {
    std::string string_day = std::to_string(date_day);
    std::string string_month = std::to_string(date_month);
    std::string string_year = std::to_string(date_year);
    if (date_day < 10) {
        string_day = "0" + string_day;
    }
    if (date_month < 10) {
        string_month = "0" + string_month;
    }
    if (date_year < 10) {
        string_year = "000" + string_year;
    } else if (date_year >= 10 && date_year < 100) {
        string_year = "00" + string_year;
    } else if (date_year >= 100 && date_year < 1000) {
        string_year = "0" + string_year;
    }
    return string_day + "." + string_month + "." + string_year;
}

Date DaysLater(int days) {
if (date_day + days == date_day) {
    return {date_year, date_month, date_day};
} else {
    while (days > 0) {
        days--;
        if (date_month == 2 && date_day == 28) {
            if (Date{date_year, date_month, date_day}.IsLeap()) {
                date_day++;
            }
        } else if (date_month == 12 && date_day == 31) {
            date_day = 1;
            date_month = 1;
            date_year++;
        } else if (date_day < count_of_days[date_month]) {
            date_day++;
        } else {
            date_day = 1;
            date_month++;
        }
    }
}
return {date_year, date_month, date_day};
}

int DaysLeft(const Date& date) {
int counter = 0;
while ((date_year != date.date_year) && \
(date_month != date.date_month) && \
(date_day != date.date_day)) {
    if (date_month == 2 && date_day == 28) {
        if (Date{date_year, date_month, date_day}.IsLeap()) {
            counter++;
            date_day++;
        }
    } else if (date_month == 12 && date_day == 31) {
        date_day = 1;
        date_month = 1;
        date_year++;
        counter++;
    } else if (date_day < count_of_days[date_month]) {
        date_day++;
        counter++;
    } else {
        date_day = 1;
        date_month++;
        counter++;
    }
}
return counter;
}

 private:
    int date_year;
    int date_month;
    int date_day;
    int[13] count_of_days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
};