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

package route53domains

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

// Transfers a domain from another registrar to Amazon Route 53. For more
// information about transferring domains, see the following topics:
//   - For transfer requirements, a detailed procedure, and information about
//     viewing the status of a domain that you're transferring to Route 53, see
//     Transferring Registration for a Domain to Amazon Route 53 (https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html)
//     in the Amazon Route 53 Developer Guide.
//   - For information about how to transfer a domain from one Amazon Web Services
//     account to another, see TransferDomainToAnotherAwsAccount (https://docs.aws.amazon.com/Route53/latest/APIReference/API_domains_TransferDomainToAnotherAwsAccount.html)
//     .
//   - For information about how to transfer a domain to another domain registrar,
//     see Transferring a Domain from Amazon Route 53 to Another Registrar (https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-transfer-from-route-53.html)
//     in the Amazon Route 53 Developer Guide.
//
// If the registrar for your domain is also the DNS service provider for the
// domain, we highly recommend that you transfer your DNS service to Route 53 or to
// another DNS service provider before you transfer your registration. Some
// registrars provide free DNS service when you purchase a domain registration.
// When you transfer the registration, the previous registrar will not renew your
// domain registration and could end your DNS service at any time. If the registrar
// for your domain is also the DNS service provider for the domain and you don't
// transfer DNS service to another provider, your website, email, and the web
// applications associated with the domain might become unavailable. If the
// transfer is successful, this method returns an operation ID that you can use to
// track the progress and completion of the action. If the transfer doesn't
// complete successfully, the domain registrant will be notified by email.
func (c *Client) TransferDomain(ctx context.Context, params *TransferDomainInput, optFns ...func(*Options)) (*TransferDomainOutput, error) {
	if params == nil {
		params = &TransferDomainInput{}
	}

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

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

// The TransferDomain request includes the following elements.
type TransferDomainInput struct {

	// Provides detailed contact information.
	//
	// This member is required.
	AdminContact *types.ContactDetail

	// The name of the domain that you want to transfer to Route 53. The top-level
	// domain (TLD), such as .com, must be a TLD that Route 53 supports. For a list of
	// supported TLDs, see Domains that You Can Register with Amazon Route 53 (https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/registrar-tld-list.html)
	// in the Amazon Route 53 Developer Guide. The domain name can contain only the
	// following characters:
	//   - Letters a through z. Domain names are not case sensitive.
	//   - Numbers 0 through 9.
	//   - Hyphen (-). You can't specify a hyphen at the beginning or end of a label.
	//   - Period (.) to separate the labels in the name, such as the . in example.com
	//   .
	//
	// This member is required.
	DomainName *string

	// The number of years that you want to register the domain for. Domains are
	// registered for a minimum of one year. The maximum period depends on the
	// top-level domain. Default: 1
	//
	// This member is required.
	DurationInYears *int32

	// Provides detailed contact information.
	//
	// This member is required.
	RegistrantContact *types.ContactDetail

	// Provides detailed contact information.
	//
	// This member is required.
	TechContact *types.ContactDetail

	// The authorization code for the domain. You get this value from the current
	// registrar.
	AuthCode *string

	// Indicates whether the domain will be automatically renewed (true) or not
	// (false). Auto renewal only takes effect after the account is charged. Default:
	// true
	AutoRenew *bool

	// Reserved for future use.
	IdnLangCode *string

	// Contains details for the host and glue IP addresses.
	Nameservers []types.Nameserver

	// Whether you want to conceal contact information from WHOIS queries. If you
	// specify true , WHOIS ("who is") queries return contact information for the
	// registrar, the phrase "REDACTED FOR PRIVACY", or "On behalf of owner.". While
	// some domains may allow different privacy settings per contact, we recommend
	// specifying the same privacy setting for all contacts. Default: true
	PrivacyProtectAdminContact *bool

	// Whether you want to conceal contact information from WHOIS queries. If you
	// specify true , WHOIS ("who is") queries return contact information either for
	// Amazon Registrar (for .com, .net, and .org domains) or for our registrar
	// associate, Gandi (for all other TLDs). If you specify false , WHOIS queries
	// return the information that you entered for the registrant contact (domain
	// owner). You must specify the same privacy setting for the administrative,
	// registrant, and technical contacts. Default: true
	PrivacyProtectRegistrantContact *bool

	// Whether you want to conceal contact information from WHOIS queries. If you
	// specify true , WHOIS ("who is") queries return contact information either for
	// Amazon Registrar (for .com, .net, and .org domains) or for our registrar
	// associate, Gandi (for all other TLDs). If you specify false , WHOIS queries
	// return the information that you entered for the technical contact. You must
	// specify the same privacy setting for the administrative, registrant, and
	// technical contacts. Default: true
	PrivacyProtectTechContact *bool

	noSmithyDocumentSerde
}

// The TransferDomain response includes the following element.
type TransferDomainOutput struct {

	// Identifier for tracking the progress of the request. To query the operation
	// status, use GetOperationDetail (https://docs.aws.amazon.com/Route53/latest/APIReference/API_domains_GetOperationDetail.html)
	// .
	OperationId *string

	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationTransferDomainMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsAwsjson11_serializeOpTransferDomain{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpTransferDomain{}, middleware.After)
	if err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddClientRequestIDMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddComputeContentLengthMiddleware(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = v4.AddComputePayloadSHA256Middleware(stack); err != nil {
		return err
	}
	if err = addRetryMiddlewares(stack, options); err != nil {
		return err
	}
	if err = addHTTPSignerV4Middleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = awsmiddleware.AddRecordResponseTiming(stack); 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 = addOpTransferDomainValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opTransferDomain(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = awsmiddleware.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
	}
	return nil
}

func newServiceMetadataMiddleware_opTransferDomain(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "route53domains",
		OperationName: "TransferDomain",
	}
}