#pragma once
#include <string>

class Date {
 private:
    int year, month, day;

 public:
    Date(int y, int m, int d){
        day = d;
        month = m;
        year = y;
    }

    bool IsLeap() const {
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
            return true;
        }
        return false;
    }

    std::string ToString() const {
        std::string s0 = ".";
        std::string s1 = std::to_string(day);
        if (day < 10) {
            s1 = "0" + s1;
        }
        std::string s2 = std::to_string(month);
        if (month < 10) {
            s2 = "0" + s2;
        }
        std::string s3 = std::to_string(year);
        while (s3.length() < 4) {
            s3 = "0" + s3;
        }
        std::string s = s1 + s0 + s2 + s0 + s3;
        return s;
    }

    Date DaysLater(int days) const {
        int months[12], d(day), m(month-1), y(year);
        months[0] = 31, months[1] = 28, months[2] = 31;
        months[3] = 30, months[4] = 31, months[5] = 30;
        months[6] = 31, months[7] = 31, months[8] = 30;
        months[9] = 31, months[10] = 30, months[11] = 31;
        while (days > 0) {
            months[1] = 28;
            if (y % 4 == 0) {
                months[1] = 29;
            }
            if (d < months[m]) {
                d += 1;
            } else if (d == months[m]) {
                if (m + 1 == 11) {
                    y += 1;
                }
                m = (m + 1) % 12;
                d = 1;
            }
            days -= 1;
        }
        return Date(y, m + 1, d);
    }

    int DaysLeft(const Date& date) const {
        int months[12], d(day), m(month-1), y(year), d_(0);
        months[0] = 31, months[1] = 28, months[2] = 31;
        months[3] = 30, months[4] = 31, months[5] = 30;
        months[6] = 31, months[7] = 31, months[8] = 30;
        months[9] = 31, months[10] = 30, months[11] = 31;
        while (date.day!= d || date.month-1 != m || date.year != y) {
            months[1] = 28;
            if (y % 4 == 0) {
                months[1] = 29;
            }
            if (d < months[m]) {
                d += 1;
            } else if (d == months[m]) {
                if (m + 1 == 11) {
                    y += 1;
                }
                m = (m + 1) % 12;
                d = 1;
            }
            d_ += 1;
        }
        return d_;
    }
};