/*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

#include "ts/ts.h"

#include "cripts/Lulu.hpp"
#include "cripts/Instance.hpp"

namespace cripts
{

void
Instance::_initialize(int argc, const char *argv[], const char *filename, bool remap)
{
  if (remap) {
    from_url = argv[0];
    to_url   = argv[1];
    for (int i = 2; i < argc && (i - 2) < static_cast<int>(data.size()); i++) {
      auto s = cripts::string(argv[i]);

      s.trim("\"\'");
      data[i - 2] = s;
    }
    _size = argc - 2;
  } else {
    // Global plugins don't have the from/to url values.
    for (int i = 1; i < argc && i <= 16; i++) {
      auto s = cripts::string(argv[i]);

      s.trim("\"\'");
      data[i - 1] = s;
    }
    _size = argc - 1;
  }

  // Set the debug tag for this plugin, slightly annoying that we have to calculate
  // this for every instantiation, but in general, each Cript is used primarily for
  // one single remap rule
  plugin_debug_tag = filename;
  auto slash       = plugin_debug_tag.find_last_of('/');
  auto period      = plugin_debug_tag.find_last_of('.');

  if (slash == cripts::string::npos) {
    slash = 0;
  }

  if (period != cripts::string::npos) {
    plugin_debug_tag = std::string_view(plugin_debug_tag.substr(slash + 1, period - slash - 1));
  }

  dbg_ctl_cript.set(plugin_debug_tag.c_str());
}

bool
Instance::AddPlugin(const cripts::string &tag, const cripts::string &plugin, const Plugin::Options &options)
{
  if (plugins.find(tag) != plugins.end()) {
    return false;
  }

  auto p = Plugin::Remap::Create(tag, plugin, from_url, to_url, options);

  if (p.Valid()) {
    plugins.emplace(tag, std::move(p));

    return true;
  } else {
    Fail();
    return false;
  }
}

bool
Instance::DeletePlugin(const cripts::string &tag)
{
  auto p = plugins.find(tag);

  if (p != plugins.end()) {
    plugins.erase(p);

    return true;
  } else {
    return false;
  }
}

void
Instance::AddBundle(cripts::Bundle::Base *bundle)
{
  for (auto &it : bundles) {
    if (it->Name() == bundle->Name()) {
      CFatal("[Instance]: Duplicate bundle %s", bundle->Name().c_str());
    }
  }

  bundles.push_back(bundle);
}

} // namespace cripts
