// 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 GARNET_BIN_UI_INPUT_READER_HARDCODED_H_
#define GARNET_BIN_UI_INPUT_READER_HARDCODED_H_

#include "garnet/bin/ui/input_reader/hid_decoder.h"
#include "garnet/bin/ui/input_reader/protocols.h"

#include <array>
#include <cstddef>

#include <fuchsia/ui/input/cpp/fidl.h>
#include <hid-parser/parser.h>
#include <hid-parser/usages.h>
#include <hid/acer12.h>
#include <hid/paradise.h>

namespace mozart {

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 std::vector<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 HidButtons {
    int8_t volume;
    bool mic_mute;
  };

  struct HidAmbientLightSimple {
    int16_t illuminance;
  };

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

  void ParseKeyboardReport(uint8_t* report, size_t len,
                           fuchsia::ui::input::InputReport* keyboard_report);
  void ParseMouseReport(uint8_t* report, size_t len,
                        fuchsia::ui::input::InputReport* mouse_report);
  bool ParseGamepadMouseReport(uint8_t* report, size_t len,
                               fuchsia::ui::input::InputReport* mouse_report);
  bool ParseAcer12TouchscreenReport(
      uint8_t* report, size_t len,
      fuchsia::ui::input::InputReport* touchscreen_report);
  bool ParseAcer12StylusReport(uint8_t* report, size_t len,
                               fuchsia::ui::input::InputReport* stylus_report);
  bool ParseSamsungTouchscreenReport(
      uint8_t* report, size_t len,
      fuchsia::ui::input::InputReport* touchscreen_report);
  bool ParseEGalaxTouchscreenReport(
      uint8_t* report, size_t len,
      fuchsia::ui::input::InputReport* touchscreen_report);
  bool ParseParadiseStylusReport(
      uint8_t* report, size_t len,
      fuchsia::ui::input::InputReport* stylus_report);
  bool ParseEyoyoTouchscreenReport(
      uint8_t* report, size_t len,
      fuchsia::ui::input::InputReport* touchscreen_report);
  bool ParseFt3x27TouchscreenReport(
      uint8_t* r, size_t len,
      fuchsia::ui::input::InputReport* touchscreen_report);
  bool ParseParadiseTouchscreenReportV1(
      uint8_t* r, size_t len,
      fuchsia::ui::input::InputReport* touchscreen_report);
  bool ParseParadiseTouchscreenReportV2(
      uint8_t* r, size_t len,
      fuchsia::ui::input::InputReport* touchscreen_report);
  bool ParseParadiseTouchpadReportV1(
      uint8_t* r, size_t len, fuchsia::ui::input::InputReport* touchpad_report);
  bool ParseParadiseTouchpadReportV2(
      uint8_t* r, size_t len, fuchsia::ui::input::InputReport* touchpad_report);
  bool ParseButtonsReport(const uint8_t* report, size_t len,
                          fuchsia::ui::input::InputReport* buttons_report);
  bool ParseParadiseSensorReport(
      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, HidButtons* data);
  bool ParseReport(const uint8_t* report, size_t len,
                   HidAmbientLightSimple* light);

  template <typename ReportT>
  bool ParseParadiseTouchscreenReport(
      uint8_t* report, size_t len,
      fuchsia::ui::input::InputReport* touchscreen_report);
  template <typename ReportT>
  bool ParseParadiseTouchpadReport(
      uint8_t* report, size_t len,
      fuchsia::ui::input::InputReport* mouse_report);

  std::vector<DataLocator> decoder_;
  acer12_touch_t acer12_touch_reports_[2] = {};
  // Used for converting absolute coords from paradise into relative deltas
  int32_t mouse_abs_x_ = -1;
  int32_t mouse_abs_y_ = -1;

  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_;

  TouchDeviceType touch_device_type_ = TouchDeviceType::NONE;
  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::InputReportPtr buttons_report_;

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

  Protocol protocol_;
};
}  // namespace mozart

#endif  // GARNET_BIN_UI_INPUT_READER_HARDCODED_H_
