/*******************************************************************************
 * Copyright (c) 2010, 2014 Sonatype, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Sonatype, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.aether.ant.types;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.types.Reference;

/**
 */
public class Dependencies
    extends DataType
    implements DependencyContainer
{

    private File file;

    private Pom pom;

    private List<DependencyContainer> containers = new ArrayList<DependencyContainer>();

    private List<Exclusion> exclusions = new ArrayList<Exclusion>();

    private boolean nestedDependencies;

    protected Dependencies getRef()
    {
        return (Dependencies) getCheckedRef();
    }

    public void validate( Task task )
    {
        if ( isReference() )
        {
            getRef().validate( task );
        }
        else
        {
            if ( getPom() != null && getPom().getFile() == null )
            {
                throw new BuildException( "A <pom> used for dependency resolution has to be backed by a pom.xml file" );
            }
            Map<String, String> ids = new HashMap<String, String>();
            for ( DependencyContainer container : containers )
            {
                container.validate( task );
                if ( container instanceof Dependency )
                {
                    Dependency dependency = (Dependency) container;
                    String id = dependency.getVersionlessKey();
                    String collision = ids.put( id, dependency.getVersion() );
                    if ( collision != null )
                    {
                        throw new BuildException( "You must not declare multiple <dependency> elements"
                            + " with the same coordinates but got " + id + " -> " + collision + " vs "
                            + dependency.getVersion() );
                    }
                }
            }
        }
    }

    public void setRefid( Reference ref )
    {
        if ( pom != null || !exclusions.isEmpty() || !containers.isEmpty() )
        {
            throw noChildrenAllowed();
        }
        super.setRefid( ref );
    }

    public void setFile( File file )
    {
        checkAttributesAllowed();
        this.file = file;
        checkExternalSources();
    }

    public File getFile()
    {
        if ( isReference() )
        {
            return getRef().getFile();
        }
        return file;
    }

    public void addPom( Pom pom )
    {
        checkChildrenAllowed();
        if ( this.pom != null )
        {
            throw new BuildException( "You must not specify multiple <pom> elements" );
        }
        this.pom = pom;
        checkExternalSources();
    }

    public Pom getPom()
    {
        if ( isReference() )
        {
            return getRef().getPom();
        }
        return pom;
    }

    public void setPomRef( Reference ref )
    {
        if ( pom == null )
        {
            pom = new Pom();
            pom.setProject( getProject() );
        }
        pom.setRefid( ref );
        checkExternalSources();
    }

    private void checkExternalSources()
    {
        if ( file != null && pom != null )
        {
            throw new BuildException( "You must not specify both a text file and a POM to list dependencies" );
        }
        if ( ( file != null || pom != null ) && nestedDependencies )
        {
            throw new BuildException( "You must not specify both a file/POM and nested dependency collections" );
        }
    }

    public void addDependency( Dependency dependency )
    {
        checkChildrenAllowed();
        containers.add( dependency );
    }

    public void addDependencies( Dependencies dependencies )
    {
        checkChildrenAllowed();
        if ( dependencies == this )
        {
            throw circularReference();
        }
        containers.add( dependencies );
        nestedDependencies = true;
        checkExternalSources();
    }

    public List<DependencyContainer> getDependencyContainers()
    {
        if ( isReference() )
        {
            return getRef().getDependencyContainers();
        }
        return containers;
    }

    public void addExclusion( Exclusion exclusion )
    {
        checkChildrenAllowed();
        this.exclusions.add( exclusion );
    }

    public List<Exclusion> getExclusions()
    {
        if ( isReference() )
        {
            return getRef().getExclusions();
        }
        return exclusions;
    }

}
