/**
 * 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.controller;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.google.common.collect.Multimap;
import org.apache.ambari.server.state.DesiredConfig;
import org.apache.ambari.server.state.SecurityType;
import org.apache.ambari.server.state.State;
import org.apache.ambari.server.state.ClusterHealthReport;

public class ClusterResponse {

  private final Long clusterId;

  private final String clusterName;

  private final Set<String> hostNames;

  private final String desiredStackVersion;

  private Map<String, DesiredConfig> desiredConfigs;

  private Map<String, Collection<ServiceConfigVersionResponse>> desiredServiceConfigVersions;

  private String provisioningState;

  /**
   * The cluster's security.
   * <p/>
   * See {@link org.apache.ambari.server.state.SecurityType} for relevant values.
   */
  private String securityType;

  private Integer totalHosts;

  private ClusterHealthReport clusterHealthReport;

  private Map<String, String> credentialStoreServiceProperties = null;

  public ClusterResponse(Long clusterId, String clusterName,
                         State provisioningState, SecurityType securityType, Set<String> hostNames, Integer totalHosts,
                         String desiredStackVersion, ClusterHealthReport clusterHealthReport) {

    super();
    this.clusterId = clusterId;
    this.clusterName = clusterName;
    this.hostNames = hostNames;
    this.totalHosts = totalHosts;
    this.desiredStackVersion = desiredStackVersion;
    this.clusterHealthReport = clusterHealthReport;

    if (null != provisioningState) {
      this.provisioningState = provisioningState.name();
    }

    if (null == securityType) {
      this.securityType = SecurityType.NONE.name();
    } else {
      this.securityType = securityType.name();
    }
  }

  /**
   * @return the clusterId
   */
  public Long getClusterId() {
    return clusterId;
  }

  /**
   * @return the clusterName
   */
  public String getClusterName() {
    return clusterName;
  }

  /**
   * @return the host names
   */
  public Set<String> getHostNames() {
    return hostNames;
  }

  /**
   * Gets whether the cluster is still initializing or has finished with its
   * deployment requests.
   *
   * @return either {@code INIT} or {@code INSTALLED}, never {@code null}.
   */
  public String getProvisioningState() {
    return provisioningState;
  }

  /**
   * Gets the cluster's security type.
   * <p/>
   * See {@link org.apache.ambari.server.state.SecurityType} for relevant values.
   *
   * @return the cluster's security type
   */
  public String getSecurityType() {
    return securityType;
  }

  /**
   * Sets the cluster's security type.
   * <p/>
   * See {@link org.apache.ambari.server.state.SecurityType} for relevant values.
   *
   * @param securityType a String declaring the cluster's security type
   */
  public void setSecurityType(String securityType) {
    this.securityType = securityType;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("{"
        + " clusterName=" + clusterName
        + ", clusterId=" + clusterId
        + ", provisioningState=" + provisioningState
        + ", desiredStackVersion=" + desiredStackVersion
        + ", totalHosts=" + totalHosts
        + ", hosts=[");

    if (hostNames != null) {
      int i = 0;
      for (String hostName : hostNames) {
        if (i != 0) {
          sb.append(",");
        }
        ++i;
        sb.append(hostName);
      }
    }
    sb.append("]"
        + ", clusterHealthReport= " + clusterHealthReport
        + "}");
    return sb.toString();
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }

    ClusterResponse that = (ClusterResponse) o;

    if (clusterId != null ?
        !clusterId.equals(that.clusterId) : that.clusterId != null) {
      return false;
    }
    if (clusterName != null ?
        !clusterName.equals(that.clusterName) : that.clusterName != null) {
      return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    int result = clusterId != null ? clusterId.intValue() : 0;
    result = 71 * result + (clusterName != null ? clusterName.hashCode() : 0);
    return result;
  }

  /**
   * @return the desiredStackVersion
   */
  public String getDesiredStackVersion() {
    return desiredStackVersion;
  }

  /**
   * @param configs
   */
  public void setDesiredConfigs(Map<String, DesiredConfig> configs) {
    desiredConfigs = configs;
  }

  /**
   * @return the desired configs
   */
  public Map<String, DesiredConfig> getDesiredConfigs() {
    return desiredConfigs;
  }

  /**
   * @return total number of hosts in the cluster
   */
  public Integer getTotalHosts() {
    return totalHosts;
  }

  /**
   * @return cluster health report
   */
  public ClusterHealthReport getClusterHealthReport() {
    return clusterHealthReport;
  }

  public Map<String, Collection<ServiceConfigVersionResponse>> getDesiredServiceConfigVersions() {
    return desiredServiceConfigVersions;
  }

  public void setDesiredServiceConfigVersions(Map<String, Collection<ServiceConfigVersionResponse>> desiredServiceConfigVersions) {
    this.desiredServiceConfigVersions = desiredServiceConfigVersions;
  }

  public void setCredentialStoreServiceProperties(Map<String, String> credentialServiceProperties) {
    this.credentialStoreServiceProperties = credentialServiceProperties;
  }

  public Map<String, String> getCredentialStoreServiceProperties() {
    return credentialStoreServiceProperties;
  }
}
