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

#ifndef SRC_UI_LIB_INPUT_READER_HARDCODED_H_
#define SRC_UI_LIB_INPUT_READER_HARDCODED_H_

#include <fuchsia/ui/input/cpp/fidl.h>

#include <array>
#include <cstddef>

#include <hid-parser/parser.h>
#include <hid-parser/usages.h>
#include <hid/acer12.h>
#include <hid/paradise.h>

#include "src/ui/lib/input_reader/hid_decoder.h"
#include "src/ui/lib/input_reader/protocols.h"

namespace ui_input {

class Hardcoded {
 public:
  const std::string& name() const { return name_; }

  // Matches a protocol with a hardcoded HID Report Descriptor |desc|.
  // Returns |Protocol::Other| if there's no match. |hid_decoder| is passed
  // so some setup can be done if it's a special device.
  Protocol MatchProtocol(const std::vector<uint8_t> desc, HidDecoder* hid_decoder);
  void Initialize(Protocol protocol);
  void NotifyRegistry(fuchsia::ui::input::InputDeviceRegistry* registry);
  void Read(const uint8_t* report, int report_len, bool discard);

  bool ParseGamepadDescriptor(const hid::ReportField* fields, size_t count);
  bool ParseAmbientLightDescriptor(const hid::ReportField* fields, size_t count);

 private:
  struct DataLocator {
    uint32_t begin;
    uint32_t count;
    uint32_t match;
  };

  struct HidGamepadSimple {
    int32_t left_x;
    int32_t left_y;
    int32_t right_x;
    int32_t right_y;
    uint32_t hat_switch;
  };

  struct HidAmbientLightSimple {
    int16_t illuminance;
  };

  bool ParseKeyboardReport(const uint8_t* report, size_t len,
                           fuchsia::ui::input::InputReport* keyboard_report);
  void ParseMouseReport(const uint8_t* report, size_t len,
                        fuchsia::ui::input::InputReport* mouse_report);
  bool ParseGamepadMouseReport(const uint8_t* report, size_t len,
                               fuchsia::ui::input::InputReport* mouse_report);
  bool ParseParadiseSensorReport(const uint8_t* report, size_t len, uint8_t* sensor_idx,
                                 fuchsia::ui::input::InputReport* sensor_report);
  bool ParseAmbientLightSensorReport(const uint8_t* report, size_t len, uint8_t* sensor_idx,
                                     fuchsia::ui::input::InputReport* sensor_report);
  bool ParseReport(const uint8_t* report, size_t len, HidGamepadSimple* gamepad);
  bool ParseReport(const uint8_t* report, size_t len, HidAmbientLightSimple* light);

  std::vector<DataLocator> decoder_;

  const std::string name_ = "Hardcoded Device";

  static const uint8_t kMaxSensorCount = 16;
  static const uint8_t kNoSuchSensor = 0xFF;

  bool has_keyboard_ = false;
  fuchsia::ui::input::KeyboardDescriptorPtr keyboard_descriptor_;
  bool has_mouse_ = false;
  fuchsia::ui::input::MouseDescriptorPtr mouse_descriptor_;
  bool has_stylus_ = false;
  fuchsia::ui::input::StylusDescriptorPtr stylus_descriptor_;
  bool has_touchscreen_ = false;
  fuchsia::ui::input::TouchscreenDescriptorPtr touchscreen_descriptor_;
  bool has_sensors_ = false;
  // Arrays are indexed by the sensor number that was assigned by Zircon.
  // Keeps track of the physical sensors multiplexed over the file descriptor.
  std::array<fuchsia::ui::input::SensorDescriptorPtr, kMaxSensorCount> sensor_descriptors_;
  std::array<fuchsia::ui::input::InputDevicePtr, kMaxSensorCount> sensor_devices_;

  MouseDeviceType mouse_device_type_ = MouseDeviceType::NONE;
  SensorDeviceType sensor_device_type_ = SensorDeviceType::NONE;

  // Keep track of which sensor gave us a report. Index into
  // |sensor_descriptors_| and |sensor_devices_|.
  uint8_t sensor_idx_ = kNoSuchSensor;

  fuchsia::ui::input::InputReportPtr keyboard_report_;
  fuchsia::ui::input::InputReportPtr mouse_report_;
  fuchsia::ui::input::InputReportPtr touchscreen_report_;
  fuchsia::ui::input::InputReportPtr stylus_report_;
  fuchsia::ui::input::InputReportPtr sensor_report_;

  fuchsia::ui::input::InputDevicePtr input_device_;

  Protocol protocol_;
};
}  // namespace ui_input

#endif  // SRC_UI_LIB_INPUT_READER_HARDCODED_H_
