/*
 * Mirai. Copyright (C) 2024 Vyn
 * This file is licensed under version 3 of the GNU General Public License (GPL-3.0-only)
 * The license can be found in the LICENSE file or at https://www.gnu.org/licenses/gpl-3.0.txt
 */

#pragma once

#include <bits/chrono.h>
#include <chrono>
#include <ctime>
#include <optional>
#include <string>

namespace mirai
{

struct Date {
	explicit Date(int year, unsigned month, unsigned day);

	explicit Date(std::chrono::time_point<std::chrono::system_clock> tp);
	explicit Date(std::chrono::year_month_day chronoDate);

	bool operator==(const Date &other) const;
	bool operator<(const Date &other) const;
	bool operator>(const Date &other) const;
	bool operator>=(const Date &other) const;
	bool operator<=(const Date &other) const;

	std::chrono::year_month_day toStdChrono() const
	{
		return std::chrono::year_month_day{
			std::chrono::year(year),
			std::chrono::month(month),
			std::chrono::day(day),
		};
	}

	int toIntRepresentation()
	{
		return day + month * 100 + year * 10000;
	}

	int year;
	unsigned month;
	unsigned day;
};

struct Time {

	bool operator==(const Time &other) const;
	bool operator<(const Time &other) const;
	bool operator>(const Time &other) const;

	int hour;
	int minute;
};

std::optional<mirai::Date> stringToDate(const std::string &dateStr);

} // namespace mirai
