/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */

#pragma once
#include <aws/workdocs/WorkDocs_EXPORTS.h>
#include <aws/workdocs/WorkDocsRequest.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/core/utils/memory/stl/AWSVector.h>
#include <aws/workdocs/model/Filters.h>
#include <aws/workdocs/model/SearchQueryScopeType.h>
#include <aws/workdocs/model/AdditionalResponseFieldType.h>
#include <aws/workdocs/model/SearchSortResult.h>
#include <utility>

namespace Aws
{
namespace WorkDocs
{
namespace Model
{

  /**
   */
  class SearchResourcesRequest : public WorkDocsRequest
  {
  public:
    AWS_WORKDOCS_API SearchResourcesRequest();

    // Service request name is the Operation name which will send this request out,
    // each operation should has unique request name, so that we can get operation's name from this request.
    // Note: this is not true for response, multiple operations may have the same response name,
    // so we can not get operation's name from response.
    inline virtual const char* GetServiceRequestName() const override { return "SearchResources"; }

    AWS_WORKDOCS_API Aws::String SerializePayload() const override;

    AWS_WORKDOCS_API Aws::Http::HeaderValueCollection GetRequestSpecificHeaders() const override;


    /**
     * <p>Amazon WorkDocs authentication token. Not required when using Amazon Web
     * Services administrator credentials to access the API.</p>
     */
    inline const Aws::String& GetAuthenticationToken() const{ return m_authenticationToken; }

    /**
     * <p>Amazon WorkDocs authentication token. Not required when using Amazon Web
     * Services administrator credentials to access the API.</p>
     */
    inline bool AuthenticationTokenHasBeenSet() const { return m_authenticationTokenHasBeenSet; }

    /**
     * <p>Amazon WorkDocs authentication token. Not required when using Amazon Web
     * Services administrator credentials to access the API.</p>
     */
    inline void SetAuthenticationToken(const Aws::String& value) { m_authenticationTokenHasBeenSet = true; m_authenticationToken = value; }

    /**
     * <p>Amazon WorkDocs authentication token. Not required when using Amazon Web
     * Services administrator credentials to access the API.</p>
     */
    inline void SetAuthenticationToken(Aws::String&& value) { m_authenticationTokenHasBeenSet = true; m_authenticationToken = std::move(value); }

    /**
     * <p>Amazon WorkDocs authentication token. Not required when using Amazon Web
     * Services administrator credentials to access the API.</p>
     */
    inline void SetAuthenticationToken(const char* value) { m_authenticationTokenHasBeenSet = true; m_authenticationToken.assign(value); }

    /**
     * <p>Amazon WorkDocs authentication token. Not required when using Amazon Web
     * Services administrator credentials to access the API.</p>
     */
    inline SearchResourcesRequest& WithAuthenticationToken(const Aws::String& value) { SetAuthenticationToken(value); return *this;}

    /**
     * <p>Amazon WorkDocs authentication token. Not required when using Amazon Web
     * Services administrator credentials to access the API.</p>
     */
    inline SearchResourcesRequest& WithAuthenticationToken(Aws::String&& value) { SetAuthenticationToken(std::move(value)); return *this;}

    /**
     * <p>Amazon WorkDocs authentication token. Not required when using Amazon Web
     * Services administrator credentials to access the API.</p>
     */
    inline SearchResourcesRequest& WithAuthenticationToken(const char* value) { SetAuthenticationToken(value); return *this;}


    /**
     * <p>The String to search for. Searches across different text fields based on
     * request parameters. Use double quotes around the query string for exact phrase
     * matches.</p>
     */
    inline const Aws::String& GetQueryText() const{ return m_queryText; }

    /**
     * <p>The String to search for. Searches across different text fields based on
     * request parameters. Use double quotes around the query string for exact phrase
     * matches.</p>
     */
    inline bool QueryTextHasBeenSet() const { return m_queryTextHasBeenSet; }

    /**
     * <p>The String to search for. Searches across different text fields based on
     * request parameters. Use double quotes around the query string for exact phrase
     * matches.</p>
     */
    inline void SetQueryText(const Aws::String& value) { m_queryTextHasBeenSet = true; m_queryText = value; }

    /**
     * <p>The String to search for. Searches across different text fields based on
     * request parameters. Use double quotes around the query string for exact phrase
     * matches.</p>
     */
    inline void SetQueryText(Aws::String&& value) { m_queryTextHasBeenSet = true; m_queryText = std::move(value); }

    /**
     * <p>The String to search for. Searches across different text fields based on
     * request parameters. Use double quotes around the query string for exact phrase
     * matches.</p>
     */
    inline void SetQueryText(const char* value) { m_queryTextHasBeenSet = true; m_queryText.assign(value); }

    /**
     * <p>The String to search for. Searches across different text fields based on
     * request parameters. Use double quotes around the query string for exact phrase
     * matches.</p>
     */
    inline SearchResourcesRequest& WithQueryText(const Aws::String& value) { SetQueryText(value); return *this;}

    /**
     * <p>The String to search for. Searches across different text fields based on
     * request parameters. Use double quotes around the query string for exact phrase
     * matches.</p>
     */
    inline SearchResourcesRequest& WithQueryText(Aws::String&& value) { SetQueryText(std::move(value)); return *this;}

    /**
     * <p>The String to search for. Searches across different text fields based on
     * request parameters. Use double quotes around the query string for exact phrase
     * matches.</p>
     */
    inline SearchResourcesRequest& WithQueryText(const char* value) { SetQueryText(value); return *this;}


    /**
     * <p>Filter based on the text field type. A Folder has only a name and no content.
     * A Comment has only content and no name. A Document or Document Version has a
     * name and content</p>
     */
    inline const Aws::Vector<SearchQueryScopeType>& GetQueryScopes() const{ return m_queryScopes; }

    /**
     * <p>Filter based on the text field type. A Folder has only a name and no content.
     * A Comment has only content and no name. A Document or Document Version has a
     * name and content</p>
     */
    inline bool QueryScopesHasBeenSet() const { return m_queryScopesHasBeenSet; }

    /**
     * <p>Filter based on the text field type. A Folder has only a name and no content.
     * A Comment has only content and no name. A Document or Document Version has a
     * name and content</p>
     */
    inline void SetQueryScopes(const Aws::Vector<SearchQueryScopeType>& value) { m_queryScopesHasBeenSet = true; m_queryScopes = value; }

    /**
     * <p>Filter based on the text field type. A Folder has only a name and no content.
     * A Comment has only content and no name. A Document or Document Version has a
     * name and content</p>
     */
    inline void SetQueryScopes(Aws::Vector<SearchQueryScopeType>&& value) { m_queryScopesHasBeenSet = true; m_queryScopes = std::move(value); }

    /**
     * <p>Filter based on the text field type. A Folder has only a name and no content.
     * A Comment has only content and no name. A Document or Document Version has a
     * name and content</p>
     */
    inline SearchResourcesRequest& WithQueryScopes(const Aws::Vector<SearchQueryScopeType>& value) { SetQueryScopes(value); return *this;}

    /**
     * <p>Filter based on the text field type. A Folder has only a name and no content.
     * A Comment has only content and no name. A Document or Document Version has a
     * name and content</p>
     */
    inline SearchResourcesRequest& WithQueryScopes(Aws::Vector<SearchQueryScopeType>&& value) { SetQueryScopes(std::move(value)); return *this;}

    /**
     * <p>Filter based on the text field type. A Folder has only a name and no content.
     * A Comment has only content and no name. A Document or Document Version has a
     * name and content</p>
     */
    inline SearchResourcesRequest& AddQueryScopes(const SearchQueryScopeType& value) { m_queryScopesHasBeenSet = true; m_queryScopes.push_back(value); return *this; }

    /**
     * <p>Filter based on the text field type. A Folder has only a name and no content.
     * A Comment has only content and no name. A Document or Document Version has a
     * name and content</p>
     */
    inline SearchResourcesRequest& AddQueryScopes(SearchQueryScopeType&& value) { m_queryScopesHasBeenSet = true; m_queryScopes.push_back(std::move(value)); return *this; }


    /**
     * <p>Filters based on the resource owner OrgId. This is a mandatory parameter when
     * using Admin SigV4 credentials.</p>
     */
    inline const Aws::String& GetOrganizationId() const{ return m_organizationId; }

    /**
     * <p>Filters based on the resource owner OrgId. This is a mandatory parameter when
     * using Admin SigV4 credentials.</p>
     */
    inline bool OrganizationIdHasBeenSet() const { return m_organizationIdHasBeenSet; }

    /**
     * <p>Filters based on the resource owner OrgId. This is a mandatory parameter when
     * using Admin SigV4 credentials.</p>
     */
    inline void SetOrganizationId(const Aws::String& value) { m_organizationIdHasBeenSet = true; m_organizationId = value; }

    /**
     * <p>Filters based on the resource owner OrgId. This is a mandatory parameter when
     * using Admin SigV4 credentials.</p>
     */
    inline void SetOrganizationId(Aws::String&& value) { m_organizationIdHasBeenSet = true; m_organizationId = std::move(value); }

    /**
     * <p>Filters based on the resource owner OrgId. This is a mandatory parameter when
     * using Admin SigV4 credentials.</p>
     */
    inline void SetOrganizationId(const char* value) { m_organizationIdHasBeenSet = true; m_organizationId.assign(value); }

    /**
     * <p>Filters based on the resource owner OrgId. This is a mandatory parameter when
     * using Admin SigV4 credentials.</p>
     */
    inline SearchResourcesRequest& WithOrganizationId(const Aws::String& value) { SetOrganizationId(value); return *this;}

    /**
     * <p>Filters based on the resource owner OrgId. This is a mandatory parameter when
     * using Admin SigV4 credentials.</p>
     */
    inline SearchResourcesRequest& WithOrganizationId(Aws::String&& value) { SetOrganizationId(std::move(value)); return *this;}

    /**
     * <p>Filters based on the resource owner OrgId. This is a mandatory parameter when
     * using Admin SigV4 credentials.</p>
     */
    inline SearchResourcesRequest& WithOrganizationId(const char* value) { SetOrganizationId(value); return *this;}


    /**
     * <p>A list of attributes to include in the response. Used to request fields that
     * are not normally returned in a standard response.</p>
     */
    inline const Aws::Vector<AdditionalResponseFieldType>& GetAdditionalResponseFields() const{ return m_additionalResponseFields; }

    /**
     * <p>A list of attributes to include in the response. Used to request fields that
     * are not normally returned in a standard response.</p>
     */
    inline bool AdditionalResponseFieldsHasBeenSet() const { return m_additionalResponseFieldsHasBeenSet; }

    /**
     * <p>A list of attributes to include in the response. Used to request fields that
     * are not normally returned in a standard response.</p>
     */
    inline void SetAdditionalResponseFields(const Aws::Vector<AdditionalResponseFieldType>& value) { m_additionalResponseFieldsHasBeenSet = true; m_additionalResponseFields = value; }

    /**
     * <p>A list of attributes to include in the response. Used to request fields that
     * are not normally returned in a standard response.</p>
     */
    inline void SetAdditionalResponseFields(Aws::Vector<AdditionalResponseFieldType>&& value) { m_additionalResponseFieldsHasBeenSet = true; m_additionalResponseFields = std::move(value); }

    /**
     * <p>A list of attributes to include in the response. Used to request fields that
     * are not normally returned in a standard response.</p>
     */
    inline SearchResourcesRequest& WithAdditionalResponseFields(const Aws::Vector<AdditionalResponseFieldType>& value) { SetAdditionalResponseFields(value); return *this;}

    /**
     * <p>A list of attributes to include in the response. Used to request fields that
     * are not normally returned in a standard response.</p>
     */
    inline SearchResourcesRequest& WithAdditionalResponseFields(Aws::Vector<AdditionalResponseFieldType>&& value) { SetAdditionalResponseFields(std::move(value)); return *this;}

    /**
     * <p>A list of attributes to include in the response. Used to request fields that
     * are not normally returned in a standard response.</p>
     */
    inline SearchResourcesRequest& AddAdditionalResponseFields(const AdditionalResponseFieldType& value) { m_additionalResponseFieldsHasBeenSet = true; m_additionalResponseFields.push_back(value); return *this; }

    /**
     * <p>A list of attributes to include in the response. Used to request fields that
     * are not normally returned in a standard response.</p>
     */
    inline SearchResourcesRequest& AddAdditionalResponseFields(AdditionalResponseFieldType&& value) { m_additionalResponseFieldsHasBeenSet = true; m_additionalResponseFields.push_back(std::move(value)); return *this; }


    /**
     * <p>Filters results based on entity metadata.</p>
     */
    inline const Filters& GetFilters() const{ return m_filters; }

    /**
     * <p>Filters results based on entity metadata.</p>
     */
    inline bool FiltersHasBeenSet() const { return m_filtersHasBeenSet; }

    /**
     * <p>Filters results based on entity metadata.</p>
     */
    inline void SetFilters(const Filters& value) { m_filtersHasBeenSet = true; m_filters = value; }

    /**
     * <p>Filters results based on entity metadata.</p>
     */
    inline void SetFilters(Filters&& value) { m_filtersHasBeenSet = true; m_filters = std::move(value); }

    /**
     * <p>Filters results based on entity metadata.</p>
     */
    inline SearchResourcesRequest& WithFilters(const Filters& value) { SetFilters(value); return *this;}

    /**
     * <p>Filters results based on entity metadata.</p>
     */
    inline SearchResourcesRequest& WithFilters(Filters&& value) { SetFilters(std::move(value)); return *this;}


    /**
     * <p>Order by results in one or more categories.</p>
     */
    inline const Aws::Vector<SearchSortResult>& GetOrderBy() const{ return m_orderBy; }

    /**
     * <p>Order by results in one or more categories.</p>
     */
    inline bool OrderByHasBeenSet() const { return m_orderByHasBeenSet; }

    /**
     * <p>Order by results in one or more categories.</p>
     */
    inline void SetOrderBy(const Aws::Vector<SearchSortResult>& value) { m_orderByHasBeenSet = true; m_orderBy = value; }

    /**
     * <p>Order by results in one or more categories.</p>
     */
    inline void SetOrderBy(Aws::Vector<SearchSortResult>&& value) { m_orderByHasBeenSet = true; m_orderBy = std::move(value); }

    /**
     * <p>Order by results in one or more categories.</p>
     */
    inline SearchResourcesRequest& WithOrderBy(const Aws::Vector<SearchSortResult>& value) { SetOrderBy(value); return *this;}

    /**
     * <p>Order by results in one or more categories.</p>
     */
    inline SearchResourcesRequest& WithOrderBy(Aws::Vector<SearchSortResult>&& value) { SetOrderBy(std::move(value)); return *this;}

    /**
     * <p>Order by results in one or more categories.</p>
     */
    inline SearchResourcesRequest& AddOrderBy(const SearchSortResult& value) { m_orderByHasBeenSet = true; m_orderBy.push_back(value); return *this; }

    /**
     * <p>Order by results in one or more categories.</p>
     */
    inline SearchResourcesRequest& AddOrderBy(SearchSortResult&& value) { m_orderByHasBeenSet = true; m_orderBy.push_back(std::move(value)); return *this; }


    /**
     * <p>Max results count per page.</p>
     */
    inline int GetLimit() const{ return m_limit; }

    /**
     * <p>Max results count per page.</p>
     */
    inline bool LimitHasBeenSet() const { return m_limitHasBeenSet; }

    /**
     * <p>Max results count per page.</p>
     */
    inline void SetLimit(int value) { m_limitHasBeenSet = true; m_limit = value; }

    /**
     * <p>Max results count per page.</p>
     */
    inline SearchResourcesRequest& WithLimit(int value) { SetLimit(value); return *this;}


    /**
     * <p>The marker for the next set of results.</p>
     */
    inline const Aws::String& GetMarker() const{ return m_marker; }

    /**
     * <p>The marker for the next set of results.</p>
     */
    inline bool MarkerHasBeenSet() const { return m_markerHasBeenSet; }

    /**
     * <p>The marker for the next set of results.</p>
     */
    inline void SetMarker(const Aws::String& value) { m_markerHasBeenSet = true; m_marker = value; }

    /**
     * <p>The marker for the next set of results.</p>
     */
    inline void SetMarker(Aws::String&& value) { m_markerHasBeenSet = true; m_marker = std::move(value); }

    /**
     * <p>The marker for the next set of results.</p>
     */
    inline void SetMarker(const char* value) { m_markerHasBeenSet = true; m_marker.assign(value); }

    /**
     * <p>The marker for the next set of results.</p>
     */
    inline SearchResourcesRequest& WithMarker(const Aws::String& value) { SetMarker(value); return *this;}

    /**
     * <p>The marker for the next set of results.</p>
     */
    inline SearchResourcesRequest& WithMarker(Aws::String&& value) { SetMarker(std::move(value)); return *this;}

    /**
     * <p>The marker for the next set of results.</p>
     */
    inline SearchResourcesRequest& WithMarker(const char* value) { SetMarker(value); return *this;}

  private:

    Aws::String m_authenticationToken;
    bool m_authenticationTokenHasBeenSet = false;

    Aws::String m_queryText;
    bool m_queryTextHasBeenSet = false;

    Aws::Vector<SearchQueryScopeType> m_queryScopes;
    bool m_queryScopesHasBeenSet = false;

    Aws::String m_organizationId;
    bool m_organizationIdHasBeenSet = false;

    Aws::Vector<AdditionalResponseFieldType> m_additionalResponseFields;
    bool m_additionalResponseFieldsHasBeenSet = false;

    Filters m_filters;
    bool m_filtersHasBeenSet = false;

    Aws::Vector<SearchSortResult> m_orderBy;
    bool m_orderByHasBeenSet = false;

    int m_limit;
    bool m_limitHasBeenSet = false;

    Aws::String m_marker;
    bool m_markerHasBeenSet = false;
  };

} // namespace Model
} // namespace WorkDocs
} // namespace Aws