/*
 *  Copyright 2018 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.
 */
#ifndef MODULES_CONGESTION_CONTROLLER_GOOG_CC_DELAY_BASED_RATE_CONTROLLER_H_
#define MODULES_CONGESTION_CONTROLLER_GOOG_CC_DELAY_BASED_RATE_CONTROLLER_H_

#include <memory>

#include "absl/types/optional.h"
#include "api/transport/network_types.h"
#include "logging/rtc_event_log/rtc_event_log.h"
#include "modules/congestion_controller/goog_cc/link_capacity_estimator.h"
#include "modules/congestion_controller/goog_cc/packet_grouping.h"
#include "modules/congestion_controller/goog_cc/trendline_estimator.h"
#include "rtc_base/experiments/field_trial_parser.h"
#include "rtc_base/experiments/field_trial_units.h"

namespace webrtc {
struct DelayBasedRateControllerConfig {
  FieldTrialFlag enabled;
  FieldTrialParameter<double> no_ack_backoff_fraction;
  FieldTrialParameter<TimeDelta> no_ack_backoff_interval;
  FieldTrialParameter<double> ack_backoff_fraction;
  FieldTrialParameter<double> probe_backoff_fraction;
  FieldTrialParameter<double> initial_increase_rate;
  FieldTrialParameter<double> increase_rate;
  FieldTrialParameter<DataRate> first_period_increase_rate;
  FieldTrialParameter<TimeDelta> stop_increase_after;
  FieldTrialParameter<TimeDelta> min_increase_interval;
  FieldTrialParameter<DataRate> linear_increase_threshold;
  FieldTrialParameter<TimeDelta> reference_duration_offset;
  DelayBasedRateControllerConfig();
  ~DelayBasedRateControllerConfig();
};

// Rate controller for GoogCC, increases the target rate based on a
// fixed increase interval and an RTT dependent increase rate.
class DelayBasedRateController {
 public:
  DelayBasedRateController(RtcEventLog* event_log,
                           TargetRateConstraints constraints);
  ~DelayBasedRateController();
  void OnRouteChange();
  void UpdateConstraints(TargetRateConstraints constraints);
  void SetAcknowledgedRate(DataRate acknowledged_rate);
  void OnTransportPacketsFeedback(TransportPacketsFeedback msg,
                                  absl::optional<DataRate> probe_bitrate);
  void OnTimeUpdate(Timestamp at_time);
  void OnRemoteBitrateControl(RemoteBitrateReport msg);
  TimeDelta GetExpectedBandwidthPeriod() const;

  bool Enabled() const { return conf_.enabled; }
  DataRate target_rate() const;
  bool in_underuse() const;

 private:
  enum class ControllerSate { kHold, kExponentialIncrease, kLinearIncrease };
  friend class GoogCcStatePrinter;
  void OnFeedbackUpdate(BandwidthUsage usage,
                        absl::optional<DataRate> probe_bitrate,
                        Timestamp at_time);
  void MaybeLog();
  const DelayBasedRateControllerConfig conf_;
  RtcEventLog* event_log_;

  PacketDelayGrouper packet_grouper_;
  std::unique_ptr<TrendlineEstimator> overuse_detector_;
  LinkCapacityEstimator link_capacity_;

  DataRate min_rate_ = DataRate::Zero();
  DataRate max_rate_ = DataRate::Infinity();

  absl::optional<DataRate> acknowledged_rate_;
  TimeDelta last_rtt_ = TimeDelta::seconds(1);
  Timestamp first_unacked_send_ = Timestamp::PlusInfinity();
  Timestamp last_feedback_update_ = Timestamp::MinusInfinity();

  DataRate target_rate_;

  Timestamp last_no_ack_backoff_ = Timestamp::MinusInfinity();
  bool increasing_state_ = false;
  double accumulated_duration_ = 0;
  Timestamp last_increase_update_ = Timestamp::PlusInfinity();
  DataRate increase_reference_ = DataRate::PlusInfinity();

  absl::optional<BandwidthUsage> logged_state_;
  DataRate logged_target_ = DataRate::PlusInfinity();
};
}  // namespace webrtc

#endif  // MODULES_CONGESTION_CONTROLLER_GOOG_CC_DELAY_BASED_RATE_CONTROLLER_H_
