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

package acsclient

import (
	"github.com/aws/amazon-ecs-agent/ecs-agent/acs/model/ecsacs"
	"github.com/aws/amazon-ecs-agent/ecs-agent/wsclient"
)

var acsRecognizedTypes []interface{}

func init() {
	// This list is currently *manually updated* and assumes that the generated
	// struct type-names within the package *exactly match* the type sent by ACS/TCS
	// (true so far; careful with inflections)
	// TODO, this list should be autogenerated
	// I couldn't figure out how to get a list of all structs in a package via
	// reflection, but that would solve this. The alternative is to either parse
	// the .json model or the generated struct names.
	acsRecognizedTypes = []interface{}{
		ecsacs.HeartbeatMessage{},
		ecsacs.HeartbeatAckRequest{},
		ecsacs.PayloadMessage{},
		ecsacs.CloseMessage{},
		ecsacs.AckRequest{},
		ecsacs.NackRequest{},
		ecsacs.PerformUpdateMessage{},
		ecsacs.StageUpdateMessage{},
		ecsacs.IAMRoleCredentialsMessage{},
		ecsacs.IAMRoleCredentialsAckRequest{},
		ecsacs.ServerException{},
		ecsacs.BadRequestException{},
		ecsacs.InvalidClusterException{},
		ecsacs.InvalidInstanceException{},
		ecsacs.AccessDeniedException{},
		ecsacs.InactiveInstanceException{},
		ecsacs.ErrorMessage{},
		ecsacs.AttachTaskNetworkInterfacesMessage{},
		ecsacs.AttachInstanceNetworkInterfacesMessage{},
		ecsacs.ConfirmAttachmentMessage{},
		ecsacs.TaskManifestMessage{},
		ecsacs.TaskStopVerificationAck{},
		ecsacs.TaskStopVerificationMessage{},
	}
}

func NewACSDecoder() wsclient.TypeDecoder {
	return wsclient.BuildTypeDecoder(acsRecognizedTypes)
}
