/*
 * This file is part of OpenTTD.
 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
 */

/** @file social_integration.h Interface definitions for game to report/respond to social integration. */

#ifndef SOCIAL_INTEGRATION_H
#define SOCIAL_INTEGRATION_H

class SocialIntegrationPlugin {
public:
	enum State : uint8_t {
		RUNNING, ///< The plugin is successfully loaded and running.

		FAILED, ///< The plugin failed to initialize.
		PLATFORM_NOT_RUNNING, ///< The plugin failed to initialize because the Social Platform is not running.
		UNLOADED, ///< The plugin is unloaded upon request.
		DUPLICATE, ///< Another plugin of the same Social Platform is already loaded.
		UNSUPPORTED_API, ///< The plugin does not support the current API version.
		INVALID_SIGNATURE, ///< The signature of the plugin is invalid.
	};

	std::string basepath; ///< Base path of the plugin.

	std::string social_platform = "unknown"; ///< Social platform this plugin is for.
	std::string name = ""; ///< Name of the plugin.
	std::string version = ""; ///< Version of the plugin.

	State state = FAILED; ///< Result of the plugin's init function.

	SocialIntegrationPlugin(const std::string &basepath) : basepath(basepath) {}
};

class SocialIntegration {
public:
	/**
	 * Get the list of loaded social integration plugins.
	 * @return The loaded plugins.
	 */
	static std::vector<SocialIntegrationPlugin *> GetPlugins();

	/**
	 * Initialize the social integration system, loading any social integration plugins that are available.
	 */
	static void Initialize();

	/**
	 * Shutdown the social integration system, and all social integration plugins that are loaded.
	 */
	static void Shutdown();

	/**
	 * Allow any social integration library to handle their own events.
	 */
	static void RunCallbacks();

	/**
	 * Event: user entered the main menu.
	 */
	static void EventEnterMainMenu();

	/**
	 * Event: user entered the Scenario Editor.
	 * @param map_width The width of the entered scenario.
	 * @param map_height The width of the entered scenario.
	 */
	static void EventEnterScenarioEditor(uint map_width, uint map_height);

	/**
	 * Event: user entered a singleplayer game.
	 * @param map_width The width of the entered map.
	 * @param map_height The width of the entered map.
	 */
	static void EventEnterSingleplayer(uint map_width, uint map_height);

	/**
	 * Event: user entered a multiplayer game.
	 * @param map_width The width of the entered map.
	 * @param map_height The width of the entered map.
	 */
	static void EventEnterMultiplayer(uint map_width, uint map_height);

	/**
	 * Event: user is joining a multiplayer game.
	 */
	static void EventJoiningMultiplayer();
};

#endif /* SOCIAL_INTEGRATION_H */
