/*
 * Copyright (c) 2015 Eike Stepper (Berlin, Germany) and others.
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */

/**
 * @author Eike Stepper
 */
public final class Version implements Comparable<Version>
{
  private final Integer major;

  private final Integer minor;

  private final Integer micro;

  public Version(String name)
  {
    for (int i = 0; i < name.length(); i++)
    {
      char c = name.charAt(i);
      if (!Character.isDigit(c) && c != '.')
      {
        name = name.substring(0, i);
        break;
      }
    }

    String[] segments = name.split("\\.");
    major = Integer.parseInt(segments[0]);
    minor = Integer.parseInt(segments[1]);
    micro = Integer.parseInt(segments[2]);
  }

  public boolean isGreaterThan(Version other)
  {
    return compareTo(other) > 0;
  }

  @Override
  public int compareTo(Version o)
  {
    int result = major.compareTo(o.major);
    if (result == 0)
    {
      result = minor.compareTo(o.minor);
      if (result == 0)
      {
        result = micro.compareTo(o.micro);
      }
    }

    return result;
  }

  @Override
  public String toString()
  {
    return major + "." + minor + "." + micro;
  }
}
