/*
 * 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.aws2.athena.springboot;

import org.apache.camel.component.aws2.athena.Athena2Component;
import org.apache.camel.component.aws2.athena.Athena2Configuration;
import org.apache.camel.component.aws2.athena.Athena2Operations;
import org.apache.camel.component.aws2.athena.Athena2OutputType;
import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
import org.springframework.boot.context.properties.ConfigurationProperties;
import software.amazon.awssdk.core.Protocol;
import software.amazon.awssdk.services.athena.AthenaClient;
import software.amazon.awssdk.services.athena.model.EncryptionOption;

/**
 * Access AWS Athena.
 * 
 * Generated by camel-package-maven-plugin - do not edit this file!
 */
@ConfigurationProperties(prefix = "camel.component.aws2-athena")
public class Athena2ComponentConfiguration
        extends
            ComponentConfigurationPropertiesCommon {

    /**
     * Whether to enable auto configuration of the aws2-athena component. This
     * is enabled by default.
     */
    private Boolean enabled;
    /**
     * The component configuration. The option is a
     * org.apache.camel.component.aws2.athena.Athena2Configuration type.
     */
    private Athena2Configuration configuration;
    /**
     * The Athena database to use.
     */
    private String database;
    /**
     * Milliseconds before the next poll for query execution status. See the
     * section Waiting for Query Completion and Retrying Failed Queries to learn
     * more.
     */
    private Long delay = 2000L;
    /**
     * Milliseconds before the first poll for query execution status. See the
     * section Waiting for Query Completion and Retrying Failed Queries to learn
     * more.
     */
    private Long initialDelay = 1000L;
    /**
     * 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;
    /**
     * Maximum number of times to attempt a query. Set to 1 to disable retries.
     * See the section Waiting for Query Completion and Retrying Failed Queries
     * to learn more.
     */
    private Integer maxAttempts = 1;
    /**
     * Max number of results to return for the given operation (if supported by
     * the Athena API endpoint). If not set, will use the Athena API default for
     * the given operation.
     */
    private Integer maxResults;
    /**
     * Pagination token to use in the case where the response from the previous
     * request was truncated.
     */
    private String nextToken;
    /**
     * The Athena API function to call.
     */
    private Athena2Operations operation = Athena2Operations.startQueryExecution;
    /**
     * The location in Amazon S3 where query results are stored, such as
     * s3://path/to/query/bucket/. Ensure this value ends with a forward slash.
     */
    private String outputLocation;
    /**
     * How query results should be returned. One of StreamList (default - return
     * a GetQueryResultsIterable that can page through all results), SelectList
     * (returns at most 1000 rows at a time, plus a NextToken value as a header
     * than can be used for manual pagination of results), S3Pointer (return an
     * S3 path pointing to the results).
     */
    private Athena2OutputType outputType = Athena2OutputType.StreamList;
    /**
     * The unique ID identifying the query execution.
     */
    private String queryExecutionId;
    /**
     * The SQL query to run. Except for simple queries, prefer setting this as
     * the body of the Exchange or as a header using
     * Athena2Constants.QUERY_STRING to avoid having to deal with URL encoding
     * issues.
     */
    private String queryString;
    /**
     * The region in which Athena client needs to work. When using this
     * parameter, the configuration will expect the lowercase name of the region
     * (for example ap-east-1).
     */
    private String region;
    /**
     * Reset the waitTimeout countdown in the event of a query retry. If set to
     * true, potential max time spent waiting for queries is equal to
     * waitTimeout x maxAttempts. See the section Waiting for Query Completion
     * and Retrying Failed Queries to learn more.
     */
    private Boolean resetWaitTimeoutOnRetry = true;
    /**
     * Optional comma separated list of error types to retry the query for. Use:
     * 'retryable' to retry all retryable failure conditions (e.g. generic
     * errors and resources exhausted), 'generic' to retry
     * 'GENERIC_INTERNAL_ERROR' failures, 'exhausted' to retry queries that have
     * exhausted resource limits, 'always' to always retry regardless of failure
     * condition, or 'never' or null to never retry (default). See the section
     * Waiting for Query Completion and Retrying Failed Queries to learn more.
     */
    private String retry = "never";
    /**
     * Optional max wait time in millis to wait for a successful query
     * completion. See the section Waiting for Query Completion and Retrying
     * Failed Queries to learn more.
     */
    private Long waitTimeout = 0L;
    /**
     * The workgroup to use for running the query.
     */
    private String workGroup;
    /**
     * The AmazonAthena instance to use as the client. The option is a
     * software.amazon.awssdk.services.athena.AthenaClient type.
     */
    private AthenaClient amazonAthenaClient;
    /**
     * 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;
    /**
     * A unique string to ensure issues queries are idempotent. It is unlikely
     * you will need to set this.
     */
    private String clientRequestToken;
    /**
     * Include useful trace information at the beginning of queries as an SQL
     * comment (prefixed with --).
     */
    private Boolean includeTrace = false;
    /**
     * Used for enabling or disabling all consumer based health checks from this
     * component
     */
    private Boolean healthCheckConsumerEnabled = true;
    /**
     * Used for enabling or disabling all producer based health checks from this
     * component. Notice: Camel has by default disabled all producer based
     * health-checks. You can turn on producer checks globally by setting
     * camel.health.producersEnabled=true.
     */
    private Boolean healthCheckProducerEnabled = true;
    /**
     * To define a proxy host when instantiating the Athena client.
     */
    private String proxyHost;
    /**
     * To define a proxy port when instantiating the Athena client.
     */
    private Integer proxyPort;
    /**
     * To define a proxy protocol when instantiating the Athena client.
     */
    private Protocol proxyProtocol = Protocol.HTTPS;
    /**
     * Amazon AWS Access Key.
     */
    private String accessKey;
    /**
     * The encryption type to use when storing query results in S3. One of
     * SSE_S3, SSE_KMS, or CSE_KMS.
     */
    private EncryptionOption encryptionOption;
    /**
     * For SSE-KMS and CSE-KMS, this is the KMS key ARN or ID.
     */
    private String kmsKey;
    /**
     * If using a profile credentials provider, this parameter will set the
     * profile name
     */
    private String profileCredentialsName;
    /**
     * Amazon AWS Secret Key.
     */
    private String secretKey;
    /**
     * Amazon AWS Session Token used when the user needs to assume an IAM role
     */
    private String sessionToken;
    /**
     * Set whether the Athena client should expect to load credentials through a
     * default credentials provider or to expect static credentials to be passed
     * in
     */
    private Boolean useDefaultCredentialsProvider = false;
    /**
     * Set whether the Athena client should expect to load credentials through a
     * profile credentials provider.
     */
    private Boolean useProfileCredentialsProvider = false;
    /**
     * Set whether the Athena client should expect to use Session Credentials.
     * This is useful in a situation in which the user needs to assume an IAM
     * role for doing operations in Athena.
     */
    private Boolean useSessionCredentials = false;

    public Athena2Configuration getConfiguration() {
        return configuration;
    }

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

    public String getDatabase() {
        return database;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public Long getDelay() {
        return delay;
    }

    public void setDelay(Long delay) {
        this.delay = delay;
    }

    public Long getInitialDelay() {
        return initialDelay;
    }

    public void setInitialDelay(Long initialDelay) {
        this.initialDelay = initialDelay;
    }

    public Boolean getLazyStartProducer() {
        return lazyStartProducer;
    }

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

    public Integer getMaxAttempts() {
        return maxAttempts;
    }

    public void setMaxAttempts(Integer maxAttempts) {
        this.maxAttempts = maxAttempts;
    }

    public Integer getMaxResults() {
        return maxResults;
    }

    public void setMaxResults(Integer maxResults) {
        this.maxResults = maxResults;
    }

    public String getNextToken() {
        return nextToken;
    }

    public void setNextToken(String nextToken) {
        this.nextToken = nextToken;
    }

    public Athena2Operations getOperation() {
        return operation;
    }

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

    public String getOutputLocation() {
        return outputLocation;
    }

    public void setOutputLocation(String outputLocation) {
        this.outputLocation = outputLocation;
    }

    public Athena2OutputType getOutputType() {
        return outputType;
    }

    public void setOutputType(Athena2OutputType outputType) {
        this.outputType = outputType;
    }

    public String getQueryExecutionId() {
        return queryExecutionId;
    }

    public void setQueryExecutionId(String queryExecutionId) {
        this.queryExecutionId = queryExecutionId;
    }

    public String getQueryString() {
        return queryString;
    }

    public void setQueryString(String queryString) {
        this.queryString = queryString;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public Boolean getResetWaitTimeoutOnRetry() {
        return resetWaitTimeoutOnRetry;
    }

    public void setResetWaitTimeoutOnRetry(Boolean resetWaitTimeoutOnRetry) {
        this.resetWaitTimeoutOnRetry = resetWaitTimeoutOnRetry;
    }

    public String getRetry() {
        return retry;
    }

    public void setRetry(String retry) {
        this.retry = retry;
    }

    public Long getWaitTimeout() {
        return waitTimeout;
    }

    public void setWaitTimeout(Long waitTimeout) {
        this.waitTimeout = waitTimeout;
    }

    public String getWorkGroup() {
        return workGroup;
    }

    public void setWorkGroup(String workGroup) {
        this.workGroup = workGroup;
    }

    public AthenaClient getAmazonAthenaClient() {
        return amazonAthenaClient;
    }

    public void setAmazonAthenaClient(AthenaClient amazonAthenaClient) {
        this.amazonAthenaClient = amazonAthenaClient;
    }

    public Boolean getAutowiredEnabled() {
        return autowiredEnabled;
    }

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

    public String getClientRequestToken() {
        return clientRequestToken;
    }

    public void setClientRequestToken(String clientRequestToken) {
        this.clientRequestToken = clientRequestToken;
    }

    public Boolean getIncludeTrace() {
        return includeTrace;
    }

    public void setIncludeTrace(Boolean includeTrace) {
        this.includeTrace = includeTrace;
    }

    public Boolean getHealthCheckConsumerEnabled() {
        return healthCheckConsumerEnabled;
    }

    public void setHealthCheckConsumerEnabled(Boolean healthCheckConsumerEnabled) {
        this.healthCheckConsumerEnabled = healthCheckConsumerEnabled;
    }

    public Boolean getHealthCheckProducerEnabled() {
        return healthCheckProducerEnabled;
    }

    public void setHealthCheckProducerEnabled(Boolean healthCheckProducerEnabled) {
        this.healthCheckProducerEnabled = healthCheckProducerEnabled;
    }

    public String getProxyHost() {
        return proxyHost;
    }

    public void setProxyHost(String proxyHost) {
        this.proxyHost = proxyHost;
    }

    public Integer getProxyPort() {
        return proxyPort;
    }

    public void setProxyPort(Integer proxyPort) {
        this.proxyPort = proxyPort;
    }

    public Protocol getProxyProtocol() {
        return proxyProtocol;
    }

    public void setProxyProtocol(Protocol proxyProtocol) {
        this.proxyProtocol = proxyProtocol;
    }

    public String getAccessKey() {
        return accessKey;
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public EncryptionOption getEncryptionOption() {
        return encryptionOption;
    }

    public void setEncryptionOption(EncryptionOption encryptionOption) {
        this.encryptionOption = encryptionOption;
    }

    public String getKmsKey() {
        return kmsKey;
    }

    public void setKmsKey(String kmsKey) {
        this.kmsKey = kmsKey;
    }

    public String getProfileCredentialsName() {
        return profileCredentialsName;
    }

    public void setProfileCredentialsName(String profileCredentialsName) {
        this.profileCredentialsName = profileCredentialsName;
    }

    public String getSecretKey() {
        return secretKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    public String getSessionToken() {
        return sessionToken;
    }

    public void setSessionToken(String sessionToken) {
        this.sessionToken = sessionToken;
    }

    public Boolean getUseDefaultCredentialsProvider() {
        return useDefaultCredentialsProvider;
    }

    public void setUseDefaultCredentialsProvider(
            Boolean useDefaultCredentialsProvider) {
        this.useDefaultCredentialsProvider = useDefaultCredentialsProvider;
    }

    public Boolean getUseProfileCredentialsProvider() {
        return useProfileCredentialsProvider;
    }

    public void setUseProfileCredentialsProvider(
            Boolean useProfileCredentialsProvider) {
        this.useProfileCredentialsProvider = useProfileCredentialsProvider;
    }

    public Boolean getUseSessionCredentials() {
        return useSessionCredentials;
    }

    public void setUseSessionCredentials(Boolean useSessionCredentials) {
        this.useSessionCredentials = useSessionCredentials;
    }
}