/**
 * Logback: the reliable, generic, fast and flexible logging framework.
 * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
 *
 * This program and the accompanying materials are dual-licensed under
 * either the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation
 *
 *   or (per the licensee's choosing)
 *
 * under the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation.
 */
package ch.qos.logback.core.recovery;

public class RecoveryCoordinator {

  public final static long BACKOFF_COEFFICIENT_MIN = 20;
  static long BACKOFF_COEFFICIENT_MAX = 327680;  // BACKOFF_COEFFICIENT_MIN * 4^7
  
  private long backOffCoefficient = BACKOFF_COEFFICIENT_MIN;
  
  private static long UNSET = -1;
  private long currentTime = UNSET;
  long next = System.currentTimeMillis()+getBackoffCoefficient();
  
  public boolean isTooSoon() {
    long now = getCurrentTime();
    if(now > next) {
      next = now + getBackoffCoefficient();
      return false;
    } else {
      return true;
    }
  }
  
  void setCurrentTime(long forcedTime) {
    currentTime = forcedTime;
  }
  
  private long getCurrentTime() {
    if(currentTime != UNSET) {
      return currentTime;
    }
    return System.currentTimeMillis();
  }
  
  private long getBackoffCoefficient() {
    long currentCoeff = backOffCoefficient;
    if(backOffCoefficient < BACKOFF_COEFFICIENT_MAX) {
      backOffCoefficient*=4;
    }
    return currentCoeff;
  }
}
