// Copyright 2020 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/developer/debug/zxdb/console/analytics.h"

#include "src/developer/debug/zxdb/client/setting_schema_definition.h"
#include "src/developer/debug/zxdb/common/version.h"
#include "src/lib/analytics/cpp/core_dev_tools/general_parameters.h"
#include "src/lib/analytics/cpp/core_dev_tools/system_info.h"

namespace zxdb {

using ::analytics::GetOsVersion;
using ::analytics::core_dev_tools::AnalyticsOption;
using ::analytics::core_dev_tools::GeneralParameters;
using ::analytics::core_dev_tools::GoogleAnalyticsEvent;

void Analytics::Init(Session& session, AnalyticsOption analytics_option) {
  InitBotAware(analytics_option, false);
  session.system().settings().SetBool(ClientSettings::System::kEnableAnalytics, enabled_runtime_);
}

bool Analytics::IsEnabled(Session* session) {
  return !ClientIsCleanedUp() &&
         session->system().settings().GetBool(ClientSettings::System::kEnableAnalytics);
}

void Analytics::IfEnabledSendInvokeEvent(Session* session) {
  if (IsEnabled(session)) {
    GeneralParameters parameters;
    parameters.SetOsVersion(GetOsVersion());
    parameters.SetApplicationVersion(kBuildVersion);

    // Set an empty application name (an) to make application version (av) usable. Otherwise, the
    // hit will be treated as invalid by Google Analytics.
    // See https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#an
    // for more information.
    parameters.SetApplicationName("");

    GoogleAnalyticsEvent event(kEventCategoryGeneral, kEventActionInvoke);
    event.AddGeneralParameters(parameters);
    SendGoogleAnalyticsHit(event);
  }
}

}  // namespace zxdb
