/*
 *  Copyright (c) 2016 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 WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
#define WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_

#include <initializer_list>

#include "webrtc/common_types.h"
#include "webrtc/modules/pacing/paced_sender.h"
#include "webrtc/rtc_base/criticalsection.h"

namespace webrtc {

class Clock;

// This class controls initiation of probing to estimate initial channel
// capacity. There is also support for probing during a session when max
// bitrate is adjusted by an application.
class ProbeController {
 public:
  ProbeController(PacedSender* pacer, const Clock* clock);

  void SetBitrates(int64_t min_bitrate_bps,
                   int64_t start_bitrate_bps,
                   int64_t max_bitrate_bps);

  void OnNetworkStateChanged(NetworkState state);

  void SetEstimatedBitrate(int64_t bitrate_bps);

  void EnablePeriodicAlrProbing(bool enable);

  void SetAlrEndedTimeMs(int64_t alr_end_time);

  void RequestProbe();

  // Resets the ProbeController to a state equivalent to as if it was just
  // created EXCEPT for |enable_periodic_alr_probing_|.
  void Reset();

  void Process();

 private:
  enum class State {
    // Initial state where no probing has been triggered yet.
    kInit,
    // Waiting for probing results to continue further probing.
    kWaitingForProbingResult,
    // Probing is complete.
    kProbingComplete,
  };

  void InitiateExponentialProbing() EXCLUSIVE_LOCKS_REQUIRED(critsect_);
  void InitiateProbing(int64_t now_ms,
                       std::initializer_list<int64_t> bitrates_to_probe,
                       bool probe_further) EXCLUSIVE_LOCKS_REQUIRED(critsect_);

  rtc::CriticalSection critsect_;
  PacedSender* const pacer_;
  const Clock* const clock_;
  NetworkState network_state_ GUARDED_BY(critsect_);
  State state_ GUARDED_BY(critsect_);
  int64_t min_bitrate_to_probe_further_bps_ GUARDED_BY(critsect_);
  int64_t time_last_probing_initiated_ms_ GUARDED_BY(critsect_);
  int64_t estimated_bitrate_bps_ GUARDED_BY(critsect_);
  int64_t start_bitrate_bps_ GUARDED_BY(critsect_);
  int64_t max_bitrate_bps_ GUARDED_BY(critsect_);
  int64_t last_bwe_drop_probing_time_ms_ GUARDED_BY(critsect_);
  rtc::Optional<int64_t> alr_end_time_ms_ GUARDED_BY(critsect_);
  bool enable_periodic_alr_probing_ GUARDED_BY(critsect_);
  int64_t time_of_last_large_drop_ms_ GUARDED_BY(critsect_);
  int64_t bitrate_before_last_large_drop_bps_ GUARDED_BY(critsect_);

  bool in_rapid_recovery_experiment_ GUARDED_BY(critsect_);
  // For WebRTC.BWE.MidCallProbing.* metric.
  bool mid_call_probing_waiting_for_result_ GUARDED_BY(&critsect_);
  int64_t mid_call_probing_bitrate_bps_ GUARDED_BY(&critsect_);
  int64_t mid_call_probing_succcess_threshold_ GUARDED_BY(&critsect_);

  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ProbeController);
};

}  // namespace webrtc

#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
