/*
 * 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.
 */

#pragma once


#include "geode_defs.hpp"
#include "begin_native.hpp"
#include <geode/PoolFactory.hpp>
#include "end_native.hpp"

#include "native_shared_ptr.hpp"

namespace Apache
{
  namespace Geode
  {
    namespace Client
    {
      using namespace System;

      namespace native = apache::geode::client;


      ref class Pool;

      /// <summary>
      /// This interface provides for the configuration and creation of instances of Pool.
      /// </summary>

      public ref class PoolFactory sealed
      {
      public:

        /// <summary>
        /// Sets the free connection timeout for this pool.
        /// </summary>
        /// <remarks>
        /// If the pool has a max connections setting, operations will block
        /// if all of the connections are in use. The free connection timeout
        /// specifies how long those operations will block waiting for
        /// a free connection before receiving an AllConnectionsInUseException.
        /// If max connections is not set this setting has no effect.
        /// </remarks>
        /// <param>
        /// connectionTimeout the connection timeout
        /// </param>
        /// <exception>
        /// IllegalArgumentException if connectionTimeout 
        /// is less than or equal to 0.
        /// </exception>
        PoolFactory^ SetFreeConnectionTimeout(TimeSpan connectionTimeout);

        /// <summary>
        /// Sets the load conditioning interval for this pool.
        /// </summary>
        /// <remarks>
        /// This interval controls how frequently the pool will check to see if
        /// a connection to a given server should be moved to a different
        /// server to improve the load balance.
        /// </remarks>
        /// <param>
        /// loadConditioningInterval the connection lifetime
        /// A value of 0 disables load conditioning.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if connectionLifetime
        /// is less than 0.
        /// </exception>
        PoolFactory^ SetLoadConditioningInterval(TimeSpan loadConditioningInterval);

        /// <summary>
        /// Sets the socket buffer size for each connection made in this pool.
        /// </summary>
        /// <remarks>
        /// Large messages can be received and sent faster when this buffer is larger.
        /// Larger buffers also optimize the rate at which servers can send events
        /// for client subscriptions.
        /// </remarks>
        /// <param>
        /// bufferSize the size of the socket buffers used for reading and
        /// writing on each connection in this pool.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if bufferSize
        /// is less than or equal to 0.
        /// </exception>
        PoolFactory^ SetSocketBufferSize(Int32 bufferSize);

        /// <summary>
        /// Sets the time to wait for a response from a server before
        /// timing out the operation and trying another server (if any are available).
        /// </summary>
        /// <param>
        /// timeout to wait for a response from a server
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if timeout
        /// is less than or equal to 0.
        /// </exception>
        PoolFactory^ SetReadTimeout(TimeSpan timeout);

        /// <summary>
        /// Set the minimum number of connections to keep available at all times.
        /// </summary>
        /// <remarks>
        /// When the pool is created, it will create this many connections.
        /// If 0 then connections will not be made until an actual operation
        /// is done that requires client-to-server communication.
        /// </remarks>
        /// <param>
        /// minConnections the initial number of connections this pool will create.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if minConnections is less than 0.
        /// </exception>
        PoolFactory^ SetMinConnections(Int32 minConnections);

        /// <summary>
        /// Set the max number of client to server connections that the pool will create.
        /// </summary>
        /// <remarks>
        /// If all of the connections are in use, an operation requiring a client to
        /// server connection will block until a connection is available.
        /// see setFreeConnectionTimeout(int)
        /// </remarks>
        /// <param>
        /// maxConnections the maximum number of connections in the pool.
        /// -1 indicates that there is no maximum number of connections.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if maxConnections is less than minConnections.
        /// </exception>
        PoolFactory^ SetMaxConnections(Int32 maxConnections);

        /// <summary>
        /// Set the amount of time a connection can be idle before expiring the connection.
        /// </summary>
        /// <remarks>
        /// If the pool size is greater than the minimum specified, connections which have
        /// been idle for longer than the idleTimeout will be closed.
        /// </remarks>
        /// <param>
        /// idleTimeout The amount of time that an idle connection
        /// should live before expiring. 0 indicates that connections should never expire.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if idleTimout is less than 0.
        /// </exception>
        PoolFactory^ SetIdleTimeout(TimeSpan idleTimeout);

        /// <summary>
        /// Set the number of times to retry a request after timeout/exception.
        /// </summary>
        /// <param>
        /// retryAttempts The number of times to retry a request
        /// after timeout/exception. -1 indicates that a request should be
        /// tried against every available server before failing.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if idleTimout is less than 0.
        /// </exception>
        PoolFactory^ SetRetryAttempts(Int32 retryAttempts);

        /// <summary>
        /// Set how often to ping servers to verify that they are still alive.
        /// </summary>
        /// <remarks>
        /// Each server will be sent a ping every pingInterval if there has not
        /// been any other communication with the server.
        /// These pings are used by the server to monitor the health of
        /// the client. Make sure that the pingInterval is less than the
        /// maximum time between pings allowed by the bridge server.
        /// see in CacheServer: setMaximumTimeBetweenPings(int)
        /// </remarks>
        /// <param>
        /// pingInterval The amount of time between pings.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if pingInterval is less than 0.
        /// </exception>
        PoolFactory^ SetPingInterval(TimeSpan pingInterval);

        /// <summary>
        /// Set how often to update locator list from locator
        /// </summary>
        /// <param>
        /// updateLocatorListInterval The amount of time between
        /// updating locator list. If its set to 0 then client will not update
        /// the locator list.
        /// </param>
        /// <returns>
        /// a instance of <c>CacheFactory</c> 
        /// </returns>
        PoolFactory^ SetUpdateLocatorListInterval(TimeSpan updateLocatorListInterval);

        /// <summary>
        /// Set how often to send client statistics to the server.
        /// </summary>
        /// <remarks>
        /// Doing this allows gfmon to monitor clients.
        /// A value of 0 disables the sending of client statistics
        /// to the server.
        /// </remarks>
        /// <param>
        /// statisticInterval The amount of time between
        /// sends of client statistics to the server.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if statisticInterval
        /// is less than 0.
        /// </exception>
        PoolFactory^ SetStatisticInterval(TimeSpan statisticInterval);

        /// <summary>
        /// Configures the group that all servers this pool connects to must belong to.
        /// </summary>
        /// <param>
        /// group the server group that this pool will connect to.
        /// If null or "" then all servers will be connected to.
        /// </param>
        PoolFactory^ SetServerGroup(String^ group);

        /// <summary>
        /// Add a locator, given its host and port, to this factory.
        /// </summary>
        /// <remarks>
        /// The locator must be a server locator and will be used to discover other running
        /// bridge servers and locators.
        /// </remarks>
        /// <param>
        /// host the host name or ip address that the locator is listening on.
        /// </param>
        /// <param>
        /// port the port that the locator is listening on
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if host is an unknown host
        /// or if port is outside the valid range of [1..65535] inclusive.
        /// </exception>
        /// <exception>
        /// throws IllegalStateException if a locator has already been added to this factory.
        /// </exception>
        PoolFactory^ AddLocator(String^ host, Int32 port);

        /// <summary>
        /// Add a server, given its host and port, to this factory.
        /// </summary>
        /// <remarks>
        /// The server must be a bridge server and this client will
        /// directly connect to without consulting a server locator.
        /// </remarks>
        /// <param>
        /// host the host name or ip address that the server is listening on.
        /// </param>
        /// <param>
        /// port the port that the server is listening on
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if host is an unknown host
        /// or if port is outside the valid range of [1..65535] inclusive.
        /// </exception>
        /// <exception>
        /// throws IllegalStateException if a server has already been added to this factory.
        /// </exception>
        PoolFactory^ AddServer(String^ host, Int32 port);

        /// <summary>
        /// Enable subscriptions.
        /// </summary>
        /// <remarks>
        /// If set to true then the created pool will have server-to-client
        /// subscriptions enabled. If set to false then all Subscription*
        /// attributes are ignored at create time.
        /// </remarks>
        PoolFactory^ SetSubscriptionEnabled(Boolean enabled);

        /// <summary>
        /// By default SetPRSingleHopEnabled is true.
        /// </summary>
        /// <remarks>
        /// The client is aware of location of partitions on servers hosting
        /// Using this information, the client routes the client cache operations
        /// directly to the server which is hosting the required partition for the
        /// cache operation. 
        /// If SetPRSingleHopEnabled is false the client can do an extra hop on servers
        /// to go to the required partition for that cache operation.
        /// The SetPRSingleHopEnabled avoids extra hops only for following cache operations :
        /// put, get & destroy operations.
        /// </remarks>
        PoolFactory^ SetPRSingleHopEnabled(Boolean enabled);

        /// <summary>
        /// Sets the redundancy level for this pools server-to-client subscriptions.
        /// </summary>
        /// <remarks>
        /// If 0 then no redundant copies will be kept on the servers.
        /// Otherwise an effort will be made to maintain the requested number of
        /// copies of the server-to-client subscriptions. At most one copy per server will
        /// be made up to the requested level.
        /// </remarks>
        /// <param>
        /// redundancy the number of redundant servers for this client's subscriptions.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if redundancyLevel is less than -1.
        /// </exception>
        PoolFactory^ SetSubscriptionRedundancy(Int32 redundancy);

        /// <summary>
        /// Sets the messageTrackingTimeout attribute which is the time-to-live period,
        /// in milliseconds, for subscription events the client has received from the server.
        /// </summary>
        /// <remarks>
        /// It's used to minimize duplicate events. Entries that have not been modified
        /// for this amount of time are expired from the list.
        /// </remarks>
        /// <param>
        /// messageTrackingTimeout
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if messageTrackingTimeout is less than or equal to 0.
        /// </exception>
        PoolFactory^ SetSubscriptionMessageTrackingTimeout(TimeSpan messageTrackingTimeout);

        /// <summary>
        /// Sets the is the interval in milliseconds to wait before sending
        /// acknowledgements to the bridge server for events received from the server subscriptions.
        /// </summary>
        /// <param>
        /// ackInterval wait before sending event acknowledgements.
        /// </param>
        /// <exception>
        /// throws IllegalArgumentException if ackInterval is less than or equal to 0.
        /// </exception>
        PoolFactory^ SetSubscriptionAckInterval(TimeSpan ackInterval);

        /// <summary>
        /// Enable ThreadLocalConnection.
        /// </summary>
        /// <remarks>
        /// Sets the thread local connections policy for this pool.
        /// If true then any time a thread goes to use a connection
        /// from this pool it will check a thread local cache and see if it already
        /// has a connection in it. If so it will use it. If not it will get one from
        /// this pool and cache it in the thread local. This gets rid of thread contention
        /// for the connections but increases the number of connections the servers see.
        /// If false then connections are returned to the pool as soon
        /// as the operation being done with the connection completes. This allows
        /// connections to be shared amonst multiple threads keeping the number of
        /// connections down.
        /// </remarks>
        PoolFactory^ SetThreadLocalConnections(Boolean enabled);

        /// <summary>
        /// Sets whether pool is in multiuser mode
        /// If its in multiuser mode then app needs to get instance of cache from pool.getCache("creds"), to do the operations on cache.
        /// </summary>
        /// <param>
        /// multiuserAuthentication should be true/false. Default value is false;
        /// </param>
        PoolFactory^ SetMultiuserAuthentication(bool multiuserAuthentication);

        /// <summary>
        /// Resets the configuration of this factory to its defaults.
        /// </summary>
        PoolFactory^ Reset();

        /// <summary>
        /// Create a new Pool for connecting a client to a set of Geode Cache Servers.
        /// using this factory's settings for attributes.
        /// </summary>
        /// <param>
        /// name the name of the pool, used when connecting regions to it
        /// </param>
        /// <exception>
        /// throws IllegalStateException if a pool with name already exists
        /// throws IllegalStateException if a locator or server has not been added.
        /// </exception>
        Pool^ Create(String^ name);

      internal:

        /// <summary>
        /// Internal factory function to wrap a native object pointer inside
        /// this managed class with null pointer check.
        /// </summary>
        /// <param name="nativeptr">The native object pointer</param>
        /// <returns>
        /// The managed wrapper object; null if the native pointer is null.
        /// </returns>
        inline static PoolFactory^ Create(std::shared_ptr<native::PoolFactory> nativeptr)
        {
          return __nullptr == nativeptr ? nullptr :
            gcnew PoolFactory( nativeptr );
        }

      private:

        /// <summary>
        /// Private constructor to wrap a native object pointer
        /// </summary>
        /// <param name="nativeptr">The native object pointer</param>
        inline PoolFactory(std::shared_ptr<native::PoolFactory> nativeptr)
        {
          m_nativeptr = gcnew native_shared_ptr<native::PoolFactory>(nativeptr);
        }

        native_shared_ptr<native::PoolFactory>^ m_nativeptr;
      };
    }  // namespace Client
  }  // namespace Geode
}  // namespace Apache

