package org.apache.archiva.proxy.common;
/*
 * 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.
 */

import org.apache.archiva.admin.model.beans.NetworkProxy;
import org.apache.commons.lang.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Olivier Lamy
 * @since 1.4-M4
 */
public class WagonFactoryRequest
{

    public static final String USER_AGENT_SYSTEM_PROPERTY = "archiva.userAgent";

    private static String DEFAULT_USER_AGENT = "Java-Archiva";

    /**
     * the protocol to find the Wagon for, which must be prefixed with <code>wagon#</code>, for example
     * <code>wagon#http</code>. <b>to have a wagon supporting ntlm add -ntlm</b>
     */
    private String protocol;

    private Map<String, String> headers = new HashMap<>();

    private String userAgent = DEFAULT_USER_AGENT;

    static {
        if ( StringUtils.isNotBlank( System.getProperty( USER_AGENT_SYSTEM_PROPERTY))) {
            DEFAULT_USER_AGENT=System.getProperty(USER_AGENT_SYSTEM_PROPERTY);
        }
    }

    private NetworkProxy networkProxy;

    public WagonFactoryRequest()
    {
        // no op
    }

    public WagonFactoryRequest( String protocol, Map<String, String> headers )
    {
        this.protocol = protocol;
        this.headers = headers;
    }

    public String getProtocol()
    {
        return protocol;
    }

    public void setProtocol( String protocol )
    {
        this.protocol = protocol;
    }

    public WagonFactoryRequest protocol( String protocol )
    {
        this.protocol = protocol;
        return this;
    }

    public Map<String, String> getHeaders()
    {
        if ( this.headers == null )
        {
            this.headers = new HashMap<>();
        }
        return headers;
    }

    public void setHeaders( Map<String, String> headers )
    {
        this.headers = headers;
    }

    public WagonFactoryRequest headers( Map<String, String> headers )
    {
        this.headers = headers;
        return this;
    }

    public String getUserAgent()
    {
        return userAgent;
    }

    public void setUserAgent( String userAgent )
    {
        this.userAgent = userAgent;
    }

    public WagonFactoryRequest userAgent( String userAgent )
    {
        this.userAgent = userAgent;
        return this;
    }

    public NetworkProxy getNetworkProxy()
    {
        return networkProxy;
    }

    public void setNetworkProxy( NetworkProxy networkProxy )
    {
        this.networkProxy = networkProxy;
    }

    public WagonFactoryRequest networkProxy( NetworkProxy networkProxy )
    {
        this.networkProxy = networkProxy;
        return this;
    }

    @Override
    public boolean equals( Object o )
    {
        if ( this == o )
        {
            return true;
        }
        if ( !( o instanceof WagonFactoryRequest ) )
        {
            return false;
        }

        WagonFactoryRequest that = (WagonFactoryRequest) o;

        if ( protocol != null ? !protocol.equals( that.protocol ) : that.protocol != null )
        {
            return false;
        }
        if ( userAgent != null ? !userAgent.equals( that.userAgent ) : that.userAgent != null )
        {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode()
    {
        int result = protocol != null ? protocol.hashCode() : 0;
        result = 31 * result + ( userAgent != null ? userAgent.hashCode() : 0 );
        return result;
    }

    @Override
    public String toString()
    {
        return "WagonFactoryRequest{" +
            "protocol='" + protocol + '\'' +
            ", headers=" + headers +
            ", userAgent='" + userAgent + '\'' +
            ", networkProxy=" + networkProxy +
            '}';
    }
}
