/*
 *  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 org.apache.ivy.ant;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;

/**
 * Configure Ivy with an ivysettings.xml file
 */ 
public class IvyConfigure extends Task {

    /**
     * Use to override a previous definition of settings with the same id 
     */
    public static final String OVERRIDE_TRUE = "true";
    /**
     * Use to avoid overriding a previous definition of settings with the same id
     */
    public static final String OVERRIDE_FALSE = "false";
    /**
     * Use to raise an error if attempting to override a previous definition of settings with the
     * same id
     */
    public static final String OVERRIDE_NOT_ALLOWED = "notallowed";

    private static final Collection OVERRIDE_VALUES = Arrays.asList(new String[] {
            OVERRIDE_TRUE, OVERRIDE_FALSE, OVERRIDE_NOT_ALLOWED
    });

    private String override = OVERRIDE_NOT_ALLOWED;
    
    private IvyAntSettings settings = new IvyAntSettings();

    public void setSettingsId(String settingsId) {
        settings.setId(settingsId);
    }
    
    public String getSettingsId() {
        return settings.getId();
    }
    
    public void setOverride(String override) {
        if (!OVERRIDE_VALUES.contains(override)) {
            throw new IllegalArgumentException("invalid override value '" + override + "'. "
                + "Valid values are " + OVERRIDE_VALUES);
        }
        this.override = override;
    }
    
    public String getOverride() {
        return override;
    }
    
    public File getFile() {
        return settings.getFile();
    }

    public void setFile(File file) {
        settings.setFile(file);
    }

    public URL getUrl() {
        return settings.getUrl();
    }

    public void setUrl(String url) throws MalformedURLException {
        settings.setUrl(url);
    }
    
    public void setUrl(URL url) {
        if (url == null) {
            throw new NullPointerException("Cannot set a null URL");
        }
        settings.setUrl(url);
    }

    public String getRealm() {
        return settings.getRealm();
    }

    public void setRealm(String realm) {
        settings.setRealm(realm);
    }

    public String getHost() {
        return settings.getHost();
    }

    public void setHost(String host) {
        settings.setHost(host);
    }

    public String getUserName() {
        return settings.getUsername();
    }

    public void setUserName(String userName) {
        settings.setUsername(userName);
    }

    public String getPasswd() {
        return settings.getPasswd();
    }

    public void setPasswd(String passwd) {
        settings.setPasswd(passwd);
    }

    public void execute() throws BuildException {
        String settingsId = settings.getId();
        Object otherRef = getProject().getReference(settingsId);

        if ((otherRef != null) && OVERRIDE_NOT_ALLOWED.equals(override)) {
            throw new BuildException(
                "Overriding a previous definition of ivy:settings with the id '" 
                + settingsId + "' is not allowed when using override='"
                + OVERRIDE_NOT_ALLOWED + "'.");
        }
        
        if ((otherRef != null) && OVERRIDE_FALSE.equals(override)) {
            verbose("A settings definition is already available for " + settingsId + ": skipping");
            return;
        }
        
        settings.setProject(getProject());
        getProject().addReference(settingsId, settings);        
        settings.createIvyEngine(this);
    }

    private void verbose(String msg) {
        log(msg, Project.MSG_VERBOSE);
    }
}
