#
# 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.
#

# THE CONFIGURATION FOR Iceberg REST SERVER
gravitino.iceberg-rest.shutdown.timeout = {{ .Values.icebergRest.shutdownTimeout | default 3000 }}

# THE CONFIGURATION FOR Iceberg REST WEB SERVER
# The host name of the built-in web server
gravitino.iceberg-rest.host = {{ .Values.icebergRest.host | default "0.0.0.0" }}
# The http port number of the built-in web server
gravitino.iceberg-rest.httpPort = {{ .Values.icebergRest.httpPort | default 9001 }}
# The min thread size of the built-in web server
gravitino.iceberg-rest.minThreads = {{ .Values.icebergRest.minThreads | default 24 }}
# The max thread size of the built-in web server
gravitino.iceberg-rest.maxThreads = {{ .Values.icebergRest.maxThreads | default 200 }}
# The stop timeout of the built-in web server
gravitino.iceberg-rest.stopTimeout = {{ .Values.icebergRest.stopTimeout | default 30000 }}
# The timeout of idle connections
gravitino.iceberg-rest.idleTimeout = {{ .Values.icebergRest.idleTimeout | default 30000 }}
# The executor thread pool work queue size of the built-in web server
gravitino.iceberg-rest.threadPoolWorkQueueSize = {{ .Values.icebergRest.threadPoolWorkQueueSize | default 100 }}
# The request header size of the built-in web server
gravitino.iceberg-rest.requestHeaderSize = {{ .Values.icebergRest.requestHeaderSize | default 131072 }}
# The response header size of the built-in web server
gravitino.iceberg-rest.responseHeaderSize = {{ .Values.icebergRest.responseHeaderSize | default 131072 }}

# THE CONFIGURATION FOR Iceberg catalog backend
# The Iceberg catalog backend, it's recommended to change to hive or jdbc
gravitino.iceberg-rest.catalog-backend = {{ .Values.icebergRest.catalogBackend | default "memory" }}

# The warehouse directory of Iceberg catalog
gravitino.iceberg-rest.warehouse = {{ .Values.icebergRest.warehouse | default "/tmp/" }}

{{- if .Values.icebergRest.uri }}
gravitino.iceberg-rest.uri = {{ .Values.icebergRest.uri }}
{{- end }}
{{- if .Values.icebergRest.catalogBackendName }}
gravitino.iceberg-rest.catalog-backend-name = {{ .Values.icebergRest.catalogBackendName }}
{{- end }}
{{- if .Values.icebergRest.ioImpl }}
gravitino.iceberg-rest.io-impl = {{ .Values.icebergRest.ioImpl }}
{{- end }}
{{- if .Values.icebergRest.credentialProviders }}
gravitino.iceberg-rest.credential-providers = {{ .Values.icebergRest.credentialProviders }}
{{- end }}

{{- if .Values.icebergRest.jdbc }}
# JDBC catalog backend
gravitino.iceberg-rest.jdbc-user = {{.Values.icebergRest.jdbc.user }}
gravitino.iceberg-rest.jdbc-password = {{.Values.icebergRest.jdbc.password }}
gravitino.iceberg-rest.jdbc-driver = {{.Values.icebergRest.jdbc.driver }}
{{- if .Values.icebergRest.jdbc.initialize }}
gravitino.iceberg-rest.jdbc-initialize = {{.Values.icebergRest.jdbc.initialize }}
{{- end }}
{{- end }}

{{- if .Values.icebergRest.s3 }}
# S3 storage
gravitino.iceberg-rest.s3-access-key-id = {{.Values.icebergRest.s3.accessKeyId }}
gravitino.iceberg-rest.s3-secret-access-key = {{.Values.icebergRest.s3.secretAccessKey }}
{{- if .Values.icebergRest.s3.endpoint }}
gravitino.iceberg-rest.s3-endpoint = {{.Values.icebergRest.s3.endpoint }}
{{- end }}
{{- if .Values.icebergRest.s3.region }}
gravitino.iceberg-rest.s3-region = {{.Values.icebergRest.s3.region }}
{{- end }}
{{- if .Values.icebergRest.s3.pathStyleAccess }}
gravitino.iceberg-rest.s3-path-style-access = {{.Values.icebergRest.s3.pathStyleAccess }}
{{- end }}
{{- if .Values.icebergRest.s3.roleArn }}
gravitino.iceberg-rest.s3-role-arn = {{.Values.icebergRest.s3.roleArn }}
{{- end }}
{{- if .Values.icebergRest.s3.externalId }}
gravitino.iceberg-rest.s3-external-id = {{.Values.icebergRest.s3.externalId }}
{{- end }}
{{- if .Values.icebergRest.s3.tokenServiceEndpoint }}
gravitino.iceberg-rest.s3-token-service-endpoint = {{.Values.icebergRest.s3.tokenServiceEndpoint }}
{{- end }}
{{- end }}

{{- if .Values.icebergRest.oss }}
# OSS storage
gravitino.iceberg-rest.oss-access-key-id = {{.Values.icebergRest.oss.accessKeyId }}
gravitino.iceberg-rest.oss-secret-access-key = {{.Values.icebergRest.oss.secretAccessKey }}
{{- if .Values.icebergRest.oss.endpoint }}
gravitino.iceberg-rest.oss-endpoint = {{.Values.icebergRest.oss.endpoint }}
{{- end }}
{{- if .Values.icebergRest.oss.region }}
gravitino.iceberg-rest.oss-region = {{.Values.icebergRest.oss.region }}
{{- end }}
{{- if .Values.icebergRest.oss.roleArn }}
gravitino.iceberg-rest.oss-role-arn = {{.Values.icebergRest.oss.roleArn }}
{{- end }}
{{- if .Values.icebergRest.oss.externalId }}
gravitino.iceberg-rest.oss-external-id = {{.Values.icebergRest.oss.externalId }}
{{- end }}
{{- end }}

{{- if .Values.icebergRest.azure }}
# Azure storage
gravitino.iceberg-rest.azure-storage-account-name = {{.Values.icebergRest.azure.storageAccountName }}
gravitino.iceberg-rest.azure-storage-account-key = {{.Values.icebergRest.azure.storageAccountKey }}
gravitino.iceberg-rest.azure-tenant-id = {{.Values.icebergRest.azure.tenantId }}
gravitino.iceberg-rest.azure-client-id = {{.Values.icebergRest.azure.clientId }}
gravitino.iceberg-rest.azure-client-secret = {{.Values.icebergRest.azure.clientSecret }}
{{- end }}

{{- if .Values.icebergRest.catalogConfigProvider }}
gravitino.iceberg-rest.catalog-config-provider = {{ .Values.icebergRest.catalogConfigProvider }}
{{- end }}
{{- if .Values.icebergRest.dynamicConfigProvider }}
gravitino.iceberg-rest.gravitino-uri = {{ .Values.icebergRest.dynamicConfigProvider.uri }}
gravitino.iceberg-rest.gravitino-metalake = {{ .Values.icebergRest.dynamicConfigProvider.metalake }}
gravitino.iceberg-rest.default-catalog-name = {{ .Values.icebergRest.dynamicConfigProvider.defaultCatalogName }}
{{- end }}

{{- range $key, $val := .Values.additionalConfigItems }}
{{ $key }} = {{ tpl $val $ }}
{{- end }}