/*
 *
 * 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.qpid.proton.reactor.impl;


/**
 * Address
 *
 */
public class Address
{

    private String _address;
    private boolean _passive;
    private String _scheme;
    private String _user;
    private String _pass;
    private String _host;
    private String _port;
    private String _name;

    public void clear()
    {
        _passive = false;
        _scheme = null;
        _user = null;
        _pass = null;
        _host = null;
        _port = null;
        _name = null;
    }

    /**
     * @deprecated Messenger will be removed from upcoming proton-j releases.
     */
    public Address()
    {
        clear();
    }

    /**
     * @deprecated Messenger will be removed from upcoming proton-j releases.
     */
    public Address(String address)
    {
        clear();
        int start = 0;
        int schemeEnd = address.indexOf("://", start);
        if (schemeEnd >= 0) {
            _scheme = address.substring(start, schemeEnd);
            start = schemeEnd + 3;
        }

        String uphp;
        int slash = address.indexOf("/", start);
        if (slash >= 0) {
            uphp = address.substring(start, slash);
            _name = address.substring(slash + 1);
        } else {
            uphp = address.substring(start);
        }

        String hp;
        int at = uphp.indexOf('@');
        if (at >= 0) {
            String up = uphp.substring(0, at);
            hp = uphp.substring(at + 1);

            int colon = up.indexOf(':');
            if (colon >= 0) {
                _user = up.substring(0, colon);
                _pass = up.substring(colon + 1);
            } else {
                _user = up;
            }
        } else {
            hp = uphp;
        }

        if (hp.startsWith("[")) {
            int close = hp.indexOf(']');
            if (close >= 0) {
                _host = hp.substring(1, close);
                if (hp.substring(close + 1).startsWith(":")) {
                    _port = hp.substring(close + 2);
                }
            }
        }

        if (_host == null) {
            int colon = hp.indexOf(':');
            if (colon >= 0) {
                _host = hp.substring(0, colon);
                _port = hp.substring(colon + 1);
            } else {
                _host = hp;
            }
        }

        if (_host.startsWith("~")) {
            _host = _host.substring(1);
            _passive = true;
        }
    }

    public String toString()
    {
        String  str = new String();
        if (_scheme != null) str += _scheme + "://";
        if (_user != null) str += _user;
        if (_pass != null) str += ":" + _pass;
        if (_user != null || _pass != null) str += "@";
        if (_host != null) {
            if (_host.contains(":")) str += "[" + _host + "]";
            else str += _host;
        }
        if (_port != null) str += ":" + _port;
        if (_name != null) str += "/" + _name;
        return str;
    }

    public boolean isPassive()
    {
        return _passive;
    }

    public String getScheme()
    {
        return _scheme;
    }

    public String getUser()
    {
        return _user;
    }

    public String getPass()
    {
        return _pass;
    }

    public String getHost()
    {
        return _host;
    }

    public String getPort()
    {
        return _port;
    }

    public String getImpliedPort()
    {
        if (_port == null) {
            return getDefaultPort();
        } else {
            return getPort();
        }
    }

    public String getDefaultPort()
    {
        if ("amqps".equals(_scheme)) return "5671";
        else return "5672";
    }

    public String getName()
    {
        return _name;
    }

    public void setScheme(String scheme)
    {
        _scheme= scheme;
    }

    public void setUser(String user)
    {
        _user= user;
    }

    public void setPass(String pass)
    {
        _pass= pass;
    }

    public void setHost(String host)
    {
        _host= host;
    }

    public void setPort(String port)
    {
        _port= port;
    }

    public void setName(String name)
    {
        _name= name;
    }
}
