/*
 * 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.subsystem.pointintime

import java.util.Date

import org.apache.ambari.metrics.adservice.common.Season
import org.apache.ambari.metrics.adservice.metadata.MetricKey
import org.apache.ambari.metrics.adservice.model.AnomalyDetectionMethod.AnomalyDetectionMethod
import org.apache.ambari.metrics.adservice.model.AnomalyType.AnomalyType
import org.apache.ambari.metrics.adservice.model.{AnomalyType, MetricAnomalyInstance}

class PointInTimeAnomalyInstance(val metricKey: MetricKey,
                                 val timestamp: Long,
                                 val metricValue: Double,
                                 val methodType: AnomalyDetectionMethod,
                                 val anomalyScore: Double,
                                 val anomalousSeason: Season,
                                 val modelParameters: String) extends MetricAnomalyInstance {

  override val anomalyType: AnomalyType = AnomalyType.POINT_IN_TIME

  private def anomalyToString : String = {
      "Method=" + methodType + ", AnomalyScore=" + anomalyScore + ", Season=" + anomalousSeason.toString +
        ", Model Parameters=" + modelParameters
  }

  @Override
  override def toString: String = {
    "Metric : [" + metricKey.toString + ", Metric Value=" + metricValue + " @ Time = " + new Date(timestamp) +  "], Anomaly : [" + anomalyToString + "]"
  }

}
