// 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/project_context_factory.h"

#include <utility>

#include "./logging.h"

#include "config/metric_definition.pb.h"
#include "config/project.pb.h"
#include "config/project_configs.h"

namespace cobalt {
namespace logger {

ProjectContextFactory::ProjectContextFactory(
    std::string cobalt_registry_bytes) {
  // Attempt to deserialize a CobaltRegistry.
  auto cobalt_registry = std::make_unique<CobaltRegistry>();
  if (!cobalt_registry->ParseFromString(cobalt_registry_bytes)) {
    LOG(ERROR) << "Unable to parse a CobaltRegistry from the provided bytes.";
    return;
  }

  // Create a second CobaltRegistry and separate the Cobalt 1.0 data
  // from the Cobalt 0.1 data.
  auto legacy_cobalt_registry = std::make_unique<CobaltRegistry>();
  legacy_cobalt_registry->mutable_metric_configs()->Swap(
      cobalt_registry->mutable_metric_configs());
  legacy_cobalt_registry->mutable_encoding_configs()->Swap(
      cobalt_registry->mutable_encoding_configs());

  // If there is any Cobalt 1.0 data create a Cobalt 1.0 ProjectConfigs
  // object to wrap it.
  if (cobalt_registry->customers_size() > 0) {
    project_configs_ = config::ProjectConfigs::CreateFromCobaltRegistryProto(
        std::move(cobalt_registry));
  }

  // If there is any Cobalt 0.1 data create a Cobalt 0.1 ClientConfig object
  // to wrap it.
  if (legacy_cobalt_registry->metric_configs_size() > 0) {
    client_config_ = config::ClientConfig::CreateFromCobaltRegistryProto(
        std::move(legacy_cobalt_registry));
  }
}

std::unique_ptr<ProjectContext> ProjectContextFactory::NewProjectContext(
    std::string customer_name, std::string project_name,
    ReleaseStage release_stage) {
  if (project_configs_ == nullptr) {
    return nullptr;
  }
  const auto* customer_config =
      project_configs_->GetCustomerConfig(customer_name);
  if (!customer_config) {
    return nullptr;
  }
  const auto* project_config =
      project_configs_->GetProjectConfig(customer_name, project_name);
  if (!project_config) {
    return nullptr;
  }
  return std::make_unique<ProjectContext>(customer_config->customer_id(),
                                          customer_name, project_config,
                                          release_stage);
}

std::unique_ptr<ProjectContext> ProjectContextFactory::TakeSingleProjectContext(
    ReleaseStage release_stage) {
  if (!is_single_project()) {
    return nullptr;
  }
  auto project_context = std::make_unique<ProjectContext>(
      project_configs_->single_customer_id(),
      project_configs_->single_customer_name(),
      project_configs_->TakeSingleProjectConfig(), release_stage);
  project_configs_.reset();
  return project_context;
}

std::unique_ptr<encoder::ProjectContext>
ProjectContextFactory::NewLegacyProjectContext(uint32_t customer_id,
                                               uint32_t project_id) {
  if (client_config_ == nullptr) {
    return nullptr;
  }
  return std::make_unique<encoder::ProjectContext>(customer_id, project_id,
                                                   client_config_);
}

std::unique_ptr<encoder::ProjectContext>
ProjectContextFactory::NewSingleLegacyProjectContext() {
  if (!is_single_legacy_project()) {
    return nullptr;
  }
  return NewLegacyProjectContext(client_config_->single_customer_id(),
                                 client_config_->single_project_id());
}

}  // namespace logger
}  // namespace cobalt
