/*
 * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package net.java.sip.communicator.service.protocol;

/**
 * The class represents a set of states that a protocol provider may take while
 * registering, logging in, or signing on to a public service server, such as
 * a SIP Registrar, the icq/aim login and registration servers or a jabber
 * server. States are generally supposed to be appearing in the following order:
 * </p><p>
 * Note that the order strongly depends on the particular protocol, which may
 * also influence the exact states that might actually be entered.
 *  </p><p>
 * For more information on the particular states, please check the documentation
 * for each of them.
 *  </p>
 * @author Emil Ivov
 */
public class RegistrationState
{
    private static final String _INIT = "Initial";
    /**
     * The initial state of a protocol provider, assigned to it upon creation
     * and before any registration action has been undertaken by the user.
     */
    public static final RegistrationState INIT =
        new RegistrationState(_INIT);


    public static final String _REGISTERING = "Registering";
    /**
     * A transition state indicating that registration has been undertaken but
     * has not yet been confirmed by the registrar server/service. The state
     * generally occurs after the client has undertaken action to completing the
     * registration and the server is about to respond.
     */
    public static final RegistrationState REGISTERING =
        new RegistrationState(_REGISTERING);


    public static final String _CHALLENGED_FOR_AUTHENTICATION =
        "Challenged for authentication";
    /**
     * The registrar service requires authentication and we are about to send
     * one.
     */
    public static final RegistrationState CHALLENGED_FOR_AUTHENTICATION =
        new RegistrationState(_CHALLENGED_FOR_AUTHENTICATION);


    public static final String _AUTHENTICATING = "Authenticating";
    /**
     * In the process of authenticating. The state is entered when a protocol
     * provider sends authentication info and waits for a confirmation
     */
    public static final RegistrationState AUTHENTICATING =
        new RegistrationState(_AUTHENTICATING);


    public static final String _FINALIZING_REGISTRATION =
        "Finalizing Registration";
    /**
     * Represating any transition state after authentication is completed
     * and before it has been completed. This state wouldn't make sense for
     * many services, and would only be used with others such as ICQ/AIM for
     * example.
     */
    public static final RegistrationState FINALIZING_REGISTRATION =
        new RegistrationState(_FINALIZING_REGISTRATION);

    public static final String _REGISTERED = "Registered";
    /**
     * Registration has completed successfully and we are currently signed
     * on the registration service.
     */
    public static final RegistrationState REGISTERED =
        new RegistrationState(_REGISTERED);

    public static final String _CONNECTION_FAILED = "Connection Failed";
    /**
     * Registration has failed for a technical reason, such as connection
     * disruption for example.
     */
    public static final RegistrationState CONNECTION_FAILED =
        new RegistrationState(_CONNECTION_FAILED);

    public static final String _AUTHENTICATION_FAILED = "Authentication Failed";
    /**
     * Registration has failed because of a problem with the authentication.
     */
    public static final RegistrationState AUTHENTICATION_FAILED =
        new RegistrationState(_AUTHENTICATION_FAILED);

    public static final String _UPDATING_REGISTRATION = "Updating Registration";
    /**
     * Indicates that a protocol provider is currently updating its registration.
     */
    public static final RegistrationState UPDATING_REGISTRATION =
        new RegistrationState(_UPDATING_REGISTRATION);

    public static final String _EXPIRED = "Expired";
    /**
     * The registration has expired.
     */
    public static final RegistrationState EXPIRED =
        new RegistrationState(_EXPIRED);


    public static final String _UNREGISTERED = "Unregistered";
    /**
     * The Protocol Provider is not registered. Most probably due to a
     * unregistration.
     */
    public static final RegistrationState UNREGISTERED =
        new RegistrationState(_UNREGISTERED);


    private String statusString = _INIT;

    private RegistrationState(String statusString)
    {
        this.statusString = statusString;
    }

    /**
     * Returns a String representation of the provider state.
     * @return a String representation of the state.
     */
    public String getStateName()
    {
        return statusString;
    }

    /**
     * Returns a String representation of the provider state.
     * @return a String representation of the state.
     */
    public String toString()
    {
        return new StringBuffer("RegistrationState=")
            .append(getStateName()).toString();
    }

    /**
     * Returns true if the specified object is equal to this provider state.
     * @param obj the object to compare this provider state with.
     * @return true if the specified object represents the same state as this one.
     */
    public boolean equals(Object obj){
        return obj instanceof RegistrationState
               && obj != null
               && statusString.equals(((RegistrationState)obj).statusString);
    }
}
