// 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 "ui/ozone/public/stub_input_controller.h"

#include <memory>

#include "base/functional/callback.h"
#include "base/memory/raw_ref.h"
#include "base/notimplemented.h"
#include "base/time/time.h"
#include "ui/events/devices/stylus_state.h"

namespace ui {

class ScopedDisableInputDevicesImpl : public ScopedDisableInputDevices {
 public:
  explicit ScopedDisableInputDevicesImpl(StubInputController& parent)
      : parent_(parent) {
    parent_->num_scoped_input_devices_disablers_++;
  }

  ~ScopedDisableInputDevicesImpl() override {
    parent_->num_scoped_input_devices_disablers_--;
  }

 private:
  raw_ref<StubInputController> parent_;
};

bool StubInputController::HasMouse() {
  return false;
}
bool StubInputController::HasPointingStick() {
  return false;
}
bool StubInputController::HasTouchpad() {
  return false;
}
bool StubInputController::HasHapticTouchpad() {
  return false;
}
bool StubInputController::IsCapsLockEnabled() {
  return false;
}
void StubInputController::SetCapsLockEnabled(bool enabled) {}
void StubInputController::SetNumLockEnabled(bool enabled) {}
bool StubInputController::IsAutoRepeatEnabled() {
  return true;
}
void StubInputController::SetAutoRepeatEnabled(bool enabled) {}
void StubInputController::SetAutoRepeatRate(const base::TimeDelta& delay,
                                            const base::TimeDelta& interval) {}
void StubInputController::GetAutoRepeatRate(base::TimeDelta* delay,
                                            base::TimeDelta* interval) {}
void StubInputController::SetSlowKeysEnabled(bool enabled) {}
bool StubInputController::IsSlowKeysEnabled() const {
  return false;
}
void StubInputController::SetSlowKeysDelay(base::TimeDelta delay) {}
void StubInputController::SetCurrentLayoutByName(
    const std::string& layout_name,
    base::OnceCallback<void(bool success)> callback) {
  std::move(callback).Run(/*success=*/false);
}
void StubInputController::SetKeyboardKeyBitsMapping(
    base::flat_map<int, std::vector<uint64_t>> key_bits_mapping) {}
std::vector<uint64_t> StubInputController::GetKeyboardKeyBits(int id) {
  return std::vector<uint64_t>();
}
void StubInputController::SetTouchEventLoggingEnabled(bool enabled) {
  NOTIMPLEMENTED_LOG_ONCE();
}
void StubInputController::SuspendMouseAcceleration() {}
void StubInputController::EndMouseAccelerationSuspension() {}
void StubInputController::SetThreeFingerClick(bool enabled) {}
void StubInputController::SetTouchpadSensitivity(std::optional<int> device_id,
                                                 int value) {}
void StubInputController::SetTouchpadScrollSensitivity(
    std::optional<int> device_id,
    int value) {}
void StubInputController::SetTouchpadHapticFeedback(
    std::optional<int> device_id,
    bool enabled) {}
void StubInputController::SetTouchpadHapticClickSensitivity(
    std::optional<int> device_id,
    int value) {}
void StubInputController::SetTapToClick(std::optional<int> device_id,
                                        bool enabled) {}
void StubInputController::SetTapDragging(std::optional<int> device_id,
                                         bool enabled) {}
void StubInputController::SetNaturalScroll(std::optional<int> device_id,
                                           bool enabled) {}
void StubInputController::SetMouseSensitivity(std::optional<int> device_id,
                                              int value) {}
void StubInputController::SetMouseScrollSensitivity(
    std::optional<int> device_id,
    int value) {}
void StubInputController::SetMouseReverseScroll(std::optional<int> device_id,
                                                bool enabled) {}
void StubInputController::SetMouseAcceleration(std::optional<int> device_id,
                                               bool enabled) {}
void StubInputController::SetMouseScrollAcceleration(
    std::optional<int> device_id,
    bool enabled) {}
void StubInputController::SetPointingStickSensitivity(
    std::optional<int> device_id,
    int value) {}
void StubInputController::SetPointingStickAcceleration(
    std::optional<int> device_id,
    bool enabled) {}
void StubInputController::SetTouchpadAcceleration(std::optional<int> device_id,
                                                  bool enabled) {}
void StubInputController::SetTouchpadScrollAcceleration(
    std::optional<int> device_id,
    bool enabled) {}
void StubInputController::SetPrimaryButtonRight(std::optional<int> device_id,
                                                bool right) {}
void StubInputController::SetPointingStickPrimaryButtonRight(
    std::optional<int> device_id,
    bool right) {}
void StubInputController::SetGamepadKeyBitsMapping(
    base::flat_map<int, std::vector<uint64_t>> key_bits_mapping) {}
std::vector<uint64_t> StubInputController::GetGamepadKeyBits(int id) {
  return std::vector<uint64_t>();
}
void StubInputController::SetTapToClickPaused(bool state) {}
void StubInputController::GetTouchDeviceStatus(
    GetTouchDeviceStatusReply reply) {
  std::move(reply).Run(std::string());
}
void StubInputController::GetTouchEventLog(const base::FilePath& out_dir,
                                           GetTouchEventLogReply reply) {
  std::move(reply).Run(std::vector<base::FilePath>());
}
void StubInputController::DescribeForLog(DescribeForLogReply reply) const {
  std::move(reply).Run(std::string());
}
void StubInputController::SetInternalTouchpadEnabled(bool enabled) {}
bool StubInputController::IsInternalTouchpadEnabled() const {
  return false;
}
void StubInputController::SetTouchscreensEnabled(bool enabled) {}
void StubInputController::GetStylusSwitchState(
    GetStylusSwitchStateReply reply) {
  std::move(reply).Run(ui::StylusState::REMOVED);
}
void StubInputController::SetInternalKeyboardFilter(
    bool enable_filter,
    std::vector<DomCode> allowed_keys) {}
void StubInputController::GetGesturePropertiesService(
    mojo::PendingReceiver<ui::ozone::mojom::GesturePropertiesService>
        receiver) {}
void StubInputController::PlayVibrationEffect(int id,
                                              uint8_t amplitude,
                                              uint16_t duration_millis) {}
void StubInputController::StopVibration(int id) {}
void StubInputController::PlayHapticTouchpadEffect(
    HapticTouchpadEffect effect_type,
    HapticTouchpadEffectStrength strength) {}
void StubInputController::SetHapticTouchpadEffectForNextButtonRelease(
    HapticTouchpadEffect effect_type,
    HapticTouchpadEffectStrength strength) {}
bool StubInputController::AreAnyKeysPressed() {
  return false;
}
void StubInputController::BlockModifiersOnDevices(std::vector<int> device_ids) {
}

bool StubInputController::AreInputDevicesEnabled() const {
  return num_scoped_input_devices_disablers_ == 0;
}
std::unique_ptr<ScopedDisableInputDevices>
StubInputController::DisableInputDevices() {
  return std::make_unique<ScopedDisableInputDevicesImpl>(*this);
}

void StubInputController::DisableKeyboardImposterCheck() {}

}  // namespace ui
