// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "logger_options.h"

#include "src/lib/fxl/strings/string_printf.h"

namespace netemul {
namespace config {

static const char* kEnabled = "enabled";
static const char* kKlogsEnabled = "klogs_enabled";
static const char* kFilters = "filters";

static const bool kDefaultEnabled = true;
static const bool kDefaultKlogsEnabled = false;

/*
 * LoggerOptions
 *
 * public
 */

LoggerOptions::LoggerOptions() { SetDefaults(); }

bool LoggerOptions::ParseFromJSON(const rapidjson::Value& value, json::JSONParser* parser) {
  if (value.IsNull()) {
    SetDefaults();
    return true;
  }

  if (!value.IsObject()) {
    parser->ReportError("logger_options must be object type");
    return false;
  }

  SetDefaults();

  for (auto i = value.MemberBegin(); i != value.MemberEnd(); i++) {
    if (i->name == kEnabled) {
      if (!i->value.IsBool()) {
        parser->ReportError("logger_options enabled must be a boolean value");
        return false;
      }
      enabled_ = i->value.GetBool();
    } else if (i->name == kKlogsEnabled) {
      if (!i->value.IsBool()) {
        parser->ReportError("logger_options klogs_enabled must be boolean value");
        return false;
      }
      klogs_enabled_ = i->value.GetBool();
    } else if (i->name == kFilters) {
      if (!filters_.ParseFromJSON(i->value, parser)) {
        return false;
      }
    } else {
      parser->ReportError(
          fxl::StringPrintf("Unrecognized logger_options member \"%s\"", i->name.GetString()));
      return false;
    }
  }

  return true;
}

void LoggerOptions::SetDefaults() {
  enabled_ = kDefaultEnabled;
  klogs_enabled_ = kDefaultKlogsEnabled;
  filters_.SetDefaults();
}

void LoggerOptions::set_enabled(bool enabled) { enabled_ = enabled; }

bool LoggerOptions::enabled() const { return enabled_; }

bool LoggerOptions::klogs_enabled() const { return klogs_enabled_; }

const LoggerFilterOptions& LoggerOptions::filters() const { return filters_; }

}  // namespace config
}  // namespace netemul
