/*
 * 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/CacheTransactionManager.hpp>
#include "InternalCacheTransactionManager2PC.hpp"
#include "end_native.hpp"
#include "native_shared_ptr.hpp"
#include "TransactionId.hpp"

using namespace System;
namespace Apache
{
  namespace Geode
  {
    namespace Client
    {
      namespace native = apache::geode::client;
      /// <summary>
      /// CacheTransactionManager encapsulates the transactions for a cache
      /// </summary>
      public ref class CacheTransactionManager sealed
      {
      public:
        /// <summary>
        /// Creates a new transaction and associates it with the current thread.
        /// </summary>
        /// <exception cref="IllegalStateException">
        /// Throws exception if the thread is already associated with a transaction
        /// </exception>
        void Begin();

        /// <summary>
        /// Prepare the first message of two-phase-commit transaction associated
        /// with the current thread.
        /// </summary>
        /// <exception cref="IllegalStateException">
        /// if the thread is not associated with a transaction
        /// </exception>
        /// <exception cref="CommitConflictException">
        /// if the commit operation fails due to a write conflict.
        /// </exception>
        void Prepare();

        /// <summary>
        /// Commit the transaction associated with the current thread. If
        /// the commit operation fails due to a conflict it will destroy
        /// the transaction state and throw a <c>CommitConflictException</c>. 
        /// If the commit operation succeeds,it returns after the transaction 
        /// state has been merged with committed state.  When this method 
        /// completes, the thread is no longer associated with a transaction.
        /// </summary>
        /// <exception cref="IllegalStateException">
        /// if the thread is not associated with a transaction
        /// </exception>
        /// <exception cref="CommitConflictException">
        /// if the commit operation fails due to a write conflict.
        /// </exception>
        void Commit();
        
        /// <summary>
        /// Roll back the transaction associated with the current thread. When
        /// this method completes, the thread is no longer associated with a
        /// transaction and the transaction context is destroyed.
        /// </summary>
        /// <exception cref="IllegalStateException">
        /// if the thread is not associated with a transaction
        /// </exception>  
        void Rollback();
        
        /// <summary>
        /// Reports the existence of a Transaction for this thread
        /// </summary>
        /// <returns>true if a transaction exists, false otherwise</returns>
        bool Exists();

        /// <summary>
        /// Suspends the transaction on the current thread. All subsequent operations
        /// performed by this thread will be non-transactional. The suspended
        /// transaction can be resumed by calling <see cref="TransactionId"/>
        /// <para>
        /// Since 3.6.2
        /// </para>
        /// </summary>
        /// <returns>the transaction identifier of the suspended transaction or null if
        /// the thread was not associated with a transaction</returns>
        Apache::Geode::Client::TransactionId^ Suspend();

        /// <summary>
        /// On the current thread, resumes a transaction that was previously suspended
        /// using <see cref="suspend"/>
        /// <para>
        /// Since 3.6.2
        /// </para>
        /// </summary>
        /// <param name="transactionId">the transaction to resume</param>
        /// <exception cref="IllegalStateException">if the thread is associated with a transaction or if
        /// would return false for the given transactionId</exception>
        /// <see cref="TransactionId"/> 
        void Resume(Apache::Geode::Client::TransactionId^ transactionId);

        /// <summary>
        /// This method can be used to determine if a transaction with the given
        /// transaction identifier is currently suspended locally. This method does not
        ///  check other members for transaction status.
        /// <para>
        /// Since 3.6.2
        /// </para>
        /// </summary>
        /// <param name="transactionId"></param>
        /// <returns>true if the transaction is in suspended state, false otherwise</returns>
        /// <see cref="TransactionId"/>
        bool IsSuspended(Apache::Geode::Client::TransactionId^ transactionId);


        /// <summary>
        /// On the current thread, resumes a transaction that was previously suspended
        /// using <see cref="suspend"/>.
        /// This method is equivalent to
        /// <code>
        /// if (isSuspended(txId)) {
        ///   resume(txId);
        /// }
        /// </code>
        /// except that this action is performed atomically
        /// <para>
        /// Since 3.6.2
        /// </para>
        /// </summary>
        /// <param name="transactionId">the transaction to resume</param>
        /// <returns>true if the transaction was resumed, false otherwise</returns>
        bool TryResume(Apache::Geode::Client::TransactionId^ transactionId);


        /// <summary>
        /// On the current thread, resumes a transaction that was previously suspended
        /// using <see cref="suspend"/>, or waits for the specified timeout interval if
        /// the transaction has not been suspended. This method will return if:
        /// <para>
        /// Another thread suspends the transaction
        /// </para>
        /// <para>
        /// Another thread calls commit/rollback on the transaction
        /// </para>
        /// <para>
        /// This thread has waited for the specified timeout
        /// </para>
        /// This method returns immediately if <see cref="TransactionId"/> returns false.
        /// <para>
        /// Since 3.6.2
        /// </para>
        /// </summary>
        /// <param name="transactionId">the transaction to resume</param>
        /// <param name="waitTime">the maximum time to wait </param>
        /// <returns>true if the transaction was resumed, false otherwise</returns>
        bool TryResume(Apache::Geode::Client::TransactionId^ transactionId, TimeSpan waitTime);



        /// <summary>
        /// Reports the existence of a transaction for the given transactionId. This
        /// method can be used to determine if a transaction with the given transaction
        /// identifier is currently in progress locally.
        /// <para>
        /// Since 3.6.2
        /// </para>
        /// </summary>
        /// <param name="transactionId">the given transaction identifier</param>
        /// <returns>true if the transaction is in progress, false otherwise.</returns>
        /// <see cref="isSuspended"/> 
        bool Exists(Apache::Geode::Client::TransactionId^ transactionId);


        /// <summary>
        /// Returns the transaction identifier for the current thread
        /// <para>
        /// Since 3.6.2
        /// </para>
        /// </summary>
        /// <returns>the transaction identifier or null if no transaction exists</returns>
        property Apache::Geode::Client::TransactionId^ TransactionId
        {
        //TODO::split
        Apache::Geode::Client::TransactionId^ get( );
        }        

      internal:

        inline static CacheTransactionManager^ Create(native::InternalCacheTransactionManager2PC* nativeptr )
        {
          return ( nativeptr != nullptr ?
            gcnew CacheTransactionManager( nativeptr ) : nullptr );
        }


      private:

        /// <summary>
        /// Private constructor to wrap a native object pointer
        /// </summary>
        /// <param name="nativeptr">The native object pointer</param>
        inline CacheTransactionManager(native::InternalCacheTransactionManager2PC* nativeptr )
          : m_nativeptr(nativeptr)
        {
        }

        native::InternalCacheTransactionManager2PC* m_nativeptr;
      };
    }  // namespace Client
  }  // namespace Geode
}  // namespace Apache
