/*
 * 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 System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;

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

namespace Amazon.Runtime
{
    public abstract partial class AmazonWebServiceRequest : IAmazonWebServiceRequest
    {
        /// <summary>
        /// This flag specifies if SigV4 will be used for the current request.
        /// </summary>
        [Obsolete("UseSigV4 is deprecated. Use SignatureVersion directly instead.")]
        bool IAmazonWebServiceRequest.UseSigV4
        {
            get { return UseSigV4; }
            set { UseSigV4 = value; }
        }

        /// <summary>
        /// This flag specifies if SigV4 will be used for the current request.
        /// Returns true if the request will use SigV4.
        /// Setting it to false will use SigV2.
        /// </summary>
        [Obsolete("UseSigV4 is deprecated. Use SignatureVersion directly instead.")]
        protected bool UseSigV4
        {
            get { return ((IAmazonWebServiceRequest)this).SignatureVersion == SignatureVersion.SigV4; }
            set { ((IAmazonWebServiceRequest)this).SignatureVersion = value ? SignatureVersion.SigV4 : SignatureVersion.SigV2; }
        }

        /// <summary>
        /// Specifies which signature version will be used for the current request.
        /// </summary>
        SignatureVersion IAmazonWebServiceRequest.SignatureVersion
        {
            get;
            set;
        }

        /// <summary>
        /// Gets or Sets a value indicating if "Expect: 100-continue" HTTP header will be 
        /// sent by the client for this request. The default value is false.
        /// </summary>
        protected virtual bool Expect100Continue
        {
            get { return false; }
        }

        internal bool GetExpect100Continue()
        {
            return this.Expect100Continue;
        }

        protected virtual bool IncludeSHA256Header
        {
            get { return true; }
        }

        internal bool GetIncludeSHA256Header()
        {
            return this.IncludeSHA256Header;
        }

        /// <summary>
        /// Gets the signer to use for this request.
        /// A null return value indicates to use the configured
        /// signer for the service that this request is part of.
        /// </summary>
        /// <returns>A signer for this request, or null.</returns>
        protected virtual AbstractAWSSigner CreateSigner()
        {
            return null;
        }

        internal AbstractAWSSigner GetSigner()
        {
            return CreateSigner();
        }

        /// <summary>
        /// Checksum validation behavior for validating the integrity of this request's response
        /// </summary>
        protected internal virtual CoreChecksumResponseBehavior CoreChecksumMode => CoreChecksumResponseBehavior.DISABLED;

        /// <summary>
        /// Checksum algorithms that are supported for validating the integrity of this request's response
        /// </summary>
        protected internal virtual ReadOnlyCollection<CoreChecksumAlgorithm> ChecksumResponseAlgorithms => new List<CoreChecksumAlgorithm>(0).AsReadOnly();
    }
}