// Copyright 2022 The Pigweed Authors
//
// 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
//
//     https://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.
#pragma once

#include <cstdint>

#include "pw_bluetooth/types.h"
#include "pw_containers/vector.h"
#include "pw_span/span.h"

namespace pw::bluetooth::low_energy {

// A service data field in an advertising data payload.
struct ServiceData {
  Uuid uuid;
  span<const std::byte> data;
};

// A manufacturer data field in an advertising data payload.
struct ManufacturerData {
  uint16_t company_id = 0;
  span<const std::byte> data;
};

// Represents advertising and scan response data that are transmitted by a LE
// peripheral or broadcaster.
struct AdvertisingData {
  // Long or short name of the device.
  std::string_view name;

  // The appearance of the local device.
  Appearance appearance = Appearance::kUnknown;

  Vector<Uuid> service_uuids;

  Vector<ServiceData> service_data;

  Vector<ManufacturerData> manufacturer_data;

  // String representing a URI to be advertised, as defined in IETF STD 66:
  // https://tools.ietf.org/html/std66. Each entry should be a UTF-8 string
  // including the scheme. For more information, see:
  // https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml for allowed
  // schemes;
  // https://www.bluetooth.com/specifications/assigned-numbers/uri-scheme-name-string-mapping
  // for code-points used by the system to compress the scheme to save space in
  // the payload.
  Vector<std::string_view> uris;

  // Indicates whether the current TX power level should be included in the
  // advertising data.
  bool include_tx_power_level = false;
};

}  // namespace pw::bluetooth::low_energy
