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

import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;

import java.io.File;
import java.util.Collection;
import java.util.List;

/**
 * @author <a href="mailto:lcorneliussen@apache.org">Lars Corneliussen</a>
 */
public class NugetInstallParameters
{
    private String packageName;

    private String version;

    private File outputDirectory;

    private boolean prerelease;

    private boolean excludeVersion;

    private List<String> sources;

    public NugetInstallParameters( String packageName )
    {
        Preconditions.checkArgument( packageName != null, "packageName was null!" );

        this.packageName = packageName;
    }

    public Collection<String> buildCommands()
    {
        List<String> commands = Lists.newArrayList();

        commands.add( "install" );

        commands.add( packageName );

        if ( !Strings.isNullOrEmpty( version ) )
        {
            commands.add( "-Version" );
            commands.add( version );
        }

        if ( outputDirectory != null )
        {
            commands.add( "-OutputDirectory" );
            commands.add( outputDirectory.getAbsolutePath() );
        }

        if ( prerelease )
        {
            commands.add( "-Prerelease" );
        }

        if ( excludeVersion )
        {
            commands.add( "-ExcludeVersion" );
        }

        if ( sources != null && sources.size() > 0 )
        {
            for ( String source : sources )
            {
                commands.add( "-Source" );
                commands.add( source );
            }
        }

        return commands;
    }

    public void setSources( List<String> sources )
    {
        this.sources = sources;
    }

    public void setVersion( String version )
    {
        this.version = version;
    }

    public void setOutputDirectory( File outputDirectory )
    {
        this.outputDirectory = outputDirectory;
    }

    public void setPrerelease( boolean prerelease )
    {
        this.prerelease = prerelease;
    }

    public void setExcludeVersion( boolean excludeVersion )
    {
        this.excludeVersion = excludeVersion;
    }
}
