// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_INPUT_INPUT_DEVICE_MANAGER_FUZZER_H_
#define COBALT_INPUT_INPUT_DEVICE_MANAGER_FUZZER_H_

#include <vector>

#include "base/threading/thread.h"
#include "base/time/time.h"
#include "cobalt/input/input_device_manager.h"

namespace cobalt {
namespace input {

// This input fuzzer will continuously generate random input events.  It is a
// debug tool that can be used in place of a platform-specific
// InputDeviceManager that generates input events from an external controller
// device.
class InputDeviceManagerFuzzer : public InputDeviceManager {
 public:
  explicit InputDeviceManagerFuzzer(
      KeyboardEventCallback keyboard_event_callback);
  ~InputDeviceManagerFuzzer() override {}

 private:
  class KeyInfo {
   public:
    KeyInfo(const int* key_codes, size_t num_of_key_codes,
            base::TimeDelta delay);
    KeyInfo(const int* key_codes, size_t num_of_key_codes,
            base::TimeDelta minimum_delay, base::TimeDelta maximum_delay);
    KeyInfo(int key_code, base::TimeDelta delay);
    KeyInfo(int key_code, base::TimeDelta minimum_delay,
            base::TimeDelta maximum_delay);

    int GetRandomKeyCode() const;
    base::TimeDelta GetRandomDelay() const;

   private:
    std::vector<int> key_codes_;
    base::TimeDelta minimum_delay_;
    base::TimeDelta maximum_delay_;
  };

  void OnNextEvent();

  KeyboardEventCallback keyboard_event_callback_;
  size_t next_key_index_;
  std::vector<KeyInfo> key_infos_;

  base::Thread thread_;
};

}  // namespace input
}  // namespace cobalt

#endif  // COBALT_INPUT_INPUT_DEVICE_MANAGER_FUZZER_H_
