#include <string>

#include "resourceManagerTypes.h"
#include "opatIO.h"
#include "meshIO.h"
#include "eosIO.h"

#include "debug.h"

std::string getFirstSegment(const std::string& input) {
    size_t pos = input.find(':');
    if (pos == std::string::npos) {
        // No colon found, return the entire string
        return input;
    } else {
        // Return substring from start to the position of the first colon
        return input.substr(0, pos);
    }
}


Resource createResource(const std::string& type, const std::string& path) {
    static const std::unordered_map<std::string, std::function<Resource(const std::string&)>> factoryMap = {
        {"opac", [](const std::string& p) { return Resource(
            std::make_unique<opat::OPAT>(opat::readOPAT(p)));
         }},
        {"mesh", [](const std::string& p) { return Resource(
            std::make_unique<MeshIO>(p));
        }},
        {"eos", [](const std::string& p) { return Resource(
            std::make_unique<EosIO>(p));
        }}
        // Add more mappings as needed
    };
    auto it = factoryMap.find(getFirstSegment(type));
    if (it != factoryMap.end()) {
        return it->second(path);
    } else {
        throw std::invalid_argument("Unknown resource type: " + type);
    }
}