// 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 <vector>

#include "pw_rpc/internal/channel.h"
#include "pw_rpc/internal/config.h"
#include "pw_span/span.h"

namespace pw::rpc::internal {

#if PW_RPC_DYNAMIC_ALLOCATION && !defined(__cpp_lib_constexpr_vector)
#define _PW_RPC_CONSTEXPR
#else
#define _PW_RPC_CONSTEXPR constexpr
#endif  // PW_RPC_DYNAMIC_ALLOCATION && !defined(__cpp_lib_constexpr_vector)

class ChannelList {
 public:
  _PW_RPC_CONSTEXPR ChannelList(span<Channel> channels) : channels_(channels) {}

  // Returns the first channel with the matching ID or nullptr if none match.
  // Except for Channel::kUnassignedChannelId, there should be no duplicate
  // channels.
  const Channel* Get(uint32_t channel_id) const;

  Channel* Get(uint32_t channel_id) {
    return const_cast<Channel*>(
        static_cast<const ChannelList&>(*this).Get(channel_id));
  }

  // Adds the channel with the requested ID to the list. Returns:
  //
  //   OK - the channel was added
  //   ALREADY_EXISTS - a channel with this ID is already present; remove it
  //       first
  //   RESOURCE_EXHAUSTED - no unassigned channels are available; only possible
  //       if PW_RPC_DYNAMIC_ALLOCATION is disabled
  //
  Status Add(uint32_t channel_id, ChannelOutput& output);

  // Removes the channel with the requested ID. Returns:
  //
  //   OK - the channel was removed
  //   NOT_FOUND - no channel with the provided ID was found
  //
  Status Remove(uint32_t channel_id);

#if PW_RPC_DYNAMIC_ALLOCATION
  std::vector<Channel> channels_;
#else
  span<Channel> channels_;
#endif  // PW_RPC_DYNAMIC_ALLOCATION
};

}  // namespace pw::rpc::internal
