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


#include "Pool.hpp"
#include "QueryService.hpp"
#include "CacheableString.hpp"
#include "Cache.hpp"
#include "ExceptionTypes.hpp"
#include "impl/SafeConvert.hpp"
#include "TimeUtils.hpp"


namespace Apache
{
  namespace Geode
  {
    namespace Client
    {

      using namespace msclr::interop;
      using namespace System;

      String^ Pool::Name::get( )
      {
        try
        {
          return marshal_as<String^>( m_nativeptr->get()->getName( ) );
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::FreeConnectionTimeout::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getFreeConnectionTimeout());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::LoadConditioningInterval::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getLoadConditioningInterval());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      Int32 Pool::SocketBufferSize::get()
      {
        try
        {
          return m_nativeptr->get()->getSocketBufferSize();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::ReadTimeout::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getReadTimeout());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      Int32 Pool::MinConnections::get()
      {
        try
        {
          return m_nativeptr->get()->getMinConnections();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      Int32 Pool::MaxConnections::get()
      {
        try
        {
          return m_nativeptr->get()->getMaxConnections();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::IdleTimeout::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getIdleTimeout());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::PingInterval::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getPingInterval());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::UpdateLocatorListInterval::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getUpdateLocatorListInterval());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::StatisticInterval::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getStatisticInterval());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      Int32 Pool::RetryAttempts::get()
      {
        try
        {
          return m_nativeptr->get()->getRetryAttempts();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      Boolean Pool::SubscriptionEnabled::get()
      {
        try
        {
          return m_nativeptr->get()->getSubscriptionEnabled();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      Boolean Pool::PRSingleHopEnabled::get()
      {
        try
        {
          return m_nativeptr->get()->getPRSingleHopEnabled();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      Int32 Pool::SubscriptionRedundancy::get()
      {
        try
        {
          return m_nativeptr->get()->getSubscriptionRedundancy();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::SubscriptionMessageTrackingTimeout::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getSubscriptionMessageTrackingTimeout());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      TimeSpan Pool::SubscriptionAckInterval::get()
      {
        try
        {
          return TimeUtils::DurationToTimeSpan(m_nativeptr->get()->getSubscriptionAckInterval());
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      String^ Pool::ServerGroup::get( )
      {
        try
        {
          return marshal_as<String^>( m_nativeptr->get()->getServerGroup( ) );
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      array<String^>^ Pool::Locators::get()
      {
        try
        {
          auto locators = m_nativeptr->get()->getLocators();
          int length = locators->length();
          if (length > 0)
          {
            auto result = gcnew array<String^>(length);
            for (int item = 0; item < length; item++)
            {
              result[item] = marshal_as<String^>((*locators)[item]->toString());
            }
            return result;
          }
          else
          {
            return nullptr;
          }
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }
      }


      array<String^>^ Pool::Servers::get()
      {
        try
        {
          auto servers = m_nativeptr->get()->getServers();
          int length = servers->length();
          if (length > 0)
          {
            array<String^>^ result = gcnew array<String^>(length);
            for (int item = 0; item < length; item++)
            {
              result[item] = marshal_as<String^>((*servers)[item]->toString());
            }
            return result;
          }
          else
          {
            return nullptr;
          }
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }
      }

	  //generic<class TKey, class TValue>
      Boolean Pool::ThreadLocalConnections::get()
      {
        try
        {
          return m_nativeptr->get()->getThreadLocalConnections();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      bool Pool::MultiuserAuthentication::get()
      {
        try
        {
          return m_nativeptr->get()->getMultiuserAuthentication();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }
    
      }
      

      void Pool::Destroy(Boolean KeepAlive)
      {
        try
        {
          m_nativeptr->get()->destroy(KeepAlive);
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }

      void Pool::ReleaseThreadLocalConnection()
      {
        try
        {
          m_nativeptr->get()->releaseThreadLocalConnection();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      void Pool::Destroy()
      {
        try
        {
          m_nativeptr->get()->destroy();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }


      Boolean Pool::Destroyed::get()
      {
        try
        {
          return m_nativeptr->get()->isDestroyed();
        }
        finally
        {
          GC::KeepAlive(m_nativeptr);
        }

      }

      QueryService^ Pool::GetQueryService()
      {
        _GF_MG_EXCEPTION_TRY2/* due to auto replace */

          try
          {
            return QueryService::Create(m_nativeptr->get()->getQueryService());
          }
          finally
          {
            GC::KeepAlive(m_nativeptr);
          }


        _GF_MG_EXCEPTION_CATCH_ALL2/* due to auto replace */
      }
      
      Int32 Pool::PendingEventCount::get()
      {
        _GF_MG_EXCEPTION_TRY2

          try
          {
            return m_nativeptr->get()->getPendingEventCount();
          }
          finally
          {
            GC::KeepAlive(m_nativeptr);
          }


        _GF_MG_EXCEPTION_CATCH_ALL2
      }
    }  // namespace Client
  }  // namespace Geode
}  // namespace Apache
