/**
 * 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.server.state.alert;

import com.google.gson.annotations.SerializedName;

/**
 * The {@link Reporting} class represents the OK/WARNING/CRITICAL structures in
 * an {@link AlertDefinition}.
 * <p/>
 * Equality checking for instances of this class should be executed on every
 * member to ensure that reconciling stack differences is correct.
 */
public class Reporting {

  /**
   * The OK template.
   */
  @SerializedName("ok")
  private ReportTemplate m_ok;

  /**
   * The WARNING template.
   */
  @SerializedName("warning")
  private ReportTemplate m_warning;

  /**
   * The CRITICAL template.
   */
  @SerializedName("critical")
  private ReportTemplate m_critical;

  /**
   * A label that identifies what units the value is in. For example, this could
   * be "s" for seconds or GB for "Gigabytes".
   */
  @SerializedName("units")
  private String m_units;

  /**
   * @return the WARNING structure or {@code null} if none.
   */
  public ReportTemplate getWarning() {
    return m_warning;
  }

  /**
   * @param warning
   *          the WARNING structure or {@code null} if none.
   */
  public void setWarning(ReportTemplate warning) {
    m_warning = warning;
  }

  /**
   * @return the CRITICAL structure or {@code null} if none.
   */
  public ReportTemplate getCritical() {
    return m_critical;
  }

  /**
   * @param critical
   *          the CRITICAL structure or {@code null} if none.
   */
  public void setCritical(ReportTemplate critical) {
    m_critical = critical;
  }

  /**
   * @return the OK structure or {@code null} if none.
   */
  public ReportTemplate getOk() {
    return m_ok;
  }

  /**
   * @param ok
   *          the OK structure or {@code null} if none.
   */
  public void setOk(ReportTemplate ok) {
    m_ok = ok;
  }

  /**
   * Gets a label identifying the units that the values are in. For example,
   * this could be "s" for seconds or GB for "Gigabytes".
   *
   * @return the units, or {@code null} for none.
   */
  public String getUnits() {
    return m_units;
  }

  /**
   * Sets the label that identifies the units that the threshold values are in.
   * For example, this could be "s" for seconds or GB for "Gigabytes".
   *
   * @param units
   *          the units, or {@code null} for none.
   */
  public void setUnits(String units) {
    m_units = units;
  }

  /**
   *
   */
  @Override
  public int hashCode() {
    final int prime = 31;

    int result = 1;
    result = prime * result
        + ((m_critical == null) ? 0 : m_critical.hashCode());
    result = prime * result + ((m_ok == null) ? 0 : m_ok.hashCode());
    result = prime * result + ((m_warning == null) ? 0 : m_warning.hashCode());

    return result;
  }

  /**
   *
   */
  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }

    if (obj == null) {
      return false;
    }

    if (getClass() != obj.getClass()) {
      return false;
    }

    Reporting other = (Reporting) obj;
    if (m_critical == null) {
      if (other.m_critical != null) {
        return false;
      }
    } else if (!m_critical.equals(other.m_critical)) {
      return false;
    }

    if (m_ok == null) {
      if (other.m_ok != null) {
        return false;
      }
    } else if (!m_ok.equals(other.m_ok)) {
      return false;
    }

    if (m_warning == null) {
      if (other.m_warning != null) {
        return false;
      }
    } else if (!m_warning.equals(other.m_warning)) {
      return false;
    }
    return true;
  }

  /**
   * The {@link ReportTemplate} class is used to pair a label and threshhold
   * value.
   * <p/>
   * Equality checking for instances of this class should be executed on every
   * member to ensure that reconciling stack differences is correct.
   */
  public static final class ReportTemplate {
    @SerializedName("text")
    private String m_text;

    @SerializedName("value")
    private Double m_value = null;

    /**
     * @return the parameterized text of this template or {@code null} if none.
     */
    public String getText() {
      return m_text;
    }

    /**
     * @param text
     *          the parameterized text of this template or {@code null} if none.
     */
    public void setText(String text) {
      m_text = text;
    }

    /**
     * @return the threshold value for this template or {@code null} if none.
     */
    public Double getValue() {
      return m_value;
    }

    /**
     * @param value
     *          the threshold value for this template or {@code null} if none.
     */
    public void setValue(Double value) {
      m_value = value;
    }

    /**
     *
     */
    @Override
    public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + ((m_text == null) ? 0 : m_text.hashCode());
      result = prime * result + ((m_value == null) ? 0 : m_value.hashCode());
      return result;
    }

    /**
     *
     */
    @Override
    public boolean equals(Object obj) {
      if (this == obj) {
        return true;
      }

      if (obj == null) {
        return false;
      }

      if (getClass() != obj.getClass()) {
        return false;
      }

      ReportTemplate other = (ReportTemplate) obj;

      if (m_text == null) {
        if (other.m_text != null) {
          return false;
        }
      } else if (!m_text.equals(other.m_text)) {
        return false;
      }

      if (m_value == null) {
        if (other.m_value != null) {
          return false;
        }
      } else if (!m_value.equals(other.m_value)) {
        return false;
      }
      return true;
    }
  }
}
