#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 "rive/file_asset_resolver.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;

        /// The helper used to resolve assets when they're not provided in-band
        /// with the file.
        FileAssetResolver* m_AssetResolver;

        File(FileAssetResolver* assetResolver);

    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.
        /// @param assetResolver is an optional helper to resolve assets which
        /// cannot be found in-band.
        /// @returns whether the import was successful or an error occurred.
        static ImportResult import(BinaryReader& reader,
                                   File** importedFile,
                                   FileAssetResolver* assetResolver = nullptr);

        /// @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