//
// Created by Tyler on 10/6/20.
//

#include <iosfwd>
#include "assignment-or.hpp"

namespace ndn {
namespace ndncert {

_LOG_INIT(ndncert.assignment.or);

NDNCERT_REGISTER_FUNCFACTORY(AssignmentOr, "or");

AssignmentOr::AssignmentOr()
    : NameAssignmentFuncFactory("or")
{
}

NameAssignmentFunc
AssignmentOr::getFunction(std::list<NameAssignmentFunc> funcs){
    if (funcs.size() == 1) return *funcs.begin();
    return OrAssignmentFunc(funcs);
}

NameAssignmentFunc
AssignmentOr::getFunction(const std::string &factoryParam) {
    std::list<NameAssignmentFunc> paramList;
    std::stringstream ss;
    ss << factoryParam;
    JsonSection section;
    try {
        boost::property_tree::read_json(ss, section);
    }
    catch (const std::exception& error) {
        BOOST_THROW_EXCEPTION(std::runtime_error(std::string("Failed to parse configuration for name assignment function or, ") + error.what()));
    }
    if (section.begin() == section.end()) {
        BOOST_THROW_EXCEPTION(std::runtime_error("No JSON configuration found for name assignment function"));
    }
    for (const auto& item: section) {
        auto factory = NameAssignmentFuncFactory::createNameAssignmentFuncFactory(item.first);
        if (!factory) {
            BOOST_THROW_EXCEPTION(std::runtime_error("Invalid assignment factory type"));
        }
        try {
            paramList.push_back(factory->getFunction(item.second.data()));
        } catch (const std::exception& e) {
            BOOST_THROW_EXCEPTION(std::runtime_error("Error on creating function"));
        }
    }

    return getFunction(paramList);
}

AssignmentOr::OrAssignmentFunc::OrAssignmentFunc(std::list<NameAssignmentFunc> funcList)
    : m_funcList(std::move(funcList))
{}

std::vector<PartialName>
AssignmentOr::OrAssignmentFunc::operator() (const std::vector<std::tuple<std::string, std::string>> params)
{
  std::vector<PartialName> nameList;
  for (const auto& func : m_funcList) {
      auto result = func(params);
      nameList.insert(nameList.end(), result.begin(), result.end());
  }

  return nameList;
}

}
}
