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

#ifndef CHROME_COMMON_PRIVACY_BUDGET_SCOPED_PRIVACY_BUDGET_CONFIG_H_
#define CHROME_COMMON_PRIVACY_BUDGET_SCOPED_PRIVACY_BUDGET_CONFIG_H_

#include <limits>
#include <map>
#include <vector>

#include "base/test/scoped_feature_list.h"
#include "chrome/common/privacy_budget/types.h"
#include "third_party/blink/public/common/privacy_budget/identifiable_surface.h"

namespace test {

// Configures the privacy budget feature settings for testing. One can also
// configure the service manually by setting the global feature lists
// directly. This class is merely a convenience.
//
// For testing only.
//
// Note 1: Since we are changing feature lists, the same caveats as
//     base::test::ScopedFeatureList apply. E.g. The Apply() method should be
//     called prior to starting the threads in multi threaded environments.
//
// Note 2: The configuration applied by this class is *scoped*. The destructor
//     reverts the configuration changes.
class ScopedPrivacyBudgetConfig {
 public:
  // The default generation is arbitrary. The only thing special about this
  // number is that it is the default.
  constexpr static int kDefaultGeneration = 17;

  // An expected surface count of one implies that the probability of selecting
  // a surface is 1/1.
  constexpr static int kDefaultExpectedSurfaceCount = 1;

  // These fields correspond to the equivalent features described in
  // privacy_budget_features.h
  //
  // The default values enable the identifiability study with a sampling rate of
  // 1, which means every surface is included in UKM reports.
  struct Parameters {
    Parameters();
    Parameters(const Parameters&);
    Parameters(Parameters&&);
    ~Parameters();

    bool enabled = true;
    int generation = kDefaultGeneration;

    IdentifiableSurfaceList blocked_surfaces;
    IdentifiableSurfaceTypeList blocked_types;
    int expected_surface_count = kDefaultExpectedSurfaceCount;
    int active_surface_budget = std::numeric_limits<int>::max();
    IdentifiableSurfaceCostMap per_surface_cost;
    IdentifiableSurfaceTypeCostMap per_type_cost;
    SurfaceSetEquivalentClassesList equivalence_classes;
    IdentifiableSurfaceBlocks blocks;
    std::vector<double> block_weights;
    std::vector<blink::IdentifiableSurface::Type> allowed_random_types;
  };

  enum Presets {
    // Represents the default state of `Parameters` which enables the study with
    // the default Parameters values.
    kEnable,

    // Disables the study. The other parameters are undefined and should not be
    // relied upon.
    kDisable
  };

  // Doesn't do anything until Apply() is called.
  ScopedPrivacyBudgetConfig();

  // Applies the configuration indicated by `preset`.
  explicit ScopedPrivacyBudgetConfig(Presets preset);

  // Constructs and applies the configuration described in `parameters`. No need
  // to call Apply()
  explicit ScopedPrivacyBudgetConfig(const Parameters& parameters);

  ~ScopedPrivacyBudgetConfig();

  // Apply the configuration as described in `parameters`. Should only be called
  // once per instance.
  void Apply(const Parameters& parameters);

  ScopedPrivacyBudgetConfig(const ScopedPrivacyBudgetConfig&) = delete;
  ScopedPrivacyBudgetConfig& operator=(const ScopedPrivacyBudgetConfig&) =
      delete;

 private:
  base::test::ScopedFeatureList scoped_feature_list_;
  bool applied_ = false;
};

}  // namespace test

#endif  // CHROME_COMMON_PRIVACY_BUDGET_SCOPED_PRIVACY_BUDGET_CONFIG_H_
