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

/*
 * Do not modify this file. This file is generated from the redshift-2012-12-01.normal.json service model.
 */
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Text;
using System.IO;
using System.Net;

using Amazon.Runtime;
using Amazon.Runtime.Internal;

namespace Amazon.Redshift.Model
{
    /// <summary>
    /// Container for the parameters to the CreateUsageLimit operation.
    /// Creates a usage limit for a specified Amazon Redshift feature on a cluster. The usage
    /// limit is identified by the returned usage limit identifier.
    /// </summary>
    public partial class CreateUsageLimitRequest : AmazonRedshiftRequest
    {
        private long? _amount;
        private UsageLimitBreachAction _breachAction;
        private string _clusterIdentifier;
        private UsageLimitFeatureType _featureType;
        private UsageLimitLimitType _limitType;
        private UsageLimitPeriod _period;
        private List<Tag> _tags = new List<Tag>();

        /// <summary>
        /// Gets and sets the property Amount. 
        /// <para>
        /// The limit amount. If time-based, this amount is in minutes. If data-based, this amount
        /// is in terabytes (TB). The value must be a positive number. 
        /// </para>
        /// </summary>
        [AWSProperty(Required=true)]
        public long Amount
        {
            get { return this._amount.GetValueOrDefault(); }
            set { this._amount = value; }
        }

        // Check to see if Amount property is set
        internal bool IsSetAmount()
        {
            return this._amount.HasValue; 
        }

        /// <summary>
        /// Gets and sets the property BreachAction. 
        /// <para>
        /// The action that Amazon Redshift takes when the limit is reached. The default is log.
        /// For more information about this parameter, see <a>UsageLimit</a>.
        /// </para>
        /// </summary>
        public UsageLimitBreachAction BreachAction
        {
            get { return this._breachAction; }
            set { this._breachAction = value; }
        }

        // Check to see if BreachAction property is set
        internal bool IsSetBreachAction()
        {
            return this._breachAction != null;
        }

        /// <summary>
        /// Gets and sets the property ClusterIdentifier. 
        /// <para>
        /// The identifier of the cluster that you want to limit usage.
        /// </para>
        /// </summary>
        [AWSProperty(Required=true, Max=2147483647)]
        public string ClusterIdentifier
        {
            get { return this._clusterIdentifier; }
            set { this._clusterIdentifier = value; }
        }

        // Check to see if ClusterIdentifier property is set
        internal bool IsSetClusterIdentifier()
        {
            return this._clusterIdentifier != null;
        }

        /// <summary>
        /// Gets and sets the property FeatureType. 
        /// <para>
        /// The Amazon Redshift feature that you want to limit.
        /// </para>
        /// </summary>
        [AWSProperty(Required=true)]
        public UsageLimitFeatureType FeatureType
        {
            get { return this._featureType; }
            set { this._featureType = value; }
        }

        // Check to see if FeatureType property is set
        internal bool IsSetFeatureType()
        {
            return this._featureType != null;
        }

        /// <summary>
        /// Gets and sets the property LimitType. 
        /// <para>
        /// The type of limit. Depending on the feature type, this can be based on a time duration
        /// or data size. If <code>FeatureType</code> is <code>spectrum</code>, then <code>LimitType</code>
        /// must be <code>data-scanned</code>. If <code>FeatureType</code> is <code>concurrency-scaling</code>,
        /// then <code>LimitType</code> must be <code>time</code>. If <code>FeatureType</code>
        /// is <code>cross-region-datasharing</code>, then <code>LimitType</code> must be <code>data-scanned</code>.
        /// 
        /// </para>
        /// </summary>
        [AWSProperty(Required=true)]
        public UsageLimitLimitType LimitType
        {
            get { return this._limitType; }
            set { this._limitType = value; }
        }

        // Check to see if LimitType property is set
        internal bool IsSetLimitType()
        {
            return this._limitType != null;
        }

        /// <summary>
        /// Gets and sets the property Period. 
        /// <para>
        /// The time period that the amount applies to. A <code>weekly</code> period begins on
        /// Sunday. The default is <code>monthly</code>. 
        /// </para>
        /// </summary>
        public UsageLimitPeriod Period
        {
            get { return this._period; }
            set { this._period = value; }
        }

        // Check to see if Period property is set
        internal bool IsSetPeriod()
        {
            return this._period != null;
        }

        /// <summary>
        /// Gets and sets the property Tags. 
        /// <para>
        /// A list of tag instances.
        /// </para>
        /// </summary>
        public List<Tag> Tags
        {
            get { return this._tags; }
            set { this._tags = value; }
        }

        // Check to see if Tags property is set
        internal bool IsSetTags()
        {
            return this._tags != null && this._tags.Count > 0; 
        }

    }
}