// Package formrecognizer implements the Azure ARM Formrecognizer service API version 1.0-preview.
//
//
package formrecognizer

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
//
// Code generated by Microsoft (R) AutoRest Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is regenerated.

import (
	"context"
	"github.com/Azure/go-autorest/autorest"
	"github.com/Azure/go-autorest/autorest/azure"
	"github.com/Azure/go-autorest/autorest/validation"
	"github.com/Azure/go-autorest/tracing"
	"github.com/gofrs/uuid"
	"io"
	"net/http"
)

// BaseClient is the base client for Formrecognizer.
type BaseClient struct {
	autorest.Client
	Endpoint string
}

// New creates an instance of the BaseClient client.
func New(endpoint string) BaseClient {
	return NewWithoutDefaults(endpoint)
}

// NewWithoutDefaults creates an instance of the BaseClient client.
func NewWithoutDefaults(endpoint string) BaseClient {
	return BaseClient{
		Client:   autorest.NewClientWithUserAgent(UserAgent()),
		Endpoint: endpoint,
	}
}

// AnalyzeWithCustomModel extract key-value pairs from a given document. The input document must be of one of the
// supported content types - 'application/pdf', 'image/jpeg' or 'image/png'. A success response is returned in JSON.
// Parameters:
// ID - model Identifier to analyze the document with.
// formStream - a pdf document or image (jpg,png) file to analyze.
// keys - an optional list of known keys to extract the values for.
func (client BaseClient) AnalyzeWithCustomModel(ctx context.Context, ID uuid.UUID, formStream io.ReadCloser, keys []string) (result AnalyzeResult, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.AnalyzeWithCustomModel")
		defer func() {
			sc := -1
			if result.Response.Response != nil {
				sc = result.Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	req, err := client.AnalyzeWithCustomModelPreparer(ctx, ID, formStream, keys)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "AnalyzeWithCustomModel", nil, "Failure preparing request")
		return
	}

	resp, err := client.AnalyzeWithCustomModelSender(req)
	if err != nil {
		result.Response = autorest.Response{Response: resp}
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "AnalyzeWithCustomModel", resp, "Failure sending request")
		return
	}

	result, err = client.AnalyzeWithCustomModelResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "AnalyzeWithCustomModel", resp, "Failure responding to request")
		return
	}

	return
}

// AnalyzeWithCustomModelPreparer prepares the AnalyzeWithCustomModel request.
func (client BaseClient) AnalyzeWithCustomModelPreparer(ctx context.Context, ID uuid.UUID, formStream io.ReadCloser, keys []string) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	pathParameters := map[string]interface{}{
		"id": autorest.Encode("path", ID),
	}

	queryParameters := map[string]interface{}{}
	if keys != nil && len(keys) > 0 {
		queryParameters["keys"] = autorest.Encode("query", keys, ",")
	}

	formDataParameters := map[string]interface{}{
		"form_stream": formStream,
	}

	preparer := autorest.CreatePreparer(
		autorest.AsPost(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPathParameters("/custom/models/{id}/analyze", pathParameters),
		autorest.WithQueryParameters(queryParameters),
		autorest.WithMultiPartFormData(formDataParameters))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// AnalyzeWithCustomModelSender sends the AnalyzeWithCustomModel request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) AnalyzeWithCustomModelSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// AnalyzeWithCustomModelResponder handles the response to the AnalyzeWithCustomModel request. The method always
// closes the http.Response Body.
func (client BaseClient) AnalyzeWithCustomModelResponder(resp *http.Response) (result AnalyzeResult, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK),
		autorest.ByUnmarshallingJSON(&result),
		autorest.ByClosing())
	result.Response = autorest.Response{Response: resp}
	return
}

// BatchReadReceipt batch Read Receipt operation. The response contains a field called 'Operation-Location', which
// contains the URL that you must use for your 'Get Read Receipt Result' operation.
// Parameters:
// imageURL - a JSON document with a URL pointing to the image that is to be analyzed.
func (client BaseClient) BatchReadReceipt(ctx context.Context, imageURL ImageURL) (result autorest.Response, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.BatchReadReceipt")
		defer func() {
			sc := -1
			if result.Response != nil {
				sc = result.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	if err := validation.Validate([]validation.Validation{
		{TargetValue: imageURL,
			Constraints: []validation.Constraint{{Target: "imageURL.URL", Name: validation.Null, Rule: true, Chain: nil}}}}); err != nil {
		return result, validation.NewError("formrecognizer.BaseClient", "BatchReadReceipt", err.Error())
	}

	req, err := client.BatchReadReceiptPreparer(ctx, imageURL)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "BatchReadReceipt", nil, "Failure preparing request")
		return
	}

	resp, err := client.BatchReadReceiptSender(req)
	if err != nil {
		result.Response = resp
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "BatchReadReceipt", resp, "Failure sending request")
		return
	}

	result, err = client.BatchReadReceiptResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "BatchReadReceipt", resp, "Failure responding to request")
		return
	}

	return
}

// BatchReadReceiptPreparer prepares the BatchReadReceipt request.
func (client BaseClient) BatchReadReceiptPreparer(ctx context.Context, imageURL ImageURL) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	preparer := autorest.CreatePreparer(
		autorest.AsContentType("application/json; charset=utf-8"),
		autorest.AsPost(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPath("/prebuilt/receipt/asyncBatchAnalyze"),
		autorest.WithJSON(imageURL))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// BatchReadReceiptSender sends the BatchReadReceipt request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) BatchReadReceiptSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// BatchReadReceiptResponder handles the response to the BatchReadReceipt request. The method always
// closes the http.Response Body.
func (client BaseClient) BatchReadReceiptResponder(resp *http.Response) (result autorest.Response, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
		autorest.ByClosing())
	result.Response = resp
	return
}

// BatchReadReceiptInStream read Receipt operation. When you use the 'Batch Read Receipt' interface, the response
// contains a field called 'Operation-Location'. The 'Operation-Location' field contains the URL that you must use for
// your 'Get Read Receipt Result' operation.
// Parameters:
// imageParameter - an image stream.
func (client BaseClient) BatchReadReceiptInStream(ctx context.Context, imageParameter io.ReadCloser) (result autorest.Response, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.BatchReadReceiptInStream")
		defer func() {
			sc := -1
			if result.Response != nil {
				sc = result.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	req, err := client.BatchReadReceiptInStreamPreparer(ctx, imageParameter)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "BatchReadReceiptInStream", nil, "Failure preparing request")
		return
	}

	resp, err := client.BatchReadReceiptInStreamSender(req)
	if err != nil {
		result.Response = resp
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "BatchReadReceiptInStream", resp, "Failure sending request")
		return
	}

	result, err = client.BatchReadReceiptInStreamResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "BatchReadReceiptInStream", resp, "Failure responding to request")
		return
	}

	return
}

// BatchReadReceiptInStreamPreparer prepares the BatchReadReceiptInStream request.
func (client BaseClient) BatchReadReceiptInStreamPreparer(ctx context.Context, imageParameter io.ReadCloser) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	preparer := autorest.CreatePreparer(
		autorest.AsContentType("application/octet-stream"),
		autorest.AsPost(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPath("/prebuilt/receipt/asyncBatchAnalyze"),
		autorest.WithFile(imageParameter))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// BatchReadReceiptInStreamSender sends the BatchReadReceiptInStream request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) BatchReadReceiptInStreamSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// BatchReadReceiptInStreamResponder handles the response to the BatchReadReceiptInStream request. The method always
// closes the http.Response Body.
func (client BaseClient) BatchReadReceiptInStreamResponder(resp *http.Response) (result autorest.Response, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusAccepted),
		autorest.ByClosing())
	result.Response = resp
	return
}

// DeleteCustomModel delete model artifacts.
// Parameters:
// ID - the identifier of the model to delete.
func (client BaseClient) DeleteCustomModel(ctx context.Context, ID uuid.UUID) (result autorest.Response, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.DeleteCustomModel")
		defer func() {
			sc := -1
			if result.Response != nil {
				sc = result.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	req, err := client.DeleteCustomModelPreparer(ctx, ID)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "DeleteCustomModel", nil, "Failure preparing request")
		return
	}

	resp, err := client.DeleteCustomModelSender(req)
	if err != nil {
		result.Response = resp
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "DeleteCustomModel", resp, "Failure sending request")
		return
	}

	result, err = client.DeleteCustomModelResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "DeleteCustomModel", resp, "Failure responding to request")
		return
	}

	return
}

// DeleteCustomModelPreparer prepares the DeleteCustomModel request.
func (client BaseClient) DeleteCustomModelPreparer(ctx context.Context, ID uuid.UUID) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	pathParameters := map[string]interface{}{
		"id": autorest.Encode("path", ID),
	}

	preparer := autorest.CreatePreparer(
		autorest.AsDelete(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPathParameters("/custom/models/{id}", pathParameters))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// DeleteCustomModelSender sends the DeleteCustomModel request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) DeleteCustomModelSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// DeleteCustomModelResponder handles the response to the DeleteCustomModel request. The method always
// closes the http.Response Body.
func (client BaseClient) DeleteCustomModelResponder(resp *http.Response) (result autorest.Response, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK, http.StatusNoContent),
		autorest.ByClosing())
	result.Response = resp
	return
}

// GetCustomModel get information about a model.
// Parameters:
// ID - model identifier.
func (client BaseClient) GetCustomModel(ctx context.Context, ID uuid.UUID) (result ModelResult, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.GetCustomModel")
		defer func() {
			sc := -1
			if result.Response.Response != nil {
				sc = result.Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	req, err := client.GetCustomModelPreparer(ctx, ID)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetCustomModel", nil, "Failure preparing request")
		return
	}

	resp, err := client.GetCustomModelSender(req)
	if err != nil {
		result.Response = autorest.Response{Response: resp}
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetCustomModel", resp, "Failure sending request")
		return
	}

	result, err = client.GetCustomModelResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetCustomModel", resp, "Failure responding to request")
		return
	}

	return
}

// GetCustomModelPreparer prepares the GetCustomModel request.
func (client BaseClient) GetCustomModelPreparer(ctx context.Context, ID uuid.UUID) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	pathParameters := map[string]interface{}{
		"id": autorest.Encode("path", ID),
	}

	preparer := autorest.CreatePreparer(
		autorest.AsGet(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPathParameters("/custom/models/{id}", pathParameters))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// GetCustomModelSender sends the GetCustomModel request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) GetCustomModelSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// GetCustomModelResponder handles the response to the GetCustomModel request. The method always
// closes the http.Response Body.
func (client BaseClient) GetCustomModelResponder(resp *http.Response) (result ModelResult, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK),
		autorest.ByUnmarshallingJSON(&result),
		autorest.ByClosing())
	result.Response = autorest.Response{Response: resp}
	return
}

// GetCustomModels get information about all trained custom models
func (client BaseClient) GetCustomModels(ctx context.Context) (result ModelsResult, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.GetCustomModels")
		defer func() {
			sc := -1
			if result.Response.Response != nil {
				sc = result.Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	req, err := client.GetCustomModelsPreparer(ctx)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetCustomModels", nil, "Failure preparing request")
		return
	}

	resp, err := client.GetCustomModelsSender(req)
	if err != nil {
		result.Response = autorest.Response{Response: resp}
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetCustomModels", resp, "Failure sending request")
		return
	}

	result, err = client.GetCustomModelsResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetCustomModels", resp, "Failure responding to request")
		return
	}

	return
}

// GetCustomModelsPreparer prepares the GetCustomModels request.
func (client BaseClient) GetCustomModelsPreparer(ctx context.Context) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	preparer := autorest.CreatePreparer(
		autorest.AsGet(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPath("/custom/models"))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// GetCustomModelsSender sends the GetCustomModels request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) GetCustomModelsSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// GetCustomModelsResponder handles the response to the GetCustomModels request. The method always
// closes the http.Response Body.
func (client BaseClient) GetCustomModelsResponder(resp *http.Response) (result ModelsResult, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK),
		autorest.ByUnmarshallingJSON(&result),
		autorest.ByClosing())
	result.Response = autorest.Response{Response: resp}
	return
}

// GetExtractedKeys retrieve the keys that were
// extracted during the training of the specified model.
// Parameters:
// ID - model identifier.
func (client BaseClient) GetExtractedKeys(ctx context.Context, ID uuid.UUID) (result KeysResult, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.GetExtractedKeys")
		defer func() {
			sc := -1
			if result.Response.Response != nil {
				sc = result.Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	req, err := client.GetExtractedKeysPreparer(ctx, ID)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetExtractedKeys", nil, "Failure preparing request")
		return
	}

	resp, err := client.GetExtractedKeysSender(req)
	if err != nil {
		result.Response = autorest.Response{Response: resp}
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetExtractedKeys", resp, "Failure sending request")
		return
	}

	result, err = client.GetExtractedKeysResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetExtractedKeys", resp, "Failure responding to request")
		return
	}

	return
}

// GetExtractedKeysPreparer prepares the GetExtractedKeys request.
func (client BaseClient) GetExtractedKeysPreparer(ctx context.Context, ID uuid.UUID) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	pathParameters := map[string]interface{}{
		"id": autorest.Encode("path", ID),
	}

	preparer := autorest.CreatePreparer(
		autorest.AsGet(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPathParameters("/custom/models/{id}/keys", pathParameters))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// GetExtractedKeysSender sends the GetExtractedKeys request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) GetExtractedKeysSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// GetExtractedKeysResponder handles the response to the GetExtractedKeys request. The method always
// closes the http.Response Body.
func (client BaseClient) GetExtractedKeysResponder(resp *http.Response) (result KeysResult, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK),
		autorest.ByUnmarshallingJSON(&result),
		autorest.ByClosing())
	result.Response = autorest.Response{Response: resp}
	return
}

// GetReadReceiptResult this interface is used for getting the analysis results of a 'Batch Read Receipt' operation.
// The URL to this interface should be retrieved from the 'Operation-Location' field returned from the 'Batch Read
// Receipt' operation.
// Parameters:
// operationID - id of read operation returned in the response of a 'Batch Read Receipt' operation.
func (client BaseClient) GetReadReceiptResult(ctx context.Context, operationID string) (result ReadReceiptResult, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.GetReadReceiptResult")
		defer func() {
			sc := -1
			if result.Response.Response != nil {
				sc = result.Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	req, err := client.GetReadReceiptResultPreparer(ctx, operationID)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetReadReceiptResult", nil, "Failure preparing request")
		return
	}

	resp, err := client.GetReadReceiptResultSender(req)
	if err != nil {
		result.Response = autorest.Response{Response: resp}
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetReadReceiptResult", resp, "Failure sending request")
		return
	}

	result, err = client.GetReadReceiptResultResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "GetReadReceiptResult", resp, "Failure responding to request")
		return
	}

	return
}

// GetReadReceiptResultPreparer prepares the GetReadReceiptResult request.
func (client BaseClient) GetReadReceiptResultPreparer(ctx context.Context, operationID string) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	pathParameters := map[string]interface{}{
		"operationId": autorest.Encode("path", operationID),
	}

	preparer := autorest.CreatePreparer(
		autorest.AsGet(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPathParameters("/prebuilt/receipt/operations/{operationId}", pathParameters))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// GetReadReceiptResultSender sends the GetReadReceiptResult request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) GetReadReceiptResultSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// GetReadReceiptResultResponder handles the response to the GetReadReceiptResult request. The method always
// closes the http.Response Body.
func (client BaseClient) GetReadReceiptResultResponder(resp *http.Response) (result ReadReceiptResult, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK),
		autorest.ByUnmarshallingJSON(&result),
		autorest.ByClosing())
	result.Response = autorest.Response{Response: resp}
	return
}

// TrainCustomModel create and train a custom model. The train request must include a source parameter that is either
// an externally accessible Azure Storage blob container Uri (preferably a Shared Access Signature Uri) or valid path
// to a data folder in a locally mounted drive. When local paths are specified, they must follow the Linux/Unix path
// format and be an absolute path rooted to the input mount configuration
// setting value e.g., if '{Mounts:Input}' configuration setting value is '/input' then a valid source path would be
// '/input/contosodataset'. All data to be trained is expected to be directly under the source folder. Subfolders are
// not supported. Models are trained using documents that are of the following content type - 'application/pdf',
// 'image/jpeg' and 'image/png'."
// Other type of content is ignored.
// Parameters:
// trainRequest - request object for training.
func (client BaseClient) TrainCustomModel(ctx context.Context, trainRequest TrainRequest) (result TrainResult, err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/BaseClient.TrainCustomModel")
		defer func() {
			sc := -1
			if result.Response.Response != nil {
				sc = result.Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	if err := validation.Validate([]validation.Validation{
		{TargetValue: trainRequest,
			Constraints: []validation.Constraint{{Target: "trainRequest.Source", Name: validation.Null, Rule: true,
				Chain: []validation.Constraint{{Target: "trainRequest.Source", Name: validation.MaxLength, Rule: 2048, Chain: nil},
					{Target: "trainRequest.Source", Name: validation.MinLength, Rule: 0, Chain: nil},
				}},
				{Target: "trainRequest.SourceFilter", Name: validation.Null, Rule: false,
					Chain: []validation.Constraint{{Target: "trainRequest.SourceFilter.Prefix", Name: validation.Null, Rule: false,
						Chain: []validation.Constraint{{Target: "trainRequest.SourceFilter.Prefix", Name: validation.MaxLength, Rule: 128, Chain: nil},
							{Target: "trainRequest.SourceFilter.Prefix", Name: validation.MinLength, Rule: 0, Chain: nil},
						}},
					}}}}}); err != nil {
		return result, validation.NewError("formrecognizer.BaseClient", "TrainCustomModel", err.Error())
	}

	req, err := client.TrainCustomModelPreparer(ctx, trainRequest)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "TrainCustomModel", nil, "Failure preparing request")
		return
	}

	resp, err := client.TrainCustomModelSender(req)
	if err != nil {
		result.Response = autorest.Response{Response: resp}
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "TrainCustomModel", resp, "Failure sending request")
		return
	}

	result, err = client.TrainCustomModelResponder(resp)
	if err != nil {
		err = autorest.NewErrorWithError(err, "formrecognizer.BaseClient", "TrainCustomModel", resp, "Failure responding to request")
		return
	}

	return
}

// TrainCustomModelPreparer prepares the TrainCustomModel request.
func (client BaseClient) TrainCustomModelPreparer(ctx context.Context, trainRequest TrainRequest) (*http.Request, error) {
	urlParameters := map[string]interface{}{
		"Endpoint": client.Endpoint,
	}

	preparer := autorest.CreatePreparer(
		autorest.AsContentType("application/json; charset=utf-8"),
		autorest.AsPost(),
		autorest.WithCustomBaseURL("{Endpoint}/formrecognizer/v1.0-preview", urlParameters),
		autorest.WithPath("/custom/train"),
		autorest.WithJSON(trainRequest))
	return preparer.Prepare((&http.Request{}).WithContext(ctx))
}

// TrainCustomModelSender sends the TrainCustomModel request. The method will close the
// http.Response Body if it receives an error.
func (client BaseClient) TrainCustomModelSender(req *http.Request) (*http.Response, error) {
	return client.Send(req, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
}

// TrainCustomModelResponder handles the response to the TrainCustomModel request. The method always
// closes the http.Response Body.
func (client BaseClient) TrainCustomModelResponder(resp *http.Response) (result TrainResult, err error) {
	err = autorest.Respond(
		resp,
		azure.WithErrorUnlessStatusCode(http.StatusOK),
		autorest.ByUnmarshallingJSON(&result),
		autorest.ByClosing())
	result.Response = autorest.Response{Response: resp}
	return
}
