#ifndef _RIVE_FILE_HPP_
#define _RIVE_FILE_HPP_

#include "rive/artboard.hpp"
#include "rive/backboard.hpp"
#include "rive/core/binary_reader.hpp"
#include "rive/runtime_header.hpp"
#include <vector>

///
/// Default namespace for Rive Cpp runtime code.
///
namespace rive
{
	///
	/// Tracks the success/failure result when importing a Rive file.
	///
	enum class ImportResult
	{
		/// Indicates that a file's been successfully imported.
		success,
		/// Indicates that the Rive file is not supported by this runtime.
		unsupportedVersion,
		/// Indicates that the there is a formatting problem in the file itself.
		malformed
	};

	///
	/// A Rive file.
	///
	class File
	{
	public:
		/// Major version number supported by the runtime.
		static const int majorVersion = 7;
		/// Minor version number supported by the runtime.
		static const int minorVersion = 0;

	private:
		/// The file's backboard. All Rive files have a single backboard
		/// where the artboards live.
		Backboard* m_Backboard = nullptr;

		/// List of artboards in the file. Each artboard encapsulates a set of
		/// Rive components and animations.
		std::vector<Artboard*> m_Artboards;

	public:
		~File();

		///
		/// Imports a Rive file from a binary buffer.
		/// @param reader a pointer to a binary reader attached to the file.
		/// @param importedFile a handle to a file that will contain the
		/// imported data.
		/// @returns whether the import was successful or an error occurred.
		static ImportResult import(BinaryReader& reader, File** importedFile);

		/// @returns the file's backboard. All files have exactly one backboard.
		Backboard* backboard() const;

		/// @returns the default artboard. This is typically the first artboard
		/// found in the file's artboard list.
		Artboard* artboard() const;

		/// @returns the named artboard. If no artboard is found with that name,
		/// the null pointer is returned.
		Artboard* artboard(std::string name) const;

		/// @returns the artboard at the specified index, or the nullptr if the
		/// index is out of range.
		Artboard* artboard(size_t index) const;

		/// @returns the number of artboards in the file.
		size_t artboardCount() const { return m_Artboards.size(); }

	private:
		ImportResult read(BinaryReader& reader, const RuntimeHeader& header);
	};
} // namespace rive
#endif