// Copyright 2018 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_CONNECTIVITY_BLUETOOTH_EXAMPLES_BT_BEACON_READER_BEACONS_H_
#define SRC_CONNECTIVITY_BLUETOOTH_EXAMPLES_BT_BEACON_READER_BEACONS_H_

#include <memory>

#include <fuchsia/bluetooth/le/cpp/fidl.h>

namespace bt_beacon_reader {

// Represents the detection of an iBeacon
class IBeaconDetection {
 public:
  // Examine a BLE detection and determine if it is a beacon.
  // If it is a beacon, fills out this class and returns it.
  // Otherwise, returns a nullptr.
  static std::unique_ptr<IBeaconDetection> Create(
      const fuchsia::bluetooth::le::RemoteDevice& device);

  uint8_t power_lvl_ = 0;
  std::string uuid_;
  uint16_t major_, minor_;

 private:
  // Reads in the manufacturing data from a BLE detection
  // to fill out the class.
  void Read(const std::vector<uint8_t>& data);
};

// Represents the detection of a Tilt Hydrometer beacon
class TiltDetection {
 public:
  static std::unique_ptr<TiltDetection> Create(
      const fuchsia::bluetooth::le::RemoteDevice& device);

  void Print();

 private:
  // Examine a BLE detection and determine if it is a beacon.
  // If it is a beacon, fills out this class and returns true.
  void Read(const std::unique_ptr<IBeaconDetection>& beacon);

  uint16_t temperature_F_;
  float gravity_;
  uint8_t color_;
  std::string color_string_;
  std::string identifier_;
};

}  // namespace bt_beacon_reader

#endif  // SRC_CONNECTIVITY_BLUETOOTH_EXAMPLES_BT_BEACON_READER_BEACONS_H_
