/*
 *  Copyright (c) 2026 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.
 */

#include "api/video_codecs/video_encoder_builders.h"

#include <cstdint>
#include <memory>
#include <optional>
#include <set>
#include <span>
#include <utility>
#include <variant>
#include <vector>

#include "api/function_view.h"
#include "api/units/data_rate.h"
#include "api/units/data_size.h"
#include "api/units/time_delta.h"
#include "api/video/resolution.h"
#include "api/video_codecs/video_encoder_factory_interface.h"
#include "api/video_codecs/video_encoder_interface.h"
#include "api/video_codecs/video_encoding_general.h"
#include "rtc_base/numerics/rational.h"

namespace webrtc {

// =============================================================================
// FrameEncodeSettingsBuilder implementation
// =============================================================================

FrameEncodeSettingsBuilder::FrameEncodeSettingsBuilder() {
  class IgnoredOutput : public VideoEncoderInterface::FrameOutput {
   public:
    std::span<uint8_t> GetBitstreamOutputBuffer(DataSize size) override {
      unread_.resize(size.bytes());
      return unread_;
    }
    void EncodeComplete(
        const VideoEncoderInterface::EncodeResult& /* encode_result */)
        override {}

   private:
    std::vector<uint8_t> unread_;
  };

  FrameOutput(std::make_unique<IgnoredOutput>());
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::CqpRateOptions(
    int target_qp) {
  settings_.set_cqp_options(target_qp);
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::CbrRateOptions(
    TimeDelta duration,
    DataRate target_bitrate) {
  settings_.set_cbr_options(duration, target_bitrate);
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::FrameType(
    VideoEncoderInterface::FrameType frame_type) {
  settings_.set_frame_type(frame_type);
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::TemporalId(
    int temporal_id) {
  settings_.set_temporal_id(temporal_id);
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::SpatialId(
    int spatial_id) {
  settings_.set_spatial_id(spatial_id);
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::Resolution(
    webrtc::Resolution resolution) {
  settings_.set_resolution(resolution);
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::ReferenceBuffers(
    std::vector<int> reference_buffers) {
  settings_.set_reference_buffers(std::move(reference_buffers));
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::UpdateBuffer(
    std::optional<int> update_buffer) {
  settings_.set_update_buffer(update_buffer);
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::EffortLevel(
    int effort_level) {
  settings_.set_effort_level(effort_level);
  return *this;
}

FrameEncodeSettingsBuilder& FrameEncodeSettingsBuilder::FrameOutput(
    std::unique_ptr<VideoEncoderInterface::FrameOutput> frame_output) {
  settings_.set_frame_output(std::move(frame_output));
  return *this;
}

VideoEncoderInterface::FrameEncodeSettings FrameEncodeSettingsBuilder::Build() {
  return std::move(settings_);
}

FrameEncodeSettingsBuilder::operator VideoEncoderInterface::
    FrameEncodeSettings() {
  return Build();
}

// =============================================================================
// StaticEncoderSettingsBuilder implementation
// =============================================================================

StaticEncoderSettingsBuilder& StaticEncoderSettingsBuilder::MaxEncodeDimensions(
    webrtc::Resolution max_encode_dimensions) {
  settings_.set_max_encode_dimensions(max_encode_dimensions);
  return *this;
}

StaticEncoderSettingsBuilder& StaticEncoderSettingsBuilder::EncodingFormat(
    webrtc::EncodingFormat encoding_format) {
  settings_.set_encoding_format(encoding_format);
  return *this;
}

StaticEncoderSettingsBuilder& StaticEncoderSettingsBuilder::RcMode(
    std::variant<VideoEncoderFactoryInterface::StaticEncoderSettings::Cqp,
                 VideoEncoderFactoryInterface::StaticEncoderSettings::Cbr>
        rc_mode) {
  settings_.set_rc_mode(std::move(rc_mode));
  return *this;
}

StaticEncoderSettingsBuilder& StaticEncoderSettingsBuilder::CqpRcMode() {
  settings_.set_rc_mode(
      VideoEncoderFactoryInterface::StaticEncoderSettings::Cqp());
  return *this;
}

StaticEncoderSettingsBuilder& StaticEncoderSettingsBuilder::CbrRcMode(
    TimeDelta max_buffer_size,
    TimeDelta target_buffer_size,
    double max_intra_bitrate_factor) {
  settings_.set_rc_mode(
      VideoEncoderFactoryInterface::StaticEncoderSettings::Cbr{
          .max_buffer_size = max_buffer_size,
          .target_buffer_size = target_buffer_size,
          .max_intra_bitrate_factor = max_intra_bitrate_factor});
  return *this;
}

StaticEncoderSettingsBuilder& StaticEncoderSettingsBuilder::MaxNumberOfThreads(
    int max_number_of_threads) {
  settings_.set_max_number_of_threads(max_number_of_threads);
  return *this;
}

VideoEncoderFactoryInterface::StaticEncoderSettings
StaticEncoderSettingsBuilder::Build() {
  return settings_;
}

// =============================================================================
// PredictionConstraintsBuilder implementation
// =============================================================================

PredictionConstraintsBuilder& PredictionConstraintsBuilder::NumBuffers(
    int num_buffers) {
  constraints_.set_num_buffers(num_buffers);
  return *this;
}

PredictionConstraintsBuilder& PredictionConstraintsBuilder::MaxReferences(
    int max_references) {
  constraints_.set_max_references(max_references);
  return *this;
}

PredictionConstraintsBuilder& PredictionConstraintsBuilder::MaxTemporalLayers(
    int max_temporal_layers) {
  constraints_.set_max_temporal_layers(max_temporal_layers);
  return *this;
}

PredictionConstraintsBuilder& PredictionConstraintsBuilder::BufferSpaceType(
    VideoEncoderFactoryInterface::Capabilities::PredictionConstraints::
        BufferSpaceType buffer_space_type) {
  constraints_.set_buffer_space_type(buffer_space_type);
  return *this;
}

PredictionConstraintsBuilder& PredictionConstraintsBuilder::MaxSpatialLayers(
    int max_spatial_layers) {
  constraints_.set_max_spatial_layers(max_spatial_layers);
  return *this;
}

PredictionConstraintsBuilder& PredictionConstraintsBuilder::ScalingFactors(
    std::vector<Rational> scaling_factors) {
  constraints_.set_scaling_factors(std::move(scaling_factors));
  return *this;
}

PredictionConstraintsBuilder& PredictionConstraintsBuilder::SupportedFrameTypes(
    std::set<VideoEncoderInterface::FrameType> supported_frame_types) {
  constraints_.set_supported_frame_types(std::move(supported_frame_types));
  return *this;
}

VideoEncoderFactoryInterface::Capabilities::PredictionConstraints
PredictionConstraintsBuilder::Build() {
  return constraints_;
}

// =============================================================================
// CapabilitiesBuilder implementation
// =============================================================================

CapabilitiesBuilder& CapabilitiesBuilder::WithPredictionConstraints(
    FunctionView<void(
        VideoEncoderFactoryInterface::Capabilities::PredictionConstraints&)>
        f) {
  VideoEncoderFactoryInterface::Capabilities::PredictionConstraints
      constraints = capabilities_.prediction_constraints();
  f(constraints);
  capabilities_.set_prediction_constraints(std::move(constraints));
  return *this;
}

CapabilitiesBuilder& CapabilitiesBuilder::WithInputConstraints(
    FunctionView<void(
        VideoEncoderFactoryInterface::Capabilities::InputConstraints&)> f) {
  VideoEncoderFactoryInterface::Capabilities::InputConstraints constraints =
      capabilities_.input_constraints();
  f(constraints);
  capabilities_.set_input_constraints(std::move(constraints));
  return *this;
}

CapabilitiesBuilder& CapabilitiesBuilder::WithBitrateControl(
    FunctionView<
        void(VideoEncoderFactoryInterface::Capabilities::BitrateControl&)> f) {
  VideoEncoderFactoryInterface::Capabilities::BitrateControl bitrate_control =
      capabilities_.bitrate_control();
  f(bitrate_control);
  capabilities_.set_bitrate_control(std::move(bitrate_control));
  return *this;
}

CapabilitiesBuilder& CapabilitiesBuilder::WithPerformance(
    FunctionView<void(VideoEncoderFactoryInterface::Capabilities::Performance&)>
        f) {
  VideoEncoderFactoryInterface::Capabilities::Performance performance =
      capabilities_.performance();
  f(performance);
  capabilities_.set_performance(std::move(performance));
  return *this;
}

CapabilitiesBuilder& CapabilitiesBuilder::EncodingFormats(
    std::vector<EncodingFormat> encoding_formats) {
  capabilities_.set_encoding_formats(std::move(encoding_formats));
  return *this;
}

VideoEncoderFactoryInterface::Capabilities CapabilitiesBuilder::Build() {
  return capabilities_;
}

}  // namespace webrtc
