package cloudcontrol

import (
	"context"
	"errors"
	"strings"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol"
	"github.com/aws/aws-sdk-go-v2/service/cloudcontrol/types"
	"github.com/hashicorp/terraform-plugin-log/tflog"
	"github.com/hashicorp/terraform-provider-awscc/internal/tfresource"
)

func FindResourceByTypeNameAndID(ctx context.Context, conn *cloudcontrol.Client, roleARN, typeName, id string) (*types.ResourceDescription, error) {
	tflog.Debug(ctx, "FindResourceByTypeNameAndID", map[string]interface{}{
		"cfTypeName": typeName,
		"id":         id,
	})

	input := &cloudcontrol.GetResourceInput{
		Identifier: aws.String(id),
		TypeName:   aws.String(typeName),
	}

	if roleARN != "" {
		input.RoleArn = aws.String(roleARN)
	}

	output, err := conn.GetResource(ctx, input)

	if rnfe := (*types.ResourceNotFoundException)(nil); errors.As(err, &rnfe) {
		return nil, &tfresource.NotFoundError{LastError: err}
	}

	if err != nil {
		// "api error ResourceNotFound: AWS::Logs::LogGroup Handler returned status FAILED: Resource of type 'AWS::Logs::LogGroup' with identifier '{"/properties/LogGroupName":"JPZD4AtrMPJQ4DJLl0EUpXRYS-7otPmOvuX3oo"}' was not found."
		if strings.Contains(err.Error(), "api error ResourceNotFound") {
			return nil, &tfresource.NotFoundError{LastError: err}
		}

		return nil, err
	}

	if output == nil || output.ResourceDescription == nil {
		return nil, &tfresource.NotFoundError{Message: "Empty result"}
	}

	tflog.Debug(ctx, "ResourceDescription.ResourceModel", map[string]interface{}{
		"value": aws.ToString(output.ResourceDescription.Properties),
	})

	return output.ResourceDescription, nil
}