package com.marinilli.b2.c12;

/**
 * Chapter 12 - A StarVersion implementation
 *
 * A 'star' single version string.
 * An example of 'star' version is '1.2*'
 *
 * @author Mauro Marinilli
 * @version 1.0
 */

public class StarVersion extends Versionable implements Comparable {
  public final static String STAR_SYMBOL = "*";
  private VersionId versionId;

  /**
   * The Constructor.
   * @param the string representing the version
   */
  public StarVersion(String s) {
    String trimmed = s.trim();
    if (trimmed.endsWith(STAR_SYMBOL))
      versionId = new VersionId(trimmed.substring(0,trimmed.length()-1));
  }

  /**
   * Implements the superclass method
   */
  public boolean match(Versionable v) {
    return false;
  }

  public int compareTo(Object o) {
    /**@todo: Implement this java.lang.Comparable method*/
    throw new java.lang.UnsupportedOperationException("Method compareTo() not yet implemented.");
  }

  public String toString() {
    return versionId.toString()+STAR_SYMBOL;
  }

  public VersionId getVersionId() {
    return versionId;
  }
  /**
   * StarVersion are considered equals when they have the same string
   * representation.
   *
   */
  public boolean equals(Object object) {
    if (!(object instanceof StarVersion))
      return false;
    return toString().equals( ((StarVersion)object).toString() );
  }

  /**
   * return true if the given VersionId is contained
   */
  public boolean contains(VersionId vid) {
    String mine[] = versionId.normalize( versionId.getSingleValues(), versionId.getSingleValues().length);
    String yours[] = versionId.normalize(vid.getSingleValues(), versionId.getSingleValues().length);
    int length = Math.min(versionId.getSingleValues().length, vid.getSingleValues().length);

    for(int i = 0; i < length; i++) {
      if(!mine[i].equals(yours[i]))
        if (VersionId.isNumber(mine[i]) && VersionId.isNumber(yours[i])) {
          int v1 = Integer.parseInt(mine[i]);
          int v2 = Integer.parseInt(yours[i]);
          if (v1!=v2)
            return false;
        } else {
          return mine[i].equals(yours[i]);
        }
      }//-for
      return true;
  }
}