/* ***********************************************************************
//
//   Copyright (C) 2025 -- The 4D-STAR Collaboration
//   File Author: Emily Boudreaux
//   Last Modified: April 09, 2025
//
//   4DSSE is free software; you can use it and/or modify
//   it under the terms and restrictions the GNU General Library Public
//   License version 3 (GPLv3) as published by the Free Software Foundation.
//
//   4DSSE is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//   See the GNU Library General Public License for more details.
//
//   You should have received a copy of the GNU Library General Public License
//   along with this software; if not, write to the Free Software
//   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// *********************************************************************** */
#include <string>

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

#include "debug.h"

namespace serif::resource::types {
    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<serif::mesh::MeshIO>(p));
           }},
           {"eos", [](const std::string& p) { return Resource(
               std::make_unique<serif::eos::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);
        }
    }
}