/*
 * Copyright 2015 Google Inc. 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.h"
#include "cobalt/input/input_device_manager.h"

namespace cobalt {
namespace input {

// This input fuzzer will continously 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_
