/**
 * 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 org.apache.ambari.server.state.CustomCommandDefinition;
import org.apache.ambari.server.state.ServiceInfo;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class StackServiceResponse {

  private String stackName;
  private String stackVersion;
  private String serviceName;
  private String serviceDisplayName;
  private String userName;
  private String comments;
  private String serviceVersion;
  private boolean serviceCheckSupported;
  private List<String> customCommands;

  private Map<String, Map<String, Map<String, String>>> configTypes;

  private Set<String> excludedConfigTypes;

  private List<String> requiredServices;

  /**
   * A File pointing to the service-level Kerberos descriptor file
   *
   * This may be null if a relevant file is not available.
   */
  private File kerberosDescriptorFile;

  /**
   * Constructor.
   *
   * @param service
   *          the service to generate the response from (not {@code null}).
   */
  public StackServiceResponse(ServiceInfo service) {
    serviceName = service.getName();
    serviceDisplayName = service.getDisplayName();
    userName = null;
    comments = service.getComment();
    serviceVersion = service.getVersion();
    configTypes = service.getConfigTypeAttributes();
    excludedConfigTypes = service.getExcludedConfigTypes();
    requiredServices = service.getRequiredServices();
    serviceCheckSupported = null != service.getCommandScript();

    // the custom command names defined at the service (not component) level
    List<CustomCommandDefinition> definitions = service.getCustomCommands();
    if (null == definitions || definitions.size() == 0) {
      customCommands = Collections.emptyList();
    } else {
      customCommands = new ArrayList<String>(definitions.size());
      for (CustomCommandDefinition command : definitions) {
        customCommands.add(command.getName());
      }
    }

    kerberosDescriptorFile = service.getKerberosDescriptorFile();
  }

  public String getStackName() {
    return stackName;
  }

  public void setStackName(String stackName) {
    this.stackName = stackName;
  }

  public String getStackVersion() {
    return stackVersion;
  }

  public void setStackVersion(String stackVersion) {
    this.stackVersion = stackVersion;
  }

  public String getServiceName() {
    return serviceName;
  }

  public void setServiceName(String serviceName) {
    this.serviceName = serviceName;
  }

  public String getServiceDisplayName() {
    return serviceDisplayName;
  }

  public void setServiceDisplayName(String serviceDisplayName) {
    this.serviceDisplayName = serviceDisplayName;
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getComments() {
    return comments;
  }

  public void setComments(String comments) {
    this.comments = comments;
  }

  public String getServiceVersion() {
    return serviceVersion;
  }

  public void setServiceVersion(String serviceVersion) {
    this.serviceVersion = serviceVersion;
  }

  public Map<String, Map<String, Map<String, String>>> getConfigTypes() {
    return configTypes;
  }

  public Set<String> getExcludedConfigTypes() {
    return excludedConfigTypes;
  }
  
  public List<String> getRequiredServices() {
    return requiredServices;
  }

  public void setRequiredServices(List<String> requiredServices) {
    this.requiredServices = requiredServices;
  }

  /**
   * Gets a File pointing to the service-level Kerberos descriptor
   *
   * @return a File pointing to the service-level Kerberos descriptor, or null if no relevant file is
   * available
   */
  public File getKerberosDescriptorFile() {
    return kerberosDescriptorFile;
  }

  /**
   * Sets the service-level Kerberos descriptor File
   *
   * @param kerberosDescriptorFile a File pointing to the service-level Kerberos descriptor
   */
  public void setKerberosDescriptorFile(File kerberosDescriptorFile) {
    this.kerberosDescriptorFile = kerberosDescriptorFile;
  }

  /**
   * Gets whether the service represented by this response supports running
   * "Service Checks". A service check is possible where there is a custom
   * command defined in the {@code metainfo.xml} of the service definition. This
   * not the same as a custom command defined for a component.
   *
   * @return {@code true} if this service supports running "Service Checks",
   *         {@code false} otherwise.
   *
   */
  public boolean isServiceCheckSupported() {
    return serviceCheckSupported;
  }

  /**
   * Gets the names of all of the custom commands for this service.
   *
   * @return the commands or an empty list (never {@code null}).
   */
  public List<String> getCustomCommands() {
    return customCommands;
  }
}
