/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.gossip.accrual;

import org.apache.commons.math.MathException;
import org.apache.commons.math.distribution.ExponentialDistributionImpl;
import org.apache.commons.math.distribution.NormalDistributionImpl;
import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
import org.apache.gossip.LocalGossipMember;
import org.apache.log4j.Logger;

public class FailureDetector {

  private static final Logger LOGGER = Logger.getLogger(FailureDetector.class);
  private final DescriptiveStatistics descriptiveStatistics;
  private final long minimumSamples;
  private volatile long latestHeartbeatMs = -1;
  private final LocalGossipMember parent;
  private final String distribution;
  
  public FailureDetector(LocalGossipMember parent, long minimumSamples, int windowSize, String distribution){
    this.parent = parent;
    descriptiveStatistics = new DescriptiveStatistics(windowSize);
    this.minimumSamples = minimumSamples;
    this.distribution = distribution;
  }
  
  /**
   * Updates the statistics based on the delta between the last 
   * heartbeat and supplied time
   * @param now the time of the heartbeat in milliseconds
   */
  public void recordHeartbeat(long now){
    if (now < latestHeartbeatMs)
      return;
    synchronized (descriptiveStatistics) {
      if (latestHeartbeatMs != -1){
        descriptiveStatistics.addValue(now - latestHeartbeatMs);
      } else {
        latestHeartbeatMs = now;
      }
    }
  }
  
  public Double computePhiMeasure(long now)  {
    if (latestHeartbeatMs == -1 || descriptiveStatistics.getN() < minimumSamples) {
      LOGGER.debug(
              String.format( "%s latests %s samples %s minumumSamples %s", parent.getId(), 
                      latestHeartbeatMs, descriptiveStatistics.getN(), minimumSamples));
      return null;
    }
    synchronized (descriptiveStatistics) {
      long delta = now - latestHeartbeatMs;
      try {
        double probability = 0.0;
        if (distribution.equals("normal")){
          double variance = descriptiveStatistics.getVariance();
          probability = 1.0d - new NormalDistributionImpl(descriptiveStatistics.getMean(), 
                  variance == 0 ? 0.1 : variance).cumulativeProbability(delta);
        } else {
          probability = 1.0d - new ExponentialDistributionImpl(descriptiveStatistics.getMean()).cumulativeProbability(delta);
        }
        return -1.0d * Math.log10(probability);
      } catch (MathException | IllegalArgumentException e) {
        e.printStackTrace();
        throw new IllegalArgumentException(e);
      }
    }
  }
}
