/**
 * 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.ambari.metrics.adservice.seriesgenerator;

import java.util.Map;

public class MetricSeriesGeneratorFactory {

  /**
   * Return a normally distributed data series with some deviation % and outliers.
   *
   * @param n                                size of the data series
   * @param value                            The value around which the uniform data series is centered on.
   * @param deviationPercentage              The allowed deviation % on either side of the uniform value. For example, if value = 10, and deviation % is 0.1, the series values lie between 0.9 to 1.1.
   * @param outlierProbability               The probability of finding an outlier in the series.
   * @param outlierDeviationLowerPercentage  min percentage outlier should be away from the uniform value in % terms. if value = 10 and outlierDeviationPercentage = 30%, the outlier is 7 and  13.
   * @param outlierDeviationHigherPercentage max percentage outlier should be away from the uniform value in % terms. if value = 10 and outlierDeviationPercentage = 60%, the outlier is 4 and  16.
   * @param outliersAboveValue               Outlier should be greater or smaller than the value.
   * @return uniform series
   */
  public static double[] createUniformSeries(int n,
                                             double value,
                                             double deviationPercentage,
                                             double outlierProbability,
                                             double outlierDeviationLowerPercentage,
                                             double outlierDeviationHigherPercentage,
                                             boolean outliersAboveValue) {

    UniformMetricSeries metricSeries = new UniformMetricSeries(value,
      deviationPercentage,
      outlierProbability,
      outlierDeviationLowerPercentage,
      outlierDeviationHigherPercentage,
      outliersAboveValue);

    return metricSeries.getSeries(n);
  }


  /**
   * /**
   * Returns a normally distributed series.
   *
   * @param n                             size of the data series
   * @param mean                          mean of the distribution
   * @param sd                            sd of the distribution
   * @param outlierProbability            sd of the distribution
   * @param outlierDeviationSDTimesLower  Lower Limit of the outlier with respect to times sdev from the mean.
   * @param outlierDeviationSDTimesHigher Higher Limit of the outlier with respect to times sdev from the mean.
   * @param outlierOnRightEnd             Outlier should be on the right end or the left end.
   * @return normal series
   */
  public static double[] createNormalSeries(int n,
                                            double mean,
                                            double sd,
                                            double outlierProbability,
                                            double outlierDeviationSDTimesLower,
                                            double outlierDeviationSDTimesHigher,
                                            boolean outlierOnRightEnd) {


    NormalMetricSeries metricSeries = new NormalMetricSeries(mean,
      sd,
      outlierProbability,
      outlierDeviationSDTimesLower,
      outlierDeviationSDTimesHigher,
      outlierOnRightEnd);

    return metricSeries.getSeries(n);
  }


  /**
   * Returns a monotonically increasing / decreasing series
   *
   * @param n                                size of the data series
   * @param startValue                       Start value of the monotonic sequence
   * @param slope                            direction of monotonicity m > 0 for increasing and m < 0 for decreasing.
   * @param deviationPercentage              The allowed deviation % on either side of the current 'y' value. For example, if current value = 10 according to slope, and deviation % is 0.1, the series values lie between 0.9 to 1.1.
   * @param outlierProbability               The probability of finding an outlier in the series.
   * @param outlierDeviationLowerPercentage  min percentage outlier should be away from the current 'y' value in % terms. if value = 10 and outlierDeviationPercentage = 30%, the outlier is 7 and  13.
   * @param outlierDeviationHigherPercentage max percentage outlier should be away from the current 'y' value in % terms. if value = 10 and outlierDeviationPercentage = 60%, the outlier is 4 and  16.
   * @param outliersAboveValue               Outlier should be greater or smaller than the 'y' value.
   * @return
   */
  public static double[] createMonotonicSeries(int n,
                                               double startValue,
                                               double slope,
                                               double deviationPercentage,
                                               double outlierProbability,
                                               double outlierDeviationLowerPercentage,
                                               double outlierDeviationHigherPercentage,
                                               boolean outliersAboveValue) {

    MonotonicMetricSeries metricSeries = new MonotonicMetricSeries(startValue,
      slope,
      deviationPercentage,
      outlierProbability,
      outlierDeviationLowerPercentage,
      outlierDeviationHigherPercentage,
      outliersAboveValue);

    return metricSeries.getSeries(n);
  }


  /**
   * Returns a dual band series (lower and higher)
   *
   * @param n                           size of the data series
   * @param lowBandValue                lower band value
   * @param lowBandDeviationPercentage  lower band deviation
   * @param lowBandPeriodSize           lower band
   * @param highBandValue               high band centre value
   * @param highBandDeviationPercentage high band deviation.
   * @param highBandPeriodSize          high band size
   * @return
   */
  public static double[] getDualBandSeries(int n,
                                           double lowBandValue,
                                           double lowBandDeviationPercentage,
                                           int lowBandPeriodSize,
                                           double highBandValue,
                                           double highBandDeviationPercentage,
                                           int highBandPeriodSize) {

    DualBandMetricSeries metricSeries  = new DualBandMetricSeries(lowBandValue,
      lowBandDeviationPercentage,
      lowBandPeriodSize,
      highBandValue,
      highBandDeviationPercentage,
      highBandPeriodSize);

    return metricSeries.getSeries(n);
  }

  /**
   * Returns a step function series.
   *
   * @param n                              size of the data series
   * @param startValue                     start steady value
   * @param steadyValueDeviationPercentage required devation in the steady state value
   * @param steadyPeriodSlope              direction of monotonicity m > 0 for increasing and m < 0 for decreasing, m = 0 no increase or decrease.
   * @param steadyPeriodMinSize            min size for step period
   * @param steadyPeriodMaxSize            max size for step period.
   * @param stepChangePercentage           Increase / decrease in steady state to denote a step in terms of deviation percentage from the last value.
   * @param upwardStep                     upward or downward step.
   * @return
   */
  public static double[] getStepFunctionSeries(int n,
                                               double startValue,
                                               double steadyValueDeviationPercentage,
                                               double steadyPeriodSlope,
                                               int steadyPeriodMinSize,
                                               int steadyPeriodMaxSize,
                                               double stepChangePercentage,
                                               boolean upwardStep) {

    StepFunctionMetricSeries metricSeries = new StepFunctionMetricSeries(startValue,
      steadyValueDeviationPercentage,
      steadyPeriodSlope,
      steadyPeriodMinSize,
      steadyPeriodMaxSize,
      stepChangePercentage,
      upwardStep);

    return metricSeries.getSeries(n);
  }

  /**
   * Series with small period of turbulence and then back to steady.
   *
   * @param n                                        size of the data series
   * @param steadyStateValue                         steady state center value
   * @param steadyStateDeviationPercentage           steady state deviation in percentage
   * @param turbulentPeriodDeviationLowerPercentage  turbulent state lower limit in terms of percentage from centre value.
   * @param turbulentPeriodDeviationHigherPercentage turbulent state higher limit in terms of percentage from centre value.
   * @param turbulentPeriodLength                    turbulent period length (number of points)
   * @param turbulentStatePosition                   Where the turbulent state should be 0 - at the beginning, 1 - in the middle (25% - 50% of the series), 2 - at the end of the series.
   * @return
   */
  public static double[] getSteadySeriesWithTurbulentPeriod(int n,
                                                            double steadyStateValue,
                                                            double steadyStateDeviationPercentage,
                                                            double turbulentPeriodDeviationLowerPercentage,
                                                            double turbulentPeriodDeviationHigherPercentage,
                                                            int turbulentPeriodLength,
                                                            int turbulentStatePosition
  ) {


    SteadyWithTurbulenceMetricSeries metricSeries = new SteadyWithTurbulenceMetricSeries(n,
      steadyStateValue,
      steadyStateDeviationPercentage,
      turbulentPeriodDeviationLowerPercentage,
      turbulentPeriodDeviationHigherPercentage,
      turbulentPeriodLength,
      turbulentStatePosition);

    return metricSeries.getSeries(n);
  }


  public static double[] generateSeries(String type, int n, Map<String, String> configs) {

    double[] series;
    switch (type) {

      case "normal":
        series = createNormalSeries(n,
          Double.parseDouble(configs.getOrDefault("mean", "0")),
          Double.parseDouble(configs.getOrDefault("sd", "1")),
          Double.parseDouble(configs.getOrDefault("outlierProbability", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationSDTimesLower", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationSDTimesHigher", "0")),
          Boolean.parseBoolean(configs.getOrDefault("outlierOnRightEnd", "true")));
        break;

      case "uniform":
        series = createUniformSeries(n,
          Double.parseDouble(configs.getOrDefault("value", "10")),
          Double.parseDouble(configs.getOrDefault("deviationPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("outlierProbability", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationLowerPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationHigherPercentage", "0")),
          Boolean.parseBoolean(configs.getOrDefault("outliersAboveValue", "true")));
        break;

      case "monotonic":
        series = createMonotonicSeries(n,
          Double.parseDouble(configs.getOrDefault("startValue", "10")),
          Double.parseDouble(configs.getOrDefault("slope", "0")),
          Double.parseDouble(configs.getOrDefault("deviationPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("outlierProbability", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationLowerPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationHigherPercentage", "0")),
          Boolean.parseBoolean(configs.getOrDefault("outliersAboveValue", "true")));
        break;

      case "dualband":
        series = getDualBandSeries(n,
          Double.parseDouble(configs.getOrDefault("lowBandValue", "10")),
          Double.parseDouble(configs.getOrDefault("lowBandDeviationPercentage", "0")),
          Integer.parseInt(configs.getOrDefault("lowBandPeriodSize", "0")),
          Double.parseDouble(configs.getOrDefault("highBandValue", "10")),
          Double.parseDouble(configs.getOrDefault("highBandDeviationPercentage", "0")),
          Integer.parseInt(configs.getOrDefault("highBandPeriodSize", "0")));
        break;

      case "step":
        series = getStepFunctionSeries(n,
          Double.parseDouble(configs.getOrDefault("startValue", "10")),
          Double.parseDouble(configs.getOrDefault("steadyValueDeviationPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("steadyPeriodSlope", "0")),
          Integer.parseInt(configs.getOrDefault("steadyPeriodMinSize", "0")),
          Integer.parseInt(configs.getOrDefault("steadyPeriodMaxSize", "0")),
          Double.parseDouble(configs.getOrDefault("stepChangePercentage", "0")),
          Boolean.parseBoolean(configs.getOrDefault("upwardStep", "true")));
        break;

      case "turbulence":
        series = getSteadySeriesWithTurbulentPeriod(n,
          Double.parseDouble(configs.getOrDefault("steadyStateValue", "10")),
          Double.parseDouble(configs.getOrDefault("steadyStateDeviationPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("turbulentPeriodDeviationLowerPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("turbulentPeriodDeviationHigherPercentage", "10")),
          Integer.parseInt(configs.getOrDefault("turbulentPeriodLength", "0")),
          Integer.parseInt(configs.getOrDefault("turbulentStatePosition", "0")));
        break;

      default:
        series = createNormalSeries(n,
          0,
          1,
          0,
          0,
          0,
          true);
    }
    return series;
  }

  public static AbstractMetricSeries generateSeries(String type, Map<String, String> configs) {

    AbstractMetricSeries series;
    switch (type) {

      case "normal":
        series = new NormalMetricSeries(Double.parseDouble(configs.getOrDefault("mean", "0")),
          Double.parseDouble(configs.getOrDefault("sd", "1")),
          Double.parseDouble(configs.getOrDefault("outlierProbability", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationSDTimesLower", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationSDTimesHigher", "0")),
          Boolean.parseBoolean(configs.getOrDefault("outlierOnRightEnd", "true")));
        break;

      case "uniform":
        series = new UniformMetricSeries(
          Double.parseDouble(configs.getOrDefault("value", "10")),
          Double.parseDouble(configs.getOrDefault("deviationPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("outlierProbability", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationLowerPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationHigherPercentage", "0")),
          Boolean.parseBoolean(configs.getOrDefault("outliersAboveValue", "true")));
        break;

      case "monotonic":
        series = new MonotonicMetricSeries(
          Double.parseDouble(configs.getOrDefault("startValue", "10")),
          Double.parseDouble(configs.getOrDefault("slope", "0")),
          Double.parseDouble(configs.getOrDefault("deviationPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("outlierProbability", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationLowerPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("outlierDeviationHigherPercentage", "0")),
          Boolean.parseBoolean(configs.getOrDefault("outliersAboveValue", "true")));
        break;

      case "dualband":
        series = new DualBandMetricSeries(
          Double.parseDouble(configs.getOrDefault("lowBandValue", "10")),
          Double.parseDouble(configs.getOrDefault("lowBandDeviationPercentage", "0")),
          Integer.parseInt(configs.getOrDefault("lowBandPeriodSize", "0")),
          Double.parseDouble(configs.getOrDefault("highBandValue", "10")),
          Double.parseDouble(configs.getOrDefault("highBandDeviationPercentage", "0")),
          Integer.parseInt(configs.getOrDefault("highBandPeriodSize", "0")));
        break;

      case "step":
        series = new StepFunctionMetricSeries(
          Double.parseDouble(configs.getOrDefault("startValue", "10")),
          Double.parseDouble(configs.getOrDefault("steadyValueDeviationPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("steadyPeriodSlope", "0")),
          Integer.parseInt(configs.getOrDefault("steadyPeriodMinSize", "0")),
          Integer.parseInt(configs.getOrDefault("steadyPeriodMaxSize", "0")),
          Double.parseDouble(configs.getOrDefault("stepChangePercentage", "0")),
          Boolean.parseBoolean(configs.getOrDefault("upwardStep", "true")));
        break;

      case "turbulence":
        series = new SteadyWithTurbulenceMetricSeries(
          Integer.parseInt(configs.getOrDefault("approxSeriesLength", "100")),
          Double.parseDouble(configs.getOrDefault("steadyStateValue", "10")),
          Double.parseDouble(configs.getOrDefault("steadyStateDeviationPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("turbulentPeriodDeviationLowerPercentage", "0")),
          Double.parseDouble(configs.getOrDefault("turbulentPeriodDeviationHigherPercentage", "10")),
          Integer.parseInt(configs.getOrDefault("turbulentPeriodLength", "0")),
          Integer.parseInt(configs.getOrDefault("turbulentStatePosition", "0")));
        break;

      default:
        series = new NormalMetricSeries(0,
          1,
          0,
          0,
          0,
          true);
    }
    return series;
  }

}
