// Copyright 2021 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_WLAN_LIB_COMMON_CPP_INCLUDE_WLAN_COMMON_CHANNEL_H_
#define SRC_CONNECTIVITY_WLAN_LIB_COMMON_CPP_INCLUDE_WLAN_COMMON_CHANNEL_H_

#include <fuchsia/hardware/wlan/associnfo/c/banjo.h>
#include <fuchsia/hardware/wlan/phyinfo/c/banjo.h>
#include <fuchsia/wlan/common/c/banjo.h>
#include <fuchsia/wlan/mlme/cpp/fidl.h>

#include <cstdint>
#include <string>

bool operator==(const wlan_channel_t& lhs, const wlan_channel_t& rhs);
bool operator!=(const wlan_channel_t& lhs, const wlan_channel_t& rhs);

namespace wlan {
namespace common {

typedef uint16_t Mhz;

// IEEE Std 802.11-2016, Annex E
// Note the distinction of index for primary20 and index for center frequency.
// Fuchsia OS minimizes the use of the notion of center frequency,
// with following exceptions:
// - CBW80P80's secondary frequency segment
// - Frequency conversion at device drivers
constexpr Mhz kBaseFreq2Ghz = 2407;
constexpr Mhz kBaseFreq5Ghz = 5000;

// TODO(porce): Replace all channel > 14 test throughout the codes
bool Is5Ghz(uint8_t channel_number);
bool Is2Ghz(uint8_t channel_number);
bool Is5Ghz(const wlan_channel_t& channel);
bool Is2Ghz(const wlan_channel_t& channel);

bool IsValidChan2Ghz(const wlan_channel_t& channel);
bool IsValidChan5Ghz(const wlan_channel_t& channel);
bool IsValidChan(const wlan_channel_t& channel);

Mhz GetCenterFreq(const wlan_channel_t& channel);
uint8_t GetCenterChanIdx(const wlan_channel_t& channel);

std::string ChanStr(const wlan_channel_t& channel);
std::string ChanStrLong(const wlan_channel_t& channel);

std::string GetPhyStr(wlan_info_phy_type_t phy);

struct Channel {
  wlan_channel_t channel;
  // TODO(porce): Validation
  // TODO(porce): Notation string.
  // TODO(porce): Center frequencies.
  // Define the rule to translsate center frequency to/from channel numbering.
  // See IEEE Std 802.11-2016 19.3.15
};

wlan_channel_t FromFidl(const ::fuchsia::wlan::common::WlanChannel& fidl_channel);
::fuchsia::wlan::common::WlanChannel ToFidl(const wlan_channel_t& channel);

wlan_info_phy_type_t FromFidl(::fuchsia::wlan::common::PHY phy);
::fuchsia::wlan::common::PHY ToFidl(wlan_info_phy_type_t phy);

const char* CbwSuffix(channel_bandwidth_t cbw);
const char* CbwStr(channel_bandwidth_t cbw);

}  // namespace common
}  // namespace wlan

#endif  // SRC_CONNECTIVITY_WLAN_LIB_COMMON_CPP_INCLUDE_WLAN_COMMON_CHANNEL_H_
