package org.jboss.windup.project.condition;

/**
 * Object used to specify the version range
 * 
 * @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a>
 *
 */
public class Version
{
    private String from;
    private String to;

    public static Version fromVersion(String from)
    {
        Version v = new Version();
        v.setFrom(from);
        return v;
    }

    public static Version toVersion(String to)
    {
        Version v = new Version();
        v.setTo(to);
        return v;
    }

    public Version to(String to)
    {
        this.setTo(to);
        return this;
    }

    public String getFrom()
    {
        return from;
    }

    public void setFrom(String from)
    {
        this.from = from;
    }

    public String getTo()
    {
        return to;
    }

    public void setTo(String to)
    {
        this.to = to;
    }

    public boolean validate(String versionString)
    {
        boolean result = true;
        if (from != null)
        {
            result = result && firstVersionLesser(from, versionString);
        }
        if (to != null)
        {
            result = result && firstVersionLesser(versionString, to);
        }
        return result;
    }

    private boolean firstVersionLesser(String first, String second)
    {
        boolean firstLesser = false;
        for (int i = 0; i < second.length(); i++)
        {
            if (Character.isDigit(second.charAt(i)))
            {
                int numericValue = Character.getNumericValue(second.charAt(i));
                if (!firstLesser && first != null && Character.isDigit(first.charAt(i)))
                {
                    int firstInt = Character.getNumericValue(first.charAt(i));
                    if (firstInt < numericValue)
                    {
                        firstLesser = true;
                    }
                    if (!firstLesser && (firstInt > numericValue))
                    {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}
