/* osgEarth
 * Copyright 2025 Pelican Mapping
 * MIT License
 */
#pragma once

#include <osgEarth/Common>
#include <osgEarth/Registry>
#include <osgDB/Registry>
#include <osgDB/FileNameUtils>

namespace osgEarth { namespace Util
{
    /**
     * Create one of these as a static global to register an OSG plugin at startup.
     */
    template<class T>
    struct RegisterPluginLoader
    {
        RegisterPluginLoader(const std::string& name)
        {
            OE_HARD_ASSERT(osgDB::Registry::instance());
            osgDB::Registry::instance()->addReaderWriter(new T(name));
        }
    };

    /**
     * OSG plugin that will create an instance of a type with configuration options.
     */
    template<typename T, typename U>
    class PluginLoader : public osgDB::ReaderWriter
    {
    public: // Plugin stuff
        PluginLoader(const std::string& name) {
            supportsExtension(name, name);
        }

        inline ReadResult readObject(const std::string& filename, const osgDB::Options* dbOptions) const override
        {
            if (!acceptsExtension(osgDB::getLowerCaseFileExtension(filename)))
                return ReadResult::FILE_NOT_HANDLED;

            return ReadResult(new T(U::getConfigOptions(dbOptions)));
        }
    };

} } // namespace osgEarth
