/*
 *   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.directory.ldap.client.api;


import java.io.IOException;

import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.message.AddRequest;
import org.apache.directory.api.ldap.model.message.BindRequest;
import org.apache.directory.api.ldap.model.message.CompareRequest;
import org.apache.directory.api.ldap.model.message.DeleteRequest;
import org.apache.directory.api.ldap.model.message.ExtendedRequest;
import org.apache.directory.api.ldap.model.message.ModifyDnRequest;
import org.apache.directory.api.ldap.model.message.ModifyRequest;
import org.apache.directory.api.ldap.model.message.SearchRequest;
import org.apache.directory.api.ldap.model.message.SearchScope;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.ldap.client.api.future.AddFuture;
import org.apache.directory.ldap.client.api.future.BindFuture;
import org.apache.directory.ldap.client.api.future.CompareFuture;
import org.apache.directory.ldap.client.api.future.DeleteFuture;
import org.apache.directory.ldap.client.api.future.ExtendedFuture;
import org.apache.directory.ldap.client.api.future.ModifyDnFuture;
import org.apache.directory.ldap.client.api.future.ModifyFuture;
import org.apache.directory.ldap.client.api.future.SearchFuture;


/**
 * Root interface for all asynchronous LDAP connections.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public interface LdapAsyncConnection extends LdapConnection
{

    /**
     * Add an entry to the server asynchronously. This is a non blocking add :
     * the user has to get for the response from the returned Future.
     * 
     * @param entry The entry to add
     * @return the add operation's future
     * @throws LdapException if some error occurred
     */
    AddFuture addAsync( Entry entry ) throws LdapException;


    /**
     * Add an entry present in the AddRequest to the server.
     * 
     * @param addRequest the request object containing an entry and controls(if any)
     * @return the add operation's future
     * @throws LdapException if some error occurred
     */
    AddFuture addAsync( AddRequest addRequest ) throws LdapException;


    /**
     * Asynchronous Bind on a server, using the LdapConnectionConfig informations.
     *
     * @return the bind operation's future
     * @throws LdapException if some error occurred
     * @throws IOException if some IO error occurred
     */
    BindFuture bindAsync() throws LdapException, IOException;


    /**
     * Anonymous asynchronous Bind on a server.
     *
     * @return the bind operation's future
     * @throws LdapException if some error occurred
     * @throws IOException if some IO error occurred
     */
    BindFuture anonymousBindAsync() throws LdapException, IOException;


    /**
     * Simple asynchronous Bind on a server.
     *
     * @param name The name we use to authenticate the user, it must be a valid Dn
     * @param credentials The password, it can't be null
     * @return the bind operation's future
     * @throws LdapException if some error occurred
     * @throws IOException if some IO error occurred
     */
    BindFuture bindAsync( String name, String credentials ) throws LdapException, IOException;


    /**
     * Simple asynchronous Bind on a server.
     *
     * @param name The name we use to authenticate the user, it must be a valid Dn
     * @param credentials The password, it can't be null
     * @return the bind operation's future
     * @throws LdapException if some error occurred
     * @throws IOException if some IO error occurred
     */
    BindFuture bindAsync( Dn name, String credentials ) throws LdapException, IOException;


    /**
     * Do an asynchronous bind, based on a BindRequest.
     *
     * @param bindRequest The BindRequest to send
     * @return the bind operation's future
     * @throws LdapException if some error occurred
     * @throws IOException if some IO error occurred
     */
    BindFuture bindAsync( BindRequest bindRequest ) throws LdapException, IOException;


    /**
     * Do an asynchronous search, on the base object, using the given filter. The
     * SearchRequest parameters default to :
     * <pre>
     * Scope : ONE
     * DerefAlias : ALWAYS
     * SizeLimit : none
     * TimeLimit : none
     * TypesOnly : false
     * Attributes : all the user's attributes.
     * This method is blocking.
     * </pre>
     * 
     * @param baseDn The base for the search, it must be a valid Dn, and can't be emtpy
     * @param filter The filter to use for this search, it can't be empty
     * @param scope The search scope : OBJECT, ONELEVEL or SUBTREE
     * @param attributes The attributes for this search
     * @return the search operation's future
     * @throws org.apache.directory.api.ldap.model.exception.LdapException if some error occurred
     */
    SearchFuture searchAsync( String baseDn, String filter, SearchScope scope, String... attributes )
        throws LdapException;


    /**
     * Do an asynchronous search, on the base object, using the given filter. The
     * SearchRequest parameters default to :
     * <pre>
     * Scope : ONE
     * DerefAlias : ALWAYS
     * SizeLimit : none
     * TimeLimit : none
     * TypesOnly : false
     * Attributes : all the user's attributes.
     * This method is blocking.
     * </pre>
     * 
     * @param baseDn The base for the search, it must be a valid Dn, and can't be empty
     * @param filter The filter to use for this search, it can't be empty
     * @param scope The search scope : OBJECT, ONELEVEL or SUBTREE
     * @param attributes The attributes for this search
     * @return the search operation's future
     * @throws LdapException if some error occurred
     */
    SearchFuture searchAsync( Dn baseDn, String filter, SearchScope scope, String... attributes )
        throws LdapException;


    /**
     * Do a search, on the base object, using the given filter. The
     * SearchRequest parameters default to :
     * <pre>
     * Scope : ONE
     * DerefAlias : ALWAYS
     * SizeLimit : none
     * TimeLimit : none
     * TypesOnly : false
     * Attributes : all the user's attributes.
     * This method is blocking.
     * </pre>
     * 
     * @param searchRequest The search request to send to the server
     * @return the search operation's future
     * @throws LdapException if some error occurred
     */
    SearchFuture searchAsync( SearchRequest searchRequest ) throws LdapException;


    /**
     * Performs an asynchronous modify operation based on the modifications present in
     * the ModifyRequest.
     *
     * @param modRequest the request for modify operation
     * @return the modify operation's future
     * @throws LdapException in case of modify operation failure or timeout happens
     */
    ModifyFuture modifyAsync( ModifyRequest modRequest ) throws LdapException;


    /**
     * Performs the modifyDn operation based on the given ModifyDnRequest.
     *
     * @param modDnRequest the request
     * @return modifyDn operation's future
     * @throws LdapException if some error occurred
     */
    ModifyDnFuture modifyDnAsync( ModifyDnRequest modDnRequest ) throws LdapException;


    /**
     * Performs an asynchronous delete operation based on the delete request object.
     * 
     * @param delRequest the delete operation's request
     * @return delete operation's future
     * @throws LdapException If the Dn is not valid or if the deletion failed
     */
    DeleteFuture deleteAsync( DeleteRequest delRequest ) throws LdapException;


    /**
     * Asynchronously compares an entry's attribute's value with that of the given value
     * 
     * @param compareRequest the CompareRequest which contains the target Dn, attribute name and value
     * @return compare operation's future
     * @throws LdapException if some error occurred
     */
    CompareFuture compareAsync( CompareRequest compareRequest ) throws LdapException;


    /**
     * Asynchronously requests the server to perform an extended operation based on the given request.
     *
     * @param extendedRequest the object containing the details of the extended operation to be performed
     * @return extended operation's Future
     * @throws LdapException if some error occurred
     */
    ExtendedFuture extendedAsync( ExtendedRequest extendedRequest ) throws LdapException;


    /**
     * Configuration of LdapNetworkConnection
     * 
     * @return the configuration of the LDAP connection
     */
    LdapConnectionConfig getConfig();
}