// Code generated by smithy-go-codegen DO NOT EDIT.

package ssm

import (
	"context"
	"fmt"
	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
	"github.com/aws/aws-sdk-go-v2/service/ssm/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
)

// Registers a compliance type and other compliance details on a designated
// resource. This operation lets you register custom compliance details with a
// resource. This call overwrites existing compliance information on the resource,
// so you must provide a full list of compliance items each time that you send the
// request.
//
// ComplianceType can be one of the following:
//
//   - ExecutionId: The execution ID when the patch, association, or custom
//     compliance item was applied.
//
//   - ExecutionType: Specify patch, association, or Custom: string .
//
//   - ExecutionTime. The time the patch, association, or custom compliance item
//     was applied to the managed node.
//
//   - Id: The patch, association, or custom compliance ID.
//
//   - Title: A title.
//
//   - Status: The status of the compliance item. For example, approved for
//     patches, or Failed for associations.
//
//   - Severity: A patch severity. For example, Critical .
//
//   - DocumentName: An SSM document name. For example, AWS-RunPatchBaseline .
//
//   - DocumentVersion: An SSM document version number. For example, 4.
//
//   - Classification: A patch classification. For example, security updates .
//
//   - PatchBaselineId: A patch baseline ID.
//
//   - PatchSeverity: A patch severity. For example, Critical .
//
//   - PatchState: A patch state. For example, InstancesWithFailedPatches .
//
//   - PatchGroup: The name of a patch group.
//
//   - InstalledTime: The time the association, patch, or custom compliance item
//     was applied to the resource. Specify the time by using the following format:
//     yyyy-MM-dd'T'HH:mm:ss'Z'
func (c *Client) PutComplianceItems(ctx context.Context, params *PutComplianceItemsInput, optFns ...func(*Options)) (*PutComplianceItemsOutput, error) {
	if params == nil {
		params = &PutComplianceItemsInput{}
	}

	result, metadata, err := c.invokeOperation(ctx, "PutComplianceItems", params, optFns, c.addOperationPutComplianceItemsMiddlewares)
	if err != nil {
		return nil, err
	}

	out := result.(*PutComplianceItemsOutput)
	out.ResultMetadata = metadata
	return out, nil
}

type PutComplianceItemsInput struct {

	// Specify the compliance type. For example, specify Association (for a State
	// Manager association), Patch, or Custom: string .
	//
	// This member is required.
	ComplianceType *string

	// A summary of the call execution that includes an execution ID, the type of
	// execution (for example, Command ), and the date/time of the execution using a
	// datetime object that is saved in the following format: yyyy-MM-dd'T'HH:mm:ss'Z'
	//
	// This member is required.
	ExecutionSummary *types.ComplianceExecutionSummary

	// Information about the compliance as defined by the resource type. For example,
	// for a patch compliance type, Items includes information about the
	// PatchSeverity, Classification, and so on.
	//
	// This member is required.
	Items []types.ComplianceItemEntry

	// Specify an ID for this resource. For a managed node, this is the node ID.
	//
	// This member is required.
	ResourceId *string

	// Specify the type of resource. ManagedInstance is currently the only supported
	// resource type.
	//
	// This member is required.
	ResourceType *string

	// MD5 or SHA-256 content hash. The content hash is used to determine if existing
	// information should be overwritten or ignored. If the content hashes match, the
	// request to put compliance information is ignored.
	ItemContentHash *string

	// The mode for uploading compliance items. You can specify COMPLETE or PARTIAL .
	// In COMPLETE mode, the system overwrites all existing compliance information for
	// the resource. You must provide a full list of compliance items each time you
	// send the request.
	//
	// In PARTIAL mode, the system overwrites compliance information for a specific
	// association. The association must be configured with SyncCompliance set to
	// MANUAL . By default, all requests use COMPLETE mode.
	//
	// This attribute is only valid for association compliance.
	UploadType types.ComplianceUploadType

	noSmithyDocumentSerde
}

type PutComplianceItemsOutput struct {
	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationPutComplianceItemsMiddlewares(stack *middleware.Stack, options Options) (err error) {
	if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {
		return err
	}
	err = stack.Serialize.Add(&awsAwsjson11_serializeOpPutComplianceItems{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpPutComplianceItems{}, middleware.After)
	if err != nil {
		return err
	}
	if err := addProtocolFinalizerMiddlewares(stack, options, "PutComplianceItems"); err != nil {
		return fmt.Errorf("add protocol finalizers: %v", err)
	}

	if err = addlegacyEndpointContextSetter(stack, options); err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = addClientRequestID(stack); err != nil {
		return err
	}
	if err = addComputeContentLength(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = addComputePayloadSHA256(stack); err != nil {
		return err
	}
	if err = addRetry(stack, options); err != nil {
		return err
	}
	if err = addRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = addRecordResponseTiming(stack); err != nil {
		return err
	}
	if err = addSpanRetryLoop(stack, options); err != nil {
		return err
	}
	if err = addClientUserAgent(stack, options); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {
		return err
	}
	if err = addTimeOffsetBuild(stack, c); err != nil {
		return err
	}
	if err = addUserAgentRetryMode(stack, options); err != nil {
		return err
	}
	if err = addCredentialSource(stack, options); err != nil {
		return err
	}
	if err = addOpPutComplianceItemsValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutComplianceItems(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = addRecursionDetection(stack); err != nil {
		return err
	}
	if err = addRequestIDRetrieverMiddleware(stack); err != nil {
		return err
	}
	if err = addResponseErrorMiddleware(stack); err != nil {
		return err
	}
	if err = addRequestResponseLogging(stack, options); err != nil {
		return err
	}
	if err = addDisableHTTPSMiddleware(stack, options); err != nil {
		return err
	}
	if err = addSpanInitializeStart(stack); err != nil {
		return err
	}
	if err = addSpanInitializeEnd(stack); err != nil {
		return err
	}
	if err = addSpanBuildRequestStart(stack); err != nil {
		return err
	}
	if err = addSpanBuildRequestEnd(stack); err != nil {
		return err
	}
	return nil
}

func newServiceMetadataMiddleware_opPutComplianceItems(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		OperationName: "PutComplianceItems",
	}
}
