package nextgenglobal

import (
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
)

// CIDRValidationStatusError preserves the one known structured Global Create
// error without changing error handling for unrelated RPCs.
type CIDRValidationStatusError struct {
	grpcStatus *status.Status
	detail     *globalngv1.ResourcePoolCidrValidationError
}

func (e *CIDRValidationStatusError) Error() string {
	return e.grpcStatus.Err().Error()
}

func (e *CIDRValidationStatusError) GRPCStatus() *status.Status {
	return e.grpcStatus
}

func (e *CIDRValidationStatusError) Detail() *globalngv1.ResourcePoolCidrValidationError {
	return e.detail
}

func NewCIDRValidationStatusError(err error) *CIDRValidationStatusError {
	if err == nil {
		return nil
	}
	grpcStatus, ok := status.FromError(err)
	if !ok || grpcStatus.Code() != codes.InvalidArgument {
		return nil
	}
	for _, detail := range grpcStatus.Details() {
		validationDetail, ok := detail.(*globalngv1.ResourcePoolCidrValidationError)
		if ok {
			return &CIDRValidationStatusError{grpcStatus: grpcStatus, detail: validationDetail}
		}
	}
	return nil
}
