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

#ifndef COMPONENTS_SYNC_DEVICE_INFO_DEVICE_INFO_SYNC_CLIENT_H_
#define COMPONENTS_SYNC_DEVICE_INFO_DEVICE_INFO_SYNC_CLIENT_H_

#include <optional>
#include <string>

#include "components/desktop_to_mobile_promos/features.h"
#include "components/sync/base/data_type.h"
#include "components/sync/protocol/device_info_specifics.pb.h"
#include "components/sync_device_info/device_info.h"

namespace syncer {

// Interface for clients of DeviceInfoSyncService.
class DeviceInfoSyncClient {
 public:
  DeviceInfoSyncClient();

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

  virtual ~DeviceInfoSyncClient();

  virtual std::string GetSigninScopedDeviceId() const = 0;
  virtual bool GetSendTabToSelfReceivingEnabled() const = 0;
  virtual DeviceInfo::SendTabReceivingType GetSendTabToSelfReceivingType()
      const = 0;
  virtual std::optional<DeviceInfo::SharingInfo> GetLocalSharingInfo()
      const = 0;

  // Returns current FCM registration token if known, empty if the invalidation
  // service is not enabled. std::nullopt will be returned if the token has
  // been requested but hasn't been retrieved yet.
  virtual std::optional<std::string> GetFCMRegistrationToken() const = 0;

  // A list of enabled data types, std::nullopt if the invalidation service is
  // not initialized yet.
  virtual std::optional<DataTypeSet> GetInterestedDataTypes() const = 0;

  // Returns registration information for using a phone-as-a-security-key, or
  // else one of the special `Status` values to indicate that the information
  // isn't ready yet.
  virtual DeviceInfo::PhoneAsASecurityKeyInfo::StatusOrInfo
  GetPhoneAsASecurityKeyInfo() const = 0;

  // Returns whether a CrOS device has User Metric Analysis (UMA) enabled.
  // Returns false if method is called on non-CrOS device.
  virtual bool IsUmaEnabledOnCrOSDevice() const = 0;

  // Returns whether the receiving end of the Desktop to iOS promo is enabled.
  virtual bool GetDesktopToIOSPromoReceivingEnabled() const = 0;
  virtual MobilePromoOnDesktopPromoTypeSet GetDesktopToIOSPromoReceivingTypes()
      const = 0;

  // Returns the local Glic experimental triggering opt-in state.
  virtual DeviceInfo::GlicExperimentalTriggeringState
  GetGlicExperimentalTriggeringState() const = 0;

  // Returns the local Glic experimental triggering protocol version supported
  // by the current client, or std::nullopt if unavailable.
  virtual std::optional<int> GetGlicExperimentalTriggeringVersion() const = 0;

  // Returns Personal Context specific information for this device, or
  // std::nullopt if unavailable.
  virtual std::optional<DeviceInfo::PersonalContextInfo>
  GetLocalPersonalContextInfo() const = 0;
};

}  // namespace syncer

#endif  // COMPONENTS_SYNC_DEVICE_INFO_DEVICE_INFO_SYNC_CLIENT_H_
