/*
 *  Copyright 2024 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#import "RTCRtpCapabilities+Private.h"

#import "RTCRtpCodecCapability+Private.h"
#import "RTCRtpHeaderExtensionCapability+Private.h"

#import "base/RTCLogging.h"
#import "helpers/NSString+StdString.h"

@implementation RTC_OBJC_TYPE (RTCRtpCapabilities)

@synthesize codecs = _codecs;
@synthesize headerExtensions = _headerExtensions;

- (instancetype)init {
  webrtc::RtpCapabilities nativeRtpCapabilities;
  return [self initWithNativeRtpCapabilities:nativeRtpCapabilities];
}

- (instancetype)initWithNativeRtpCapabilities:
    (const webrtc::RtpCapabilities &)nativeRtpCapabilities {
  self = [super init];
  if (self) {
    NSMutableArray *codecs = [[NSMutableArray alloc] init];
    for (const auto &codec : nativeRtpCapabilities.codecs) {
      [codecs addObject:[[RTC_OBJC_TYPE(RTCRtpCodecCapability) alloc]
                            initWithNativeRtpCodecCapability:codec]];
    }
    _codecs = codecs;

    NSMutableArray *headerExtensions = [[NSMutableArray alloc] init];
    for (const auto &headerExtension : nativeRtpCapabilities.header_extensions) {
      [headerExtensions addObject:[[RTC_OBJC_TYPE(RTCRtpHeaderExtensionCapability) alloc]
                                      initWithNativeRtpHeaderExtensionCapability:headerExtension]];
    }
    _headerExtensions = headerExtensions;
  }
  return self;
}

- (webrtc::RtpCapabilities)nativeRtpCapabilities {
  webrtc::RtpCapabilities rtpCapabilities;
  for (RTC_OBJC_TYPE(RTCRtpCodecCapability) * codec in _codecs) {
    rtpCapabilities.codecs.push_back(codec.nativeRtpCodecCapability);
  }
  for (RTC_OBJC_TYPE(RTCRtpHeaderExtensionCapability) * headerExtension in _headerExtensions) {
    rtpCapabilities.header_extensions.push_back(headerExtension.nativeRtpHeaderExtensionCapability);
  }
  return rtpCapabilities;
}

@end
