/*
 * 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 "EventEmitter.h"
#include "Source.h"
#include <functional>
#include <memory>
#include <optional>
#include <string>

namespace mirai
{

class Mirai
{

  public:
	Mirai(const std::string &configFilePath);
	void addSource(
		const std::string &name, const std::string &type, std::unique_ptr<DataProvider> &&source
	);
	void editSource(int id, const std::string &name, const std::string &path);
	void deleteSource(int id);
	void unloadAllSources();
	void save();

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

	// Returns a non owning pointer to the requested resource or nullptr if not found.
	Source *getSourceById(int id);
	Source *getSourceByName(const std::string &name);

	void onSourceAdded(std::function<void(Source *)> f);
	void onSourceEdited(std::function<void(Source *)> f);
	void onSourceDeleted(std::function<void(int)> f);

  private:
	void loadConfig(const std::string &path);
	void saveConfig();
	std::vector<std::unique_ptr<Source>> sources_;
	std::string configPath_;

	EventEmitter<Source *> sourceAdded;
	EventEmitter<Source *> sourceEdited;
	EventEmitter<int> sourceDeleted;
};
} // namespace mirai
