/*
 * 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.slider.server.appmaster.monkey;

import com.codahale.metrics.Counter;
import com.codahale.metrics.MetricRegistry;
import com.google.common.base.Preconditions;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Entry in the chaos list
 */
public class ChaosEntry {

  protected static final Logger log =
      LoggerFactory.getLogger(ChaosEntry.class);
  public final String name;
  public final ChaosTarget target;
  public final long probability;

  private final MetricRegistry metrics;
  private final Counter invocationCounter;


  /**
   * Constructor -includes validation of all arguments
   * @param name
   * @param target
   * @param probability
   */
  public ChaosEntry(String name, ChaosTarget target, long probability,
      MetricRegistry metrics) {
    Preconditions.checkArgument(!StringUtils.isEmpty(name), "missing name");
    Preconditions.checkArgument(target != null, "null target");
    Preconditions.checkArgument(probability > 0, "negative probability");
    Preconditions.checkArgument(probability <= ChaosMonkeyService.PERCENT_100,
        "probability over 100%");
    this.name = name;
    this.target = target;
    this.probability = probability;
    this.metrics = metrics;
    invocationCounter =
        metrics.counter(MetricRegistry.name(ChaosEntry.class, name));
  }

  /**
   * Trigger the chaos action
   */
  public void invokeChaos() {
    log.info("Invoking {}", name);
    invocationCounter.inc();
    target.chaosAction();
  }

  /**
   * Invoke Chaos if the trigger value is in range of the probability
   * @param value trigger value, 0-10K
   * @return true if the chaos method was invoked
   */
  public boolean maybeInvokeChaos(long value) {
    log.debug("Probability {} trigger={}", probability, value);
    if (value < probability) {
      invokeChaos();
      return true;
    }
    return false;
  }
}
