// Copyright 2017 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 "src/lib/cmx/facet_parser/cmx_facet_parser.h"

#include <lib/trace/event.h>

#include <algorithm>
#include <regex>
#include <sstream>
#include <string>

#include <rapidjson/document.h>

#include "src/lib/pkg_url/fuchsia_pkg_url.h"

namespace component {

constexpr char kFacets[] = "facets";

CmxFacetParser::CmxFacetParser() = default;
CmxFacetParser::~CmxFacetParser() = default;

bool CmxFacetParser::Parse(const rapidjson::Document& document, json::JSONParser* json_parser) {
  auto facets = document.FindMember(kFacets);
  if (facets == document.MemberEnd()) {
    // Valid syntax, but no value.
    return true;
  }

  sections_.clear();
  if (!facets->value.IsObject()) {
    json_parser->ReportError("Facets is not an object.");
    return false;
  }

  for (rapidjson::Value::ConstMemberIterator itr = facets->value.MemberBegin();
       itr != facets->value.MemberEnd(); ++itr) {
    std::string key = itr->name.GetString();
    rapidjson::Value value(itr->value, allocator_);
    sections_.insert({key, std::move(value)});
  }
  return true;
}

bool CmxFacetParser::ParseFromFileAt(int dirfd, const std::string& file,
                                     json::JSONParser* json_parser) {
  TRACE_DURATION("cmx", "CmxFacetParser::ParseFromFileAt", "file", file);
  rapidjson::Document document = json_parser->ParseFromFileAt(dirfd, file);
  if (json_parser->HasError()) {
    return false;
  }
  if (!document.IsObject()) {
    json_parser->ReportError("File is not a JSON object.");
    return false;
  }
  return Parse(document, json_parser);
}

const rapidjson::Value& CmxFacetParser::GetSection(const std::string& key) const {
  auto map_entry = sections_.find(key);
  if (map_entry == sections_.end()) {
    return null_value_;
  }
  return map_entry->second;
}

}  // namespace component
