/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.camel.component.azure.cosmosdb.springboot;

import com.azure.cosmos.ConsistencyLevel;
import com.azure.cosmos.CosmosAsyncClient;
import com.azure.cosmos.models.ChangeFeedProcessorOptions;
import com.azure.cosmos.models.CosmosQueryRequestOptions;
import com.azure.cosmos.models.IndexingPolicy;
import com.azure.cosmos.models.ThroughputProperties;
import org.apache.camel.component.azure.cosmosdb.CosmosDbComponent;
import org.apache.camel.component.azure.cosmosdb.CosmosDbConfiguration;
import org.apache.camel.component.azure.cosmosdb.CosmosDbOperationsDefinition;
import org.apache.camel.component.azure.cosmosdb.CredentialType;
import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * To read and write records to the CosmosDB database on Azure cloud platform.
 * 
 * Generated by camel-package-maven-plugin - do not edit this file!
 */
@ConfigurationProperties(prefix = "camel.component.azure-cosmosdb")
public class CosmosDbComponentConfiguration
        extends
            ComponentConfigurationPropertiesCommon {

    /**
     * Whether to enable auto configuration of the azure-cosmosdb component.
     * This is enabled by default.
     */
    private Boolean enabled;
    /**
     * Sets the flag to enable client telemetry which will periodically collect
     * database operations aggregation statistics, system information like
     * cpu/memory and send it to cosmos monitoring service, which will be
     * helpful during debugging. DEFAULT value is false indicating this is an
     * opt-in feature, by default no telemetry collection.
     */
    private Boolean clientTelemetryEnabled = false;
    /**
     * The component configurations. The option is a
     * org.apache.camel.component.azure.cosmosdb.CosmosDbConfiguration type.
     */
    private CosmosDbConfiguration configuration;
    /**
     * Enables connections sharing across multiple Cosmos Clients. The default
     * is false. When you have multiple instances of Cosmos Client in the same
     * JVM interacting with multiple Cosmos accounts, enabling this allows
     * connection sharing in Direct mode if possible between instances of Cosmos
     * Client. Please note, when setting this option, the connection
     * configuration (e.g., socket timeout config, idle timeout config) of the
     * first instantiated client will be used for all other client instances.
     */
    private Boolean connectionSharingAcrossClientsEnabled = false;
    /**
     * Sets the consistency levels supported for Azure Cosmos DB client
     * operations in the Azure Cosmos DB service. The requested ConsistencyLevel
     * must match or be weaker than that provisioned for the database account.
     * Consistency levels by order of strength are STRONG, BOUNDED_STALENESS,
     * SESSION and EVENTUAL. Refer to consistency level documentation for
     * additional details:
     * https://docs.microsoft.com/en-us/azure/cosmos-db/consistency-levels
     */
    private ConsistencyLevel consistencyLevel = ConsistencyLevel.SESSION;
    /**
     * Sets the container partition key path.
     */
    private String containerPartitionKeyPath;
    /**
     * Sets the boolean to only return the headers and status code in Cosmos DB
     * response in case of Create, Update and Delete operations on CosmosItem.
     * In Consumer, it is enabled by default because of the ChangeFeed in the
     * consumer that needs this flag to be enabled, and thus it shouldn't be
     * overridden. In Producer, it is advised to disable it since it reduces the
     * network overhead
     */
    private Boolean contentResponseOnWriteEnabled = true;
    /**
     * Inject an external CosmosAsyncClient into the component which provides a
     * client-side logical representation of the Azure Cosmos DB service. This
     * asynchronous client is used to configure and execute requests against the
     * service. The option is a com.azure.cosmos.CosmosAsyncClient type.
     */
    private CosmosAsyncClient cosmosAsyncClient;
    /**
     * Sets if the component should create the Cosmos container automatically in
     * case it doesn't exist in the Cosmos database
     */
    private Boolean createContainerIfNotExists = false;
    /**
     * Sets if the component should create the Cosmos database automatically in
     * case it doesn't exist in the Cosmos account
     */
    private Boolean createDatabaseIfNotExists = false;
    /**
     * Sets the Azure Cosmos database endpoint the component will connect to.
     */
    private String databaseEndpoint;
    /**
     * Sets the flag to enable writes on any regions for geo-replicated database
     * accounts in the Azure Cosmos DB service. When the value of this property
     * is true, the SDK will direct write operations to available writable
     * regions of geo-replicated database account. Writable regions are ordered
     * by PreferredRegions property. Setting the property value to true has no
     * effect until EnableMultipleWriteRegions in DatabaseAccount is also set to
     * true. DEFAULT value is true indicating that writes are directed to
     * available writable regions of geo-replicated database account.
     */
    private Boolean multipleWriteRegionsEnabled = true;
    /**
     * Sets the comma separated preferred regions for geo-replicated database
     * accounts. For example, East US as the preferred region. When
     * EnableEndpointDiscovery is true and PreferredRegions is non-empty, the
     * SDK will prefer to use the regions in the container in the order they are
     * specified to perform operations.
     */
    private String preferredRegions;
    /**
     * Sets whether to allow for reads to go to multiple regions configured on
     * an account of Azure Cosmos DB service. DEFAULT value is true. If this
     * property is not set, the default is true for all Consistency Levels other
     * than Bounded Staleness, The default is false for Bounded Staleness. 1.
     * endpointDiscoveryEnabled is true 2. the Azure Cosmos DB account has more
     * than one region
     */
    private Boolean readRequestsFallbackEnabled = true;
    /**
     * Sets throughput of the resources in the Azure Cosmos DB service. The
     * option is a com.azure.cosmos.models.ThroughputProperties type.
     */
    private ThroughputProperties throughputProperties;
    /**
     * Allows for bridging the consumer to the Camel routing Error Handler,
     * which mean any exceptions (if possible) occurred while the Camel consumer
     * is trying to pickup incoming messages, or the likes, will now be
     * processed as a message and handled by the routing Error Handler.
     * Important: This is only possible if the 3rd party component allows Camel
     * to be alerted if an exception was thrown. Some components handle this
     * internally only, and therefore bridgeErrorHandler is not possible. In
     * other situations we may improve the Camel component to hook into the 3rd
     * party component and make this possible for future releases. By default
     * the consumer will use the org.apache.camel.spi.ExceptionHandler to deal
     * with exceptions, that will be logged at WARN or ERROR level and ignored.
     */
    private Boolean bridgeErrorHandler = false;
    /**
     * Sets the ChangeFeedProcessorOptions to be used. Unless specifically set
     * the default values that will be used are: maximum items per page or
     * FeedResponse: 100 lease renew interval: 17 seconds lease acquire
     * interval: 13 seconds lease expiration interval: 60 seconds feed poll
     * delay: 5 seconds maximum scale count: unlimited. The option is a
     * com.azure.cosmos.models.ChangeFeedProcessorOptions type.
     */
    private ChangeFeedProcessorOptions changeFeedProcessorOptions;
    /**
     * Sets if the component should create Cosmos lease container for the
     * consumer automatically in case it doesn't exist in Cosmos database
     */
    private Boolean createLeaseContainerIfNotExists = false;
    /**
     * Sets if the component should create the Cosmos lease database for the
     * consumer automatically in case it doesn't exist in the Cosmos account
     */
    private Boolean createLeaseDatabaseIfNotExists = false;
    /**
     * Sets the hostname. The host: a host is an application instance that uses
     * the change feed processor to listen for changes. Multiple instances with
     * the same lease configuration can run in parallel, but each instance
     * should have a different instance name. If not specified, this will be a
     * generated random hostname.
     */
    private String hostName;
    /**
     * Sets the lease container which acts as a state storage and coordinates
     * processing the change feed across multiple workers. The lease container
     * can be stored in the same account as the monitored container or in a
     * separate account. It will be auto-created if
     * createLeaseContainerIfNotExists is set to true.
     */
    private String leaseContainerName = "camel-lease";
    /**
     * Sets the lease database where the leaseContainerName will be stored. If
     * it is not specified, this component will store the lease container in the
     * same database that is specified in databaseName. It will be auto-created
     * if createLeaseDatabaseIfNotExists is set to true.
     */
    private String leaseDatabaseName;
    /**
     * Sets the itemId in case needed for operation on item like delete, replace
     */
    private String itemId;
    /**
     * Sets partition key. Represents a partition key value in the Azure Cosmos
     * DB database service. A partition key identifies the partition where the
     * item is stored in.
     */
    private String itemPartitionKey;
    /**
     * Whether the producer should be started lazy (on the first message). By
     * starting lazy you can use this to allow CamelContext and routes to
     * startup in situations where a producer may otherwise fail during starting
     * and cause the route to fail being started. By deferring this startup to
     * be lazy then the startup failure can be handled during routing messages
     * via Camel's routing error handlers. Beware that when the first message is
     * processed then creating and starting the producer may take a little time
     * and prolong the total processing time of the processing.
     */
    private Boolean lazyStartProducer = false;
    /**
     * The CosmosDB operation that can be used with this component on the
     * producer.
     */
    private CosmosDbOperationsDefinition operation = CosmosDbOperationsDefinition.listDatabases;
    /**
     * An SQL query to execute on a given resources. To learn more about Cosmos
     * SQL API, check this link {link
     * https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-getting-started}
     */
    private String query;
    /**
     * Set additional QueryRequestOptions that can be used with queryItems,
     * queryContainers, queryDatabases, listDatabases, listItems, listContainers
     * operations. The option is a
     * com.azure.cosmos.models.CosmosQueryRequestOptions type.
     */
    private CosmosQueryRequestOptions queryRequestOptions;
    /**
     * The CosmosDB Indexing Policy that will be set in case of container
     * creation, this option is related to createLeaseContainerIfNotExists and
     * it will be taken into account when the latter is true. The option is a
     * com.azure.cosmos.models.IndexingPolicy type.
     */
    private IndexingPolicy indexingPolicy;
    /**
     * Whether autowiring is enabled. This is used for automatic autowiring
     * options (the option must be marked as autowired) by looking up in the
     * registry to find if there is a single instance of matching type, which
     * then gets configured on the component. This can be used for automatic
     * configuring JDBC data sources, JMS connection factories, AWS Clients,
     * etc.
     */
    private Boolean autowiredEnabled = true;
    /**
     * Sets either a master or readonly key used to perform authentication for
     * accessing resource.
     */
    private String accountKey;
    /**
     * Determines the credential strategy to adopt
     */
    private CredentialType credentialType = CredentialType.SHARED_ACCOUNT_KEY;

    public Boolean getClientTelemetryEnabled() {
        return clientTelemetryEnabled;
    }

    public void setClientTelemetryEnabled(Boolean clientTelemetryEnabled) {
        this.clientTelemetryEnabled = clientTelemetryEnabled;
    }

    public CosmosDbConfiguration getConfiguration() {
        return configuration;
    }

    public void setConfiguration(CosmosDbConfiguration configuration) {
        this.configuration = configuration;
    }

    public Boolean getConnectionSharingAcrossClientsEnabled() {
        return connectionSharingAcrossClientsEnabled;
    }

    public void setConnectionSharingAcrossClientsEnabled(
            Boolean connectionSharingAcrossClientsEnabled) {
        this.connectionSharingAcrossClientsEnabled = connectionSharingAcrossClientsEnabled;
    }

    public ConsistencyLevel getConsistencyLevel() {
        return consistencyLevel;
    }

    public void setConsistencyLevel(ConsistencyLevel consistencyLevel) {
        this.consistencyLevel = consistencyLevel;
    }

    public String getContainerPartitionKeyPath() {
        return containerPartitionKeyPath;
    }

    public void setContainerPartitionKeyPath(String containerPartitionKeyPath) {
        this.containerPartitionKeyPath = containerPartitionKeyPath;
    }

    public Boolean getContentResponseOnWriteEnabled() {
        return contentResponseOnWriteEnabled;
    }

    public void setContentResponseOnWriteEnabled(
            Boolean contentResponseOnWriteEnabled) {
        this.contentResponseOnWriteEnabled = contentResponseOnWriteEnabled;
    }

    public CosmosAsyncClient getCosmosAsyncClient() {
        return cosmosAsyncClient;
    }

    public void setCosmosAsyncClient(CosmosAsyncClient cosmosAsyncClient) {
        this.cosmosAsyncClient = cosmosAsyncClient;
    }

    public Boolean getCreateContainerIfNotExists() {
        return createContainerIfNotExists;
    }

    public void setCreateContainerIfNotExists(Boolean createContainerIfNotExists) {
        this.createContainerIfNotExists = createContainerIfNotExists;
    }

    public Boolean getCreateDatabaseIfNotExists() {
        return createDatabaseIfNotExists;
    }

    public void setCreateDatabaseIfNotExists(Boolean createDatabaseIfNotExists) {
        this.createDatabaseIfNotExists = createDatabaseIfNotExists;
    }

    public String getDatabaseEndpoint() {
        return databaseEndpoint;
    }

    public void setDatabaseEndpoint(String databaseEndpoint) {
        this.databaseEndpoint = databaseEndpoint;
    }

    public Boolean getMultipleWriteRegionsEnabled() {
        return multipleWriteRegionsEnabled;
    }

    public void setMultipleWriteRegionsEnabled(
            Boolean multipleWriteRegionsEnabled) {
        this.multipleWriteRegionsEnabled = multipleWriteRegionsEnabled;
    }

    public String getPreferredRegions() {
        return preferredRegions;
    }

    public void setPreferredRegions(String preferredRegions) {
        this.preferredRegions = preferredRegions;
    }

    public Boolean getReadRequestsFallbackEnabled() {
        return readRequestsFallbackEnabled;
    }

    public void setReadRequestsFallbackEnabled(
            Boolean readRequestsFallbackEnabled) {
        this.readRequestsFallbackEnabled = readRequestsFallbackEnabled;
    }

    public ThroughputProperties getThroughputProperties() {
        return throughputProperties;
    }

    public void setThroughputProperties(
            ThroughputProperties throughputProperties) {
        this.throughputProperties = throughputProperties;
    }

    public Boolean getBridgeErrorHandler() {
        return bridgeErrorHandler;
    }

    public void setBridgeErrorHandler(Boolean bridgeErrorHandler) {
        this.bridgeErrorHandler = bridgeErrorHandler;
    }

    public ChangeFeedProcessorOptions getChangeFeedProcessorOptions() {
        return changeFeedProcessorOptions;
    }

    public void setChangeFeedProcessorOptions(
            ChangeFeedProcessorOptions changeFeedProcessorOptions) {
        this.changeFeedProcessorOptions = changeFeedProcessorOptions;
    }

    public Boolean getCreateLeaseContainerIfNotExists() {
        return createLeaseContainerIfNotExists;
    }

    public void setCreateLeaseContainerIfNotExists(
            Boolean createLeaseContainerIfNotExists) {
        this.createLeaseContainerIfNotExists = createLeaseContainerIfNotExists;
    }

    public Boolean getCreateLeaseDatabaseIfNotExists() {
        return createLeaseDatabaseIfNotExists;
    }

    public void setCreateLeaseDatabaseIfNotExists(
            Boolean createLeaseDatabaseIfNotExists) {
        this.createLeaseDatabaseIfNotExists = createLeaseDatabaseIfNotExists;
    }

    public String getHostName() {
        return hostName;
    }

    public void setHostName(String hostName) {
        this.hostName = hostName;
    }

    public String getLeaseContainerName() {
        return leaseContainerName;
    }

    public void setLeaseContainerName(String leaseContainerName) {
        this.leaseContainerName = leaseContainerName;
    }

    public String getLeaseDatabaseName() {
        return leaseDatabaseName;
    }

    public void setLeaseDatabaseName(String leaseDatabaseName) {
        this.leaseDatabaseName = leaseDatabaseName;
    }

    public String getItemId() {
        return itemId;
    }

    public void setItemId(String itemId) {
        this.itemId = itemId;
    }

    public String getItemPartitionKey() {
        return itemPartitionKey;
    }

    public void setItemPartitionKey(String itemPartitionKey) {
        this.itemPartitionKey = itemPartitionKey;
    }

    public Boolean getLazyStartProducer() {
        return lazyStartProducer;
    }

    public void setLazyStartProducer(Boolean lazyStartProducer) {
        this.lazyStartProducer = lazyStartProducer;
    }

    public CosmosDbOperationsDefinition getOperation() {
        return operation;
    }

    public void setOperation(CosmosDbOperationsDefinition operation) {
        this.operation = operation;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    public CosmosQueryRequestOptions getQueryRequestOptions() {
        return queryRequestOptions;
    }

    public void setQueryRequestOptions(
            CosmosQueryRequestOptions queryRequestOptions) {
        this.queryRequestOptions = queryRequestOptions;
    }

    public IndexingPolicy getIndexingPolicy() {
        return indexingPolicy;
    }

    public void setIndexingPolicy(IndexingPolicy indexingPolicy) {
        this.indexingPolicy = indexingPolicy;
    }

    public Boolean getAutowiredEnabled() {
        return autowiredEnabled;
    }

    public void setAutowiredEnabled(Boolean autowiredEnabled) {
        this.autowiredEnabled = autowiredEnabled;
    }

    public String getAccountKey() {
        return accountKey;
    }

    public void setAccountKey(String accountKey) {
        this.accountKey = accountKey;
    }

    public CredentialType getCredentialType() {
        return credentialType;
    }

    public void setCredentialType(CredentialType credentialType) {
        this.credentialType = credentialType;
    }
}