// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.

package mturk

import (
	"context"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/internal/awsutil"
)

type UpdateQualificationTypeInput struct {
	_ struct{} `type:"structure"`

	// The answers to the Qualification test specified in the Test parameter, in
	// the form of an AnswerKey data structure.
	AnswerKey *string `type:"string"`

	// Specifies whether requests for the Qualification type are granted immediately,
	// without prompting the Worker with a Qualification test.
	//
	// Constraints: If the Test parameter is specified, this parameter cannot be
	// true.
	AutoGranted *bool `type:"boolean"`

	// The Qualification value to use for automatically granted Qualifications.
	// This parameter is used only if the AutoGranted parameter is true.
	AutoGrantedValue *int64 `type:"integer"`

	// The new description of the Qualification type.
	Description *string `type:"string"`

	// The ID of the Qualification type to update.
	//
	// QualificationTypeId is a required field
	QualificationTypeId *string `min:"1" type:"string" required:"true"`

	// The new status of the Qualification type - Active | Inactive
	QualificationTypeStatus QualificationTypeStatus `type:"string" enum:"true"`

	// The amount of time, in seconds, that Workers must wait after requesting a
	// Qualification of the specified Qualification type before they can retry the
	// Qualification request. It is not possible to disable retries for a Qualification
	// type after it has been created with retries enabled. If you want to disable
	// retries, you must dispose of the existing retry-enabled Qualification type
	// using DisposeQualificationType and then create a new Qualification type with
	// retries disabled using CreateQualificationType.
	RetryDelayInSeconds *int64 `type:"long"`

	// The questions for the Qualification test a Worker must answer correctly to
	// obtain a Qualification of this type. If this parameter is specified, TestDurationInSeconds
	// must also be specified.
	//
	// Constraints: Must not be longer than 65535 bytes. Must be a QuestionForm
	// data structure. This parameter cannot be specified if AutoGranted is true.
	//
	// Constraints: None. If not specified, the Worker may request the Qualification
	// without answering any questions.
	Test *string `type:"string"`

	// The number of seconds the Worker has to complete the Qualification test,
	// starting from the time the Worker requests the Qualification.
	TestDurationInSeconds *int64 `type:"long"`
}

// String returns the string representation
func (s UpdateQualificationTypeInput) String() string {
	return awsutil.Prettify(s)
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UpdateQualificationTypeInput) Validate() error {
	invalidParams := aws.ErrInvalidParams{Context: "UpdateQualificationTypeInput"}

	if s.QualificationTypeId == nil {
		invalidParams.Add(aws.NewErrParamRequired("QualificationTypeId"))
	}
	if s.QualificationTypeId != nil && len(*s.QualificationTypeId) < 1 {
		invalidParams.Add(aws.NewErrParamMinLen("QualificationTypeId", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

type UpdateQualificationTypeOutput struct {
	_ struct{} `type:"structure"`

	// Contains a QualificationType data structure.
	QualificationType *QualificationType `type:"structure"`
}

// String returns the string representation
func (s UpdateQualificationTypeOutput) String() string {
	return awsutil.Prettify(s)
}

const opUpdateQualificationType = "UpdateQualificationType"

// UpdateQualificationTypeRequest returns a request value for making API operation for
// Amazon Mechanical Turk.
//
// The UpdateQualificationType operation modifies the attributes of an existing
// Qualification type, which is represented by a QualificationType data structure.
// Only the owner of a Qualification type can modify its attributes.
//
// Most attributes of a Qualification type can be changed after the type has
// been created. However, the Name and Keywords fields cannot be modified. The
// RetryDelayInSeconds parameter can be modified or added to change the delay
// or to enable retries, but RetryDelayInSeconds cannot be used to disable retries.
//
// You can use this operation to update the test for a Qualification type. The
// test is updated based on the values specified for the Test, TestDurationInSeconds
// and AnswerKey parameters. All three parameters specify the updated test.
// If you are updating the test for a type, you must specify the Test and TestDurationInSeconds
// parameters. The AnswerKey parameter is optional; omitting it specifies that
// the updated test does not have an answer key.
//
// If you omit the Test parameter, the test for the Qualification type is unchanged.
// There is no way to remove a test from a Qualification type that has one.
// If the type already has a test, you cannot update it to be AutoGranted. If
// the Qualification type does not have a test and one is provided by an update,
// the type will henceforth have a test.
//
// If you want to update the test duration or answer key for an existing test
// without changing the questions, you must specify a Test parameter with the
// original questions, along with the updated values.
//
// If you provide an updated Test but no AnswerKey, the new test will not have
// an answer key. Requests for such Qualifications must be granted manually.
//
// You can also update the AutoGranted and AutoGrantedValue attributes of the
// Qualification type.
//
//    // Example sending a request using UpdateQualificationTypeRequest.
//    req := client.UpdateQualificationTypeRequest(params)
//    resp, err := req.Send(context.TODO())
//    if err == nil {
//        fmt.Println(resp)
//    }
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/mturk-requester-2017-01-17/UpdateQualificationType
func (c *Client) UpdateQualificationTypeRequest(input *UpdateQualificationTypeInput) UpdateQualificationTypeRequest {
	op := &aws.Operation{
		Name:       opUpdateQualificationType,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UpdateQualificationTypeInput{}
	}

	req := c.newRequest(op, input, &UpdateQualificationTypeOutput{})
	return UpdateQualificationTypeRequest{Request: req, Input: input, Copy: c.UpdateQualificationTypeRequest}
}

// UpdateQualificationTypeRequest is the request type for the
// UpdateQualificationType API operation.
type UpdateQualificationTypeRequest struct {
	*aws.Request
	Input *UpdateQualificationTypeInput
	Copy  func(*UpdateQualificationTypeInput) UpdateQualificationTypeRequest
}

// Send marshals and sends the UpdateQualificationType API request.
func (r UpdateQualificationTypeRequest) Send(ctx context.Context) (*UpdateQualificationTypeResponse, error) {
	r.Request.SetContext(ctx)
	err := r.Request.Send()
	if err != nil {
		return nil, err
	}

	resp := &UpdateQualificationTypeResponse{
		UpdateQualificationTypeOutput: r.Request.Data.(*UpdateQualificationTypeOutput),
		response:                      &aws.Response{Request: r.Request},
	}

	return resp, nil
}

// UpdateQualificationTypeResponse is the response type for the
// UpdateQualificationType API operation.
type UpdateQualificationTypeResponse struct {
	*UpdateQualificationTypeOutput

	response *aws.Response
}

// SDKResponseMetdata returns the response metadata for the
// UpdateQualificationType request.
func (r *UpdateQualificationTypeResponse) SDKResponseMetdata() *aws.Response {
	return r.response
}
