#ifndef _RIVE_FILE_HPP_
#define _RIVE_FILE_HPP_

#include "rive/artboard.hpp"
#include "rive/backboard.hpp"
#include "rive/factory.hpp"
#include "rive/file_asset_resolver.hpp"
#include <vector>

///
/// Default namespace for Rive Cpp runtime code.
///
namespace rive {
    class BinaryReader;
    class RuntimeHeader;
    class Factory;

    ///
    /// 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.
        std::unique_ptr<Backboard> m_Backboard;

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

        Factory* m_Factory;

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

        File(Factory*, FileAssetResolver*);

    public:
        ~File();

        ///
        /// Imports a Rive file from a binary buffer.
        /// @param data the raw date of the file.
        /// @param result is an optional status result.
        /// @param assetResolver is an optional helper to resolve assets which
        /// cannot be found in-band.
        /// @returns a pointer to the file, or null on failure.
        static std::unique_ptr<File> import(Span<const uint8_t> data,
                                            Factory*,
                                            ImportResult* result  = nullptr,
                                            FileAssetResolver* assetResolver = nullptr);

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

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

        // Instances
        std::unique_ptr<ArtboardInstance> artboardDefault() const;
        std::unique_ptr<ArtboardInstance> artboardAt(size_t index) const;
        std::unique_ptr<ArtboardInstance> artboardNamed(std::string name) const;

        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;

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