/*
 * 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 "BaseFileSource.h"
#include "BaseSource.h"
#include "TaskItem.h"
#include "TodoMd.h"
#include <algorithm>
#include <functional>
#include <map>
#include <memory>
#include <optional>
#include <string>

namespace mirai
{

class Mirai
{

  public:
	void loadSource(std::unique_ptr<BaseSource> &&resource);
	void unloadAllSources();
	void save();
	void deleteTask(const TaskItem &taskItem);
	std::optional<std::reference_wrapper<BaseSource>> getSourceByName(const std::string &name);

	std::vector<std::unique_ptr<BaseSource>> &getSources();
	const std::vector<std::string> &getTags();

	void reloadTags();

	// Returns a non owning pointer to the requested resource or nullptr if not found.
	BaseSource *getSourceById(int id);

  private:
	std::vector<std::unique_ptr<BaseSource>> sources_;
	std::vector<std::string> tags_;
};
} // namespace mirai
