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

#include "components/payments/core/payment_request_metrics.h"

#include <string>

#include "base/metrics/histogram_functions.h"
#include "base/strings/strcat.h"
#include "components/payments/core/payment_prefs.h"
#include "components/prefs/pref_service.h"

namespace payments {

namespace {
// Returns the appropriate `CanMakePaymentPreferenceSetter` entry for `pref`.
CanMakePaymentPreferenceSetter GetCanMakePaymentPreferenceSetter(
    const PrefService::Preference* pref) {
  if (pref->IsUserControlled()) {
    return CanMakePaymentPreferenceSetter::kUserSetting;
  } else if (pref->IsExtensionControlled()) {
    return CanMakePaymentPreferenceSetter::kExtension;
  } else if (pref->IsManagedByCustodian()) {
    return CanMakePaymentPreferenceSetter::kCustodian;
  } else if (pref->IsManaged() || pref->IsRecommended()) {
    return CanMakePaymentPreferenceSetter::kAdminPolicy;
  } else {
    return CanMakePaymentPreferenceSetter::kUnknown;
  }
}

}  // namespace

void RecordCanMakePaymentPrefMetrics(const PrefService& pref_service,
                                     const std::string& suffix) {
  const PrefService::Preference* pref =
      pref_service.FindPreference(payments::kCanMakePaymentEnabled);
  // The kCanMakePaymentEnabled pref should already be registered, so `pref`
  // must be non-null.
  CHECK(pref);

  const bool can_make_payment_enabled = pref->GetValue()->GetBool();
  base::UmaHistogramBoolean(
      base::StrCat({"PaymentRequest.IsCanMakePaymentAllowedByPref.", suffix}),
      can_make_payment_enabled);

  if (!can_make_payment_enabled) {
    base::UmaHistogramEnumeration(
        base::StrCat({"PaymentRequest.IsCanMakePaymentAllowedByPref.", suffix,
                      ".DisabledReason"}),
        GetCanMakePaymentPreferenceSetter(pref));
  }
}

}  // namespace payments
