/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 * 
 *  http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file 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.
 */
using System;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
using Amazon.Util;
using System.Linq;
using System.Threading;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace Amazon.DynamoDBv2.DocumentModel
{
    public partial class Table
    {
        #region PutItem
        /// 
        /// Puts a document into DynamoDB.
        /// 
        /// Document to save.
        public void PutItem(Document doc)
        {
            PutItem(doc, null);
        }
        /// 
        /// Puts a document into DynamoDB, using specified configs.
        /// 
        /// Document to save.
        /// Configuration to use.
        /// Null or updated attributes, depending on config.
        public Document PutItem(Document doc, PutItemOperationConfig config)
        {
            return PutItemHelper(doc, config);
        }
        /// 
        /// Puts a document into DynamoDB, using specified configs.
        /// 
        /// Document to save.
        /// Configuration to use.
        /// True if put was successful or false if the condition in the config was not met.
        public bool TryPutItem(Document doc, PutItemOperationConfig config)
        {
            try
            {
                PutItemHelper(doc, config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        #endregion
        #region GetItem
        /// 
        /// Gets a document from DynamoDB by hash primary key.
        /// 
        /// Hash key element of the document.
        /// Document from DynamoDB
        public Document GetItem(Primitive hashKey)
        {
            return GetItemHelper(MakeKey(hashKey, null), null);
        }
        /// 
        /// Gets a document from DynamoDB by hash-and-range primary key.
        /// 
        /// Hash key element of the document.
        /// Range key element of the document.
        /// Document from DynamoDB.
        public Document GetItem(Primitive hashKey, Primitive rangeKey)
        {
            return GetItemHelper(MakeKey(hashKey, rangeKey), null);
        }
        /// 
        /// Gets a document from DynamoDB by hash primary key, using specified configs.
        /// 
        /// Hash key element of the document.
        /// Configuration to use.
        /// Document from DynamoDB.
        public Document GetItem(Primitive hashKey, GetItemOperationConfig config)
        {
            return GetItemHelper(MakeKey(hashKey, null), config);
        }
        /// 
        /// Gets a document from DynamoDB by hash-and-range primary key,
        /// using specified configs.
        /// 
        /// Hash key element of the document.
        /// Range key element of the document.
        /// Configuration to use.
        /// Document from DynamoDB.
        public Document GetItem(Primitive hashKey, Primitive rangeKey, GetItemOperationConfig config)
        {
            return GetItemHelper(MakeKey(hashKey, rangeKey), config);
        }
        /// 
        /// Gets a document from DynamoDB by key.
        /// 
        /// Values that make up the key of the document.
        /// Document from DynamoDB
        public Document GetItem(IDictionary key)
        {
            return GetItemHelper(MakeKey(key), null);
        }
        /// 
        /// Gets a document from DynamoDB by key, using specified configs.
        /// 
        /// Key of the document.
        /// Configuration to use.
        /// Document from DynamoDB.
        public Document GetItem(IDictionary key, GetItemOperationConfig config)
        {
            return GetItemHelper(MakeKey(key), config);
        }
        #endregion
        #region UpdateItem
        /// 
        /// Update a document in DynamoDB.
        /// 
        /// Document to update.
        public void UpdateItem(Document doc)
        {
            UpdateHelper(doc, MakeKey(doc), null);
        }
        /// 
        /// Update a document in DynamoDB, with key to identify the document.
        /// 
        /// Attributes to update.
        /// Key of the document.
        public void UpdateItem(Document doc, IDictionary key)
        {
            UpdateHelper(doc, MakeKey(key), null);
        }
        /// 
        /// Update a document in DynamoDB, with hash primary key to identify the document.
        /// 
        /// Attributes to update.
        /// Hash key element of the document.
        public void UpdateItem(Document doc, Primitive hashKey)
        {
            UpdateHelper(doc, MakeKey(hashKey, null), null);
        }
        /// 
        /// Update a document in DynamoDB, with a hash-and-range primary key
        /// to identify the document.
        /// 
        /// Attributes to update.
        /// Hash key element of the document.
        /// Range key element of the document.
        public void UpdateItem(Document doc, Primitive hashKey, Primitive rangeKey)
        {
            UpdateHelper(doc, MakeKey(hashKey, rangeKey), null);
        }
        /// 
        /// Update a document in DynamoDB, using specified config.
        /// 
        /// Document to update.
        /// Configuration to use.
        /// Null or updated attributes, depending on config.
        /// 
        public Document UpdateItem(Document doc, UpdateItemOperationConfig config)
        {
            return UpdateHelper(doc, MakeKey(doc), config);
        }
        /// 
        /// Update a document in DynamoDB, using specified config.
        /// 
        /// Document to update.
        /// Configuration to use.
        /// True if updated or false if the condition in the config was not met.
        /// 
        public bool TryUpdateItem(Document doc, UpdateItemOperationConfig config)
        {
            try
            {
                UpdateHelper(doc, MakeKey(doc), config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        /// 
        /// Update a document in DynamoDB, with a key to identify the
        /// document, and using the specified config.
        /// 
        /// Attributes to update.
        /// Key of the document.
        /// Configuration to use.
        /// Null or updated attributes, depending on config.
        /// 
        public Document UpdateItem(Document doc, IDictionary key, UpdateItemOperationConfig config)
        {
            return UpdateHelper(doc, MakeKey(key), config);
        }
        /// 
        /// Update a document in DynamoDB, with a key to identify the
        /// document, and using the specified config.
        /// 
        /// Attributes to update.
        /// Key of the document.
        /// Configuration to use.
        /// True if updated or false if the condition in the config was not met.
        /// 
        public bool TryUpdateItem(Document doc, IDictionary key, UpdateItemOperationConfig config)
        {
            try
            {
                UpdateHelper(doc, MakeKey(key), config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        /// 
        /// Update a document in DynamoDB, with a hash primary key to identify the
        /// document, and using the specified config.
        /// 
        /// Attributes to update.
        /// Hash key element of the document.
        /// Configuration to use.
        /// Null or updated attributes, depending on config.
        /// 
        public Document UpdateItem(Document doc, Primitive hashKey, UpdateItemOperationConfig config)
        {
            return UpdateHelper(doc, MakeKey(hashKey, null), config);
        }
        /// 
        /// Update a document in DynamoDB, with a hash primary key to identify the
        /// document, and using the specified config.
        /// 
        /// Attributes to update.
        /// Hash key element of the document.
        /// Configuration to use.
        /// True if updated or false if the condition in the config was not met.
        /// 
        public bool TryUpdateItem(Document doc, Primitive hashKey, UpdateItemOperationConfig config)
        {
            try
            {
                UpdateHelper(doc, MakeKey(hashKey, null), config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        /// 
        /// Update a document in DynamoDB, with a hash-and-range primary key to identify
        /// the document, and using the specified config.
        /// 
        /// Attributes to update.
        /// Hash key element of the document.
        /// Range key element of the document.
        /// Configuration to use.
        /// Null or updated attributes, depending on config.
        /// 
        public Document UpdateItem(Document doc, Primitive hashKey, Primitive rangeKey, UpdateItemOperationConfig config)
        {
            return UpdateHelper(doc, MakeKey(hashKey, rangeKey), config);
        }
        /// 
        /// Update a document in DynamoDB, with a hash-and-range primary key to identify
        /// the document, and using the specified config.
        /// 
        /// Attributes to update.
        /// Hash key element of the document.
        /// Range key element of the document.
        /// Configuration to use.
        /// True if updated or false if the condition in the config was not met.
        /// 
        public bool TryUpdateItem(Document doc, Primitive hashKey, Primitive rangeKey, UpdateItemOperationConfig config)
        {
            try
            {
                UpdateHelper(doc, MakeKey(hashKey, rangeKey), config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        #endregion
        #region DeleteItem
        /// 
        /// Delete a document in DynamoDB.
        /// 
        /// Document to delete.
        public void DeleteItem(Document document)
        {
            DeleteHelper(MakeKey(document), null);
        }
        /// 
        /// Delete a document in DynamoDB, identified by a hash primary key.
        /// 
        /// Hash key element of the document.
        public void DeleteItem(Primitive hashKey)
        {
            DeleteHelper(MakeKey(hashKey, null), null);
        }
        /// 
        /// Delete a document in DynamoDB, identified by a hash-and-range primary key.
        /// 
        /// Hash key element of the document.
        /// Range key element of the document.
        public void DeleteItem(Primitive hashKey, Primitive rangeKey)
        {
            DeleteHelper(MakeKey(hashKey, rangeKey), null);
        }
        /// 
        /// Delete a document in DynamoDB, identified by a key.
        /// 
        /// Hash key element of the document.
        public void DeleteItem(IDictionary key)
        {
            DeleteHelper(MakeKey(key), null);
        }
        /// 
        /// Delete a document in DynamoDB, using specified configs.
        /// 
        /// If the condition set on the config fails.
        /// Document to delete.
        /// Configuration to use.
        /// Null or old attributes, depending on config.
        public Document DeleteItem(Document document, DeleteItemOperationConfig config)
        {
            return DeleteHelper(MakeKey(document), config);
        }
        /// 
        /// Delete a document in DynamoDB, using specified configs.
        /// 
        /// Document to delete.
        /// Configuration to use.
        /// True if deleted or false if the condition in the config was not met.
        public bool TryDeleteItem(Document document, DeleteItemOperationConfig config)
        {
            try
            {
                DeleteItem(document, config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        /// 
        /// Delete a document in DynamoDB, identified by a hash primary key,
        /// using specified configs.
        /// 
        /// If the condition set on the config fails.
        /// Hash key element of the document.
        /// Configuration to use.
        /// Null or old attributes, depending on config.
        public Document DeleteItem(Primitive hashKey, DeleteItemOperationConfig config)
        {
            return DeleteHelper(MakeKey(hashKey, null), config);
        }
        /// 
        /// Delete a document in DynamoDB, identified by a hash primary key,
        /// using specified configs.
        /// 
        /// Hash key element of the document.
        /// Configuration to use.
        /// True if deleted or false if the condition in the config was not met.
        public bool TryDeleteItem(Primitive hashKey, DeleteItemOperationConfig config)
        {
            try
            {
                DeleteItem(hashKey, config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        /// 
        /// Delete a document in DynamoDB, identified by hash-and-range primary key,
        /// using the specified configs.
        /// 
        /// If the condition set on the config fails.
        /// Hash key element of the document.
        /// Range key element of the document.
        /// Configuration to use.
        /// Null or old attributes, depending on config.
        public Document DeleteItem(Primitive hashKey, Primitive rangeKey, DeleteItemOperationConfig config)
        {
            return DeleteHelper(MakeKey(hashKey, rangeKey), config);
        }
        /// 
        /// Delete a document in DynamoDB, identified by hash-and-range primary key,
        /// using the specified configs.
        /// 
        /// Hash key element of the document.
        /// Range key element of the document.
        /// Configuration to use.
        /// True if deleted or false if the condition in the config was not met.
        public bool TryDeleteItem(Primitive hashKey, Primitive rangeKey, DeleteItemOperationConfig config)
        {
            try
            {
                DeleteItem(hashKey, rangeKey, config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        /// 
        /// Delete a document in DynamoDB, identified by a key, using specified configs.
        /// 
        /// If the condition set on the config fails.
        /// Key of the document.
        /// Configuration to use.
        /// Null or old attributes, depending on config.
        public Document DeleteItem(IDictionary key, DeleteItemOperationConfig config)
        {
            return DeleteHelper(MakeKey(key), config);
        }
        /// 
        /// Delete a document in DynamoDB, identified by a key, using specified configs.
        /// 
        /// Key of the document.
        /// Configuration to use.
        /// True if deleted or false if the condition in the config was not met.
        public bool TryDeleteItem(IDictionary key, DeleteItemOperationConfig config)
        {
            try
            {
                DeleteHelper(MakeKey(key), config);
                return true;
            }
            catch (ConditionalCheckFailedException)
            {
                return false;
            }
        }
        #endregion
    }
}