// 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.

#include "components/sync_device_info/fake_local_device_info_provider.h"

#include <optional>

#include "base/notimplemented.h"
#include "base/time/time.h"
#include "components/sync/base/data_type.h"
#include "components/sync_device_info/device_info.h"
#include "components/sync_device_info/device_info_util.h"

namespace syncer {

FakeLocalDeviceInfoProvider::FakeLocalDeviceInfoProvider()
    : device_info_("id",
                   "name",
                   "chrome_version",
                   "user_agent",
                   DeviceInfo::DeviceType::kLinux,
                   DeviceInfo::OsType::kLinux,
                   DeviceInfo::FormFactor::kDesktop,
                   "device_id",
                   "fake_manufacturer",
                   "fake_model",
                   /*server_determined_model_name=*/std::nullopt,
                   "fake_full_hardware_class",
                   /*last_updated_timestamp=*/base::Time::Now(),
                   DeviceInfoUtil::GetPulseInterval(),
                   /*send_tab_to_self_receiving_enabled=*/
                   false,
                   /*send_tab_to_self_receiving_type=*/
                   DeviceInfo::SendTabReceivingType::kChromeOrUnspecified,
                   /*sharing_info=*/std::nullopt,
                   /*paask_info=*/std::nullopt,
                   /*fcm_registration_token=*/std::string(),
                   /*interested_data_types=*/DataTypeSet(),
                   /*auto_sign_out_last_signin_timestamp=*/
                   std::nullopt,
                   /*desktop_to_ios_promo_receiving_enabled=*/false,
                   /*desktop_to_ios_promo_receiving_types=*/
                   MobilePromoOnDesktopPromoTypeSet{},
                   /*glic_experimental_triggering_state=*/
                   DeviceInfo::GlicExperimentalTriggeringState::kUnavailable,
                   /*glic_experimental_triggering_version=*/
                   std::nullopt,
                   /*android_os_build_fingerprint_prefix=*/std::nullopt,
                   /*personal_context_info=*/std::nullopt) {}

FakeLocalDeviceInfoProvider::~FakeLocalDeviceInfoProvider() = default;

version_info::Channel FakeLocalDeviceInfoProvider::GetChannel() const {
  NOTIMPLEMENTED();
  return version_info::Channel::UNKNOWN;
}

const DeviceInfo* FakeLocalDeviceInfoProvider::GetLocalDeviceInfo() const {
  return ready_ ? &device_info_ : nullptr;
}

base::CallbackListSubscription
FakeLocalDeviceInfoProvider::RegisterOnInitializedCallback(
    const base::RepeatingClosure& callback) {
  return closure_list_.Add(callback);
}

void FakeLocalDeviceInfoProvider::Initialize(
    const std::string& cache_guid,
    const std::string& client_name,
    const std::string& manufacturer_name,
    const std::string& model_name,
    const std::string& full_hardware_class,
    std::optional<std::string> android_os_build_fingerprint_prefix,
    const DeviceInfo* device_info_restored_from_store) {}

void FakeLocalDeviceInfoProvider::Clear() {}

void FakeLocalDeviceInfoProvider::UpdateClientName(
    const std::string& client_name) {
  device_info_.set_client_name(client_name);
}

void FakeLocalDeviceInfoProvider::UpdateRecentSignInTime(base::Time time) {
  device_info_.set_auto_sign_out_last_signin_timestamp(time);
}

void FakeLocalDeviceInfoProvider::SetReady(bool ready) {
  bool got_ready = !ready_ && ready;
  ready_ = ready;
  if (got_ready) {
    closure_list_.Notify();
  }
}

DeviceInfo* FakeLocalDeviceInfoProvider::GetMutableDeviceInfo() {
  return &device_info_;
}

}  // namespace syncer
