// Copyright 2018 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/algorithms/rappor/rappor_config_helper.h"

#include <string>

#include "src/logging.h"

namespace cobalt::rappor {

// Sentinel value returned by ProbBitFlip() when the ReportDefinition
// does not contain the necessary settings to determine a value
// for the probability of flipping a bit.
constexpr float RapporConfigHelper::kInvalidProbability = -1.0f;

// We do not support RAPPOR's PRR in Cobalt.
constexpr float RapporConfigHelper::kProbRR = 0.0f;

////////////////////////////    p, q and f    //////////////////////////////////
// This is relevant to Basic RAPPOR (via the SIMPLE_OCCURRENCE_COUNT
// and UNIQUE_N_DAY_ACTIVES Report types).
//
// The mapping from different values of LocalPrivacyNoiseLevel to
// RAPPOR parameters p and q. The user sets LocalPrivacyNoiseLevel on
// a per-report basis. We always use q = 1 - p and so we don't need to
// configure two values, only a single value we call ProbBitFlip. We
// set p = ProbBitFlip, q = 1 - ProbBitFlip.

// NONE
static const float kLocalPrivacyNoneProbBitFlip = 0.0f;

// SMALL
static const float kLocalPrivacySmallProbBitFlip = 0.01f;

// MEDIUM
static const float kLocalPrivacyMediumProbBitFlip = 0.1f;

// LARGE
static const float kLocalPrivacyLargeProbBitFlip = 0.25f;

float RapporConfigHelper::ProbBitFlip(const ReportDefinition& report_definition,
                                      const std::string& metric_debug_name) {
  switch (report_definition.local_privacy_noise_level()) {
    case ReportDefinition::NONE:
      return kLocalPrivacyNoneProbBitFlip;
    case ReportDefinition::SMALL:
      return kLocalPrivacySmallProbBitFlip;
    case ReportDefinition::MEDIUM:
      return kLocalPrivacyMediumProbBitFlip;
    case ReportDefinition::LARGE:
      return kLocalPrivacyLargeProbBitFlip;
    default:
      LOG(ERROR) << "Invalid Cobalt config: Report " << report_definition.report_name()
                 << " from metric " << metric_debug_name
                 << " does not have local_privacy_noise_level set to a "
                    "recognized value.";
      return kInvalidProbability;
  }
}

// Calculates the number of categories based on the metric_definition.
//
// - If there is exactly 1 metric_dimensions, return
//   metric_dimensions[0].max_event_code() + 1 (this is the new registry).
//
// - Otherwise, return 0 and report an error (this is not a supported registry).
size_t RapporConfigHelper::BasicRapporNumCategories(const MetricDefinition& metric_definition) {
  if (metric_definition.metric_dimensions_size() == 1) {
    return metric_definition.metric_dimensions(0).max_event_code() + 1;
  }

  LOG(ERROR) << "Invalid Cobalt registry: Metric " << metric_definition.metric_name() << " has "
             << metric_definition.metric_dimensions_size()
             << " metric_dimensions. (expected exactly 1)";
  return 0;
}

}  // namespace cobalt::rappor
