package arn

import (
	
	

	awsarn 
	
)

const (
	s3Namespace              = "s3"
	s3ObjectsLambdaNamespace = "s3-object-lambda"
	s3OutpostsNamespace      = "s3-outposts"
)

// ParseEndpointARN parses a given generic aws ARN into a s3 arn resource.
func ( awsarn.ARN) (arn.Resource, error) {
	return arn.ParseResource(, accessPointResourceParser)
}

func ( awsarn.ARN) (arn.Resource, error) {
	 := arn.SplitResource(.Resource)

	switch [0] {
	case "accesspoint":
		switch .Service {
		case s3Namespace:
			return arn.ParseAccessPointResource(, [1:])
		case s3ObjectsLambdaNamespace:
			return parseS3ObjectLambdaAccessPointResource(, )
		default:
			return arn.AccessPointARN{}, arn.InvalidARNError{ARN: , Reason: fmt.Sprintf("service is not %s or %s", s3Namespace, s3ObjectsLambdaNamespace)}
		}
	case "outpost":
		if .Service != s3OutpostsNamespace {
			return arn.OutpostAccessPointARN{}, arn.InvalidARNError{ARN: , Reason: "service is not %s"}
		}
		return parseOutpostAccessPointResource(, [1:])
	default:
		return nil, arn.InvalidARNError{ARN: , Reason: "unknown resource type"}
	}
}

func ( awsarn.ARN,  []string) (arn.OutpostAccessPointARN, error) {
	// outpost accesspoint arn is only valid if service is s3-outposts
	if .Service != "s3-outposts" {
		return arn.OutpostAccessPointARN{}, arn.InvalidARNError{ARN: , Reason: "service is not s3-outposts"}
	}

	if len() == 0 {
		return arn.OutpostAccessPointARN{}, arn.InvalidARNError{ARN: , Reason: "outpost resource-id not set"}
	}

	if len() < 3 {
		return arn.OutpostAccessPointARN{}, arn.InvalidARNError{
			ARN: , Reason: "access-point resource not set in Outpost ARN",
		}
	}

	 := strings.TrimSpace([0])
	if len() == 0 {
		return arn.OutpostAccessPointARN{}, arn.InvalidARNError{ARN: , Reason: "outpost resource-id not set"}
	}

	var  = arn.OutpostAccessPointARN{}
	switch [1] {
	case "accesspoint":
		// Do not allow region-less outpost access-point arns.
		if len(.Region) == 0 {
			return arn.OutpostAccessPointARN{}, arn.InvalidARNError{ARN: , Reason: "region is not set"}
		}

		,  := arn.ParseAccessPointResource(, [2:])
		if  != nil {
			return arn.OutpostAccessPointARN{}, 
		}
		// set access-point arn
		.AccessPointARN = 
	default:
		return arn.OutpostAccessPointARN{}, arn.InvalidARNError{ARN: , Reason: "access-point resource not set in Outpost ARN"}
	}

	// set outpost id
	.OutpostID = 
	return , nil
}

func ( awsarn.ARN,  []string) (arn.S3ObjectLambdaAccessPointARN, error) {
	if .Service != s3ObjectsLambdaNamespace {
		return arn.S3ObjectLambdaAccessPointARN{}, arn.InvalidARNError{ARN: , Reason: fmt.Sprintf("service is not %s", s3ObjectsLambdaNamespace)}
	}

	if len(.Region) == 0 {
		return arn.S3ObjectLambdaAccessPointARN{}, arn.InvalidARNError{ARN: , Reason: fmt.Sprintf("%s region not set", s3ObjectsLambdaNamespace)}
	}

	,  := arn.ParseAccessPointResource(, [1:])
	if  != nil {
		return arn.S3ObjectLambdaAccessPointARN{}, 
	}

	return arn.S3ObjectLambdaAccessPointARN{
		AccessPointARN: ,
	}, nil
}