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

import org.apache.ambari.server.orm.entities.ExtensionEntity;
import org.apache.ambari.server.utils.VersionUtils;

/**
 * An extension version is like a stack version but it contains custom services.  Linking an extension
 * version to the current stack version allows the cluster to install the custom services contained in
 * the extension version.
 */
public class ExtensionId implements Comparable<ExtensionId> {

  private static final String NAME_SEPARATOR = "-";

  private String extensionName;
  private String extensionVersion;

  public ExtensionId() {
    extensionName = "";
    extensionVersion = "";
  }

  public ExtensionId(String extensionId) {
    parseExtensionIdHelper(this, extensionId);
  }

  public ExtensionId(ExtensionInfo extension) {
    extensionName = extension.getName();
    extensionVersion = extension.getVersion();
  }

  public ExtensionId(String extensionName, String extensionVersion) {
    this(extensionName + NAME_SEPARATOR + extensionVersion);
  }

  public ExtensionId(ExtensionEntity entity) {
    this(entity.getExtensionName(), entity.getExtensionVersion());
  }

  /**
   * @return the extensionName
   */
  public String getExtensionName() {
    return extensionName;
  }

  /**
   * @return the extensionVersion
   */
  public String getExtensionVersion() {
    return extensionVersion;
  }

  /**
   * @return the extensionVersion
   */
  public String getExtensionId() {
    if (extensionName.isEmpty()
        && extensionVersion.isEmpty()) {
      return "";
    }
    return extensionName + NAME_SEPARATOR + extensionVersion;
  }

  /**
   * @param extensionId the extensionVersion to set
   */
  public void setExtensionId(String extensionId) {
    parseExtensionIdHelper(this, extensionId);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public boolean equals(Object object) {
    if (!(object instanceof ExtensionId)) {
      return false;
    }
    if (this == object) {
      return true;
    }
    ExtensionId s = (ExtensionId) object;
    return extensionName.equals(s.extensionName) && extensionVersion.equals(s.extensionVersion);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public int hashCode() {
    int result = extensionName != null ? extensionName.hashCode() : 0;
    result = 31 * result + (extensionVersion != null ? extensionVersion.hashCode() : 0);
    return result;
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public int compareTo(ExtensionId other) {
    if (this == other) {
      return 0;
    }

    if (other == null) {
      throw new RuntimeException("Cannot compare with a null value.");
    }

    int returnValue = getExtensionName().compareTo(other.getExtensionName());
    if (returnValue == 0) {
      returnValue = VersionUtils.compareVersions(getExtensionVersion(), other.getExtensionVersion());
    } else {
      throw new RuntimeException("ExtensionId with different names cannot be compared.");
    }
    return returnValue;
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public String toString() {
    return getExtensionId();
  }

  private void parseExtensionIdHelper(ExtensionId extensionVersion, String extensionId) {
    if (extensionId == null || extensionId.isEmpty()) {
      extensionVersion.extensionName = "";
      extensionVersion.extensionVersion = "";
      return;
    }

    int pos = extensionId.indexOf('-');
    if (pos == -1 || (extensionId.length() <= (pos + 1))) {
      throw new RuntimeException("Could not parse invalid Extension Id" + ", extensionId=" + extensionId);
    }

    extensionVersion.extensionName = extensionId.substring(0, pos);
    extensionVersion.extensionVersion = extensionId.substring(pos + 1);
  }
}
