// Copyright 2013 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 CHROMEOS_SYSTEM_STATISTICS_PROVIDER_H_
#define CHROMEOS_SYSTEM_STATISTICS_PROVIDER_H_

#include <string>

#include "base/memory/ref_counted.h"
#include "chromeos/chromeos_export.h"

namespace base {
class TaskRunner;
}

namespace chromeos {
namespace system {

// Developer switch value.
CHROMEOS_EXPORT extern const char kDevSwitchBootMode[];

// Customization ID key.
CHROMEOS_EXPORT extern const char kCustomizationIdKey[];

// HWID key.
CHROMEOS_EXPORT extern const char kHardwareClassKey[];

// OEM customization flag that permits exiting enterprise enrollment flow in
// OOBE when 'oem_enterprise_managed' flag is set.
CHROMEOS_EXPORT extern const char kOemCanExitEnterpriseEnrollmentKey[];

// OEM customization directive that specified intended device purpose.
CHROMEOS_EXPORT extern const char kOemDeviceRequisitionKey[];

// OEM customization flag that enforces enterprise enrollment flow in OOBE.
CHROMEOS_EXPORT extern const char kOemIsEnterpriseManagedKey[];

// OEM customization flag that specifies if OOBE flow should be enhanced for
// keyboard driven control.
CHROMEOS_EXPORT extern const char kOemKeyboardDrivenOobeKey[];

// Offer coupon code key.
CHROMEOS_EXPORT extern const char kOffersCouponCodeKey[];

// Offer group key.
CHROMEOS_EXPORT extern const char kOffersGroupCodeKey[];

// Release Brand Code key.
CHROMEOS_EXPORT extern const char kRlzBrandCodeKey[];

// Activation date key.
CHROMEOS_EXPORT extern const char kActivateDateKey[];

// This interface provides access to Chrome OS statistics.
class CHROMEOS_EXPORT StatisticsProvider {
 public:
  // Starts loading the machine statistics. File operations are performed on
  // |file_task_runner|.
  virtual void StartLoadingMachineStatistics(
      const scoped_refptr<base::TaskRunner>& file_task_runner,
      bool load_oem_manifest) = 0;

  // Retrieves the named machine statistic (e.g. "hardware_class"). If |name|
  // is found, sets |result| and returns true. Safe to call from any thread
  // except the task runner passed to Initialize() (e.g. FILE). This may block
  // if called early before the statistics are loaded from disk.
  // StartLoadingMachineStatistics() must be called before this.
  virtual bool GetMachineStatistic(const std::string& name,
                                   std::string* result) = 0;

  // Checks whether a machine statistic is present.
  virtual bool HasMachineStatistic(const std::string& name) = 0;

  // Similar to GetMachineStatistic for boolean flags.
  virtual bool GetMachineFlag(const std::string& name, bool* result) = 0;

  // Checks whether a machine flag is present.
  virtual bool HasMachineFlag(const std::string& name) = 0;

  // Cancels any pending file operations.
  virtual void Shutdown() = 0;

  // Get the Singleton instance.
  static StatisticsProvider* GetInstance();

  // Set the instance returned by GetInstance() for testing.
  static void SetTestProvider(StatisticsProvider* test_provider);

 protected:
  virtual ~StatisticsProvider() {}
};

}  // namespace system
}  // namespace chromeos

#endif  // CHROMEOS_SYSTEM_STATISTICS_PROVIDER_H_
