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

import java.util.Map;
import java.util.TreeMap;

/**
 * AbstractKerberosDescriptor is the base class for all Kerberos*Descriptor and associated classes.
 * <p/>
 * It provides storage and management for the parent and name values on behalf of implementing classes.
 * It also provides utility and helper methods.
 */
public abstract class AbstractKerberosDescriptor {

  /**
   * An AbstractKerberosDescriptor serving as the parent (or container) for this
   * AbstractKerberosDescriptor.
   * <p/>
   * This value may be null in the event no parent has been identified.
   */
  private AbstractKerberosDescriptor parent = null;

  /**
   * A String declaring the name of this AbstractKerberosDescriptor.
   * <p/>
   * This value may be null in the event a name (or identifier) is not relevant.
   */
  private String name = null;

  /**
   * Generates a Map of data that represents this AbstractKerberosDescriptor implementation.
   * <p/>
   * This method should be overwritten by AbstractKerberosDescriptor implementations to generate a
   * Map of data specific to it.
   * <p/>
   * It is not necessary to call this method from the overriding method.
   * <p/>
   * The map of data generated should be setup so that it can be fed back into the implementation
   * class to build a copy of it. For example:
   * <p/>
   * <pre>
   *  descriptor1 = AbstractKerberosDescriptorImpl(...)
   *  map = descriptor1.toMap()
   *  descriptor2 = AbstractKerberosDescriptor(map)
   *  descriptor1 should have the same data as descriptor2
   * </pre>
   *
   * @return a Map of date representing this AbstractKerberosDescriptor implementation
   */
  public Map<String, Object> toMap() {
    TreeMap<String, Object> dataMap = new TreeMap<String, Object>();
    String name = getName();

    if (name != null) {
      dataMap.put("name", name);
    }

    return dataMap;
  }

  /**
   * Returns the name of this descriptor
   *
   * @return a String indicating the name of this descriptor
   */
  public String getName() {
    return name;
  }

  /**
   * Sets the name of this descriptor
   *
   * @param name a String indicating the name of this descriptor
   */
  public void setName(String name) {
    this.name = name;
  }

  /**
   * Returns the parent (or container) of this descriptor
   *
   * @return an AbstractKerberosDescriptor representing the parent (or container) of this descriptor
   * or null if no parent was set
   */
  public AbstractKerberosDescriptor getParent() {
    return parent;
  }

  /**
   * Sets the parent (or container) of this descriptor
   *
   * @param parent an AbstractKerberosDescriptor representing the parent (or container) of this
   *               descriptor or null to clear the value
   */
  public void setParent(AbstractKerberosDescriptor parent) {
    this.parent = parent;
  }

  /**
   * Test this AbstractKerberosDescriptor to see if it is a container.
   * <p/>
   * The default implementation always returns false.  Implementing classes should override this
   * method to return something different, like true.
   *
   * @return true if this AbstractKerberosDescriptor is a container, false otherwise
   */
  public boolean isContainer() {
    return false;
  }

  /**
   * Safely retrieves the requested value from the supplied Map
   *
   * @param map a Map containing the relevant data
   * @param key a String declaring the item to retrieve
   * @return an Object representing the requested data; or null if not found
   */
  protected static Object getValue(Map<?, ?> map, String key) {
    return ((map == null) || key == null) ? null : map.get(key);
  }

  /**
   * Safely retrieves the requested value (converted to a String) from the supplied Map
   * <p/>
   * The found value will be converted to a String using the {@link Object#toString()} method.
   *
   * @param map a Map containing the relevant data
   * @param key a String declaring the item to retrieve
   * @return a String representing the requested data; or null if not found
   */
  protected static String getStringValue(Map<?, ?> map, String key) {
    Object value = getValue(map, key);
    return (value == null) ? null : value.toString();
  }

  /**
   * Gets the requested AbstractKerberosDescriptor implementation using a type name and a relevant
   * descriptor name.
   * <p/>
   * Implementation classes should override this method to handle relevant descriptor types.
   *
   * @param type a String indicating the type of the requested descriptor
   * @param name a String indicating the name of the requested descriptor
   * @return a AbstractKerberosDescriptor representing the requested descriptor or null if not found
   */
  protected AbstractKerberosDescriptor getDescriptor(Type type, String name) {
    return null;
  }

  /**
   * Traverses up the hierarchy to find the "root" or "parent" container.
   * <p/>
   * The root AbstractKerberosDescriptor is the first descriptor in the hierarchy with a null parent.
   *
   * @return the AbstractKerberosDescriptor implementation that is found to be the root of the hierarchy.
   */
  protected AbstractKerberosDescriptor getRoot() {
    AbstractKerberosDescriptor root = this;

    while (root.getParent() != null) {
      root = root.getParent();
    }

    return root;
  }

  @Override
  public int hashCode() {
    return 37 *
        ((getName() == null)
            ? 0
            : getName().hashCode());
  }

  @Override
  public boolean equals(Object object) {
    if (object == null) {
      return false;
    } else if (object == this) {
      return true;
    } else if (object instanceof AbstractKerberosDescriptor) {
      AbstractKerberosDescriptor descriptor = (AbstractKerberosDescriptor) object;
      return (
          (getName() == null)
              ? (descriptor.getName() == null)
              : getName().equals(descriptor.getName())
      );
    } else {
      return false;
    }
  }

  /**
   * An enumeration of the different Kerberos (sub)descriptors for internal use.
   */
  public enum Type {
    SERVICE("service", "services"),
    COMPONENT("component", "components"),
    IDENTITY("identity", "identities"),
    PRINCIPAL("principal", "principals"),
    KEYTAB("keytab", "keytabs"),
    CONFIGURATION("configuration", "configurations"),
    AUTH_TO_LOCAL_PROPERTY("auth_to_local_property", "auth_to_local_properties");

    private final String descriptorName;
    private final String descriptorPluralName;

    private Type(String descriptorName, String descriptorPluralName) {
      this.descriptorName = descriptorName;
      this.descriptorPluralName = descriptorPluralName;
    }

    /**
     * Gets the identifying name for this Type
     *
     * @return a String declaring the identifying name for this Type
     */
    public String getDescriptorName() {
      return descriptorName;
    }

    /**
     * Gets the identifying name for a group of this Type
     *
     * @return a String declaring the identifying name for a group of this Type
     */
    public String getDescriptorPluralName() {
      return descriptorPluralName;
    }
  }
}
