/*
 * 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 "using.h"
#include <functional>
#include <string>

namespace mirai
{

class BaseSource;
class Day;

enum TaskItemState { TODO, DONE };

struct TaskItemData {
	std::string text;
	TaskItemState state;
	Tags tags;
};

class TaskItem
{
  public:
	TaskItem(BaseSource *source, Day *day, const TaskItemData data);

	TaskItem &operator=(const TaskItemData &newData);

	void markAsDone();
	void markAsUndone();
	void setDate(const std::string &date);
	void setText(const std::string &text);

	const std::string &getLine() const;
	const std::string &getText() const;
	const TaskItemState &getState() const;
	const Tags &getTags() const;
	bool hasTag(const std::string &tag) const;

	int id() const;
	BaseSource *source();
	Day *day();

  private:
	void onChange();

	static int nextId;
	int id_ = nextId++;
	TaskItemData data;

	BaseSource *source_;
	Day *day_;
};

} // namespace mirai
