//  Copyright (c) 2013, Facebook, Inc.  All rights reserved.
//  This source code is licensed under both the GPLv2 (found in the
//  COPYING file in the root directory) and Apache 2.0 License
//  (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.

#pragma once

#include "monitoring/histogram.h"
#include "rocksdb/env.h"

namespace rocksdb {

class HistogramWindowingImpl : public Histogram
{
public:
  HistogramWindowingImpl();
  HistogramWindowingImpl(uint64_t num_windows,
                         uint64_t micros_per_window,
                         uint64_t min_num_per_window);

  HistogramWindowingImpl(const HistogramImpl&) = delete;
  HistogramWindowingImpl& operator=(const HistogramImpl&) = delete;

  ~HistogramWindowingImpl();

  virtual void Clear() override;
  virtual bool Empty() const override;
  virtual void Add(uint64_t value) override;
  virtual void Merge(const Histogram& other) override;
  void Merge(const HistogramWindowingImpl& other);

  virtual std::string ToString() const override;
  virtual const char* Name() const override { return "HistogramWindowingImpl"; }
  virtual uint64_t min() const override { return stats_.min(); }
  virtual uint64_t max() const override { return stats_.max(); }
  virtual uint64_t num() const override { return stats_.num(); }
  virtual double Median() const override;
  virtual double Percentile(double p) const override;
  virtual double Average() const override;
  virtual double StandardDeviation() const override;
  virtual void Data(HistogramData* const data) const override;

private:
  void TimerTick();
  void SwapHistoryBucket();
  inline uint64_t current_window() const {
    return current_window_.load(std::memory_order_relaxed);
  }
  inline uint64_t last_swap_time() const{
    return last_swap_time_.load(std::memory_order_relaxed);
  }

  Env* env_;
  std::mutex mutex_;

  // Aggregated stats over windows_stats_, all the computation is done
  // upon aggregated values
  HistogramStat stats_;

  // This is a circular array representing the latest N time-windows.
  // Each entry stores a time-window of data. Expiration is done
  // on window-based.
  std::unique_ptr<HistogramStat[]> window_stats_;

  std::atomic_uint_fast64_t current_window_;
  std::atomic_uint_fast64_t last_swap_time_;

  // Following parameters are configuable
  uint64_t num_windows_ = 5;
  uint64_t micros_per_window_ = 60000000;
  // By default, don't care about the number of values in current window
  // when decide whether to swap windows or not.
  uint64_t min_num_per_window_ = 0;
};

}  // namespace rocksdb