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

#
# This is joint configuration file for both the server and the data probes. Note that
# server and probe configuration can be placed into separate files - each file containing only
# 'nlpcraft.server' or 'nlpcraft.probe' sub-sections.
#
# You can also provide configuration properties or override the default ones via environment variables.
# To use environment variables override:
# 1. Set probe or server JVM system property -Dconfig.override_with_env_vars=true
# 2. For each configuration 'x.y.z' set the environment variable CONFIG_FORCE_x_y_z=some_value
#
# Examples of environment variables:
#   -- Overrides 'nlpcraft.sever.host' configuration property.
#   CONFIG_FORCE_nlpcraft_server_rest_host="localhost"
#
#   -- Overrides 'nlpcraft.sever.models' configuration property.
#   CONFIG_FORCE_nlpcraft_server_models="com.models.MyModel"
#
# See https://nlpcraft.apache.org/server-and-probe.html for more details.
#

# Common server/probe configuration root.
nlpcraft {
    # +----------------------------+
    # | REST server configuration. |
    # +----------------------------+
    server {
        # Comma-separated list of class names for server lifecycle components.
        # Each class should implement 'NCServerLifecycle' interface/trait and provide an no-arg constructor.
        #
        # The following built-in OpenCensus exporters are supported as lifecycle components:
        # - org.apache.nlpcraft.server.lifecycle.opencensus.NCJaegerExporter (traces)
        # - org.apache.nlpcraft.server.lifecycle.opencensus.NCZipkinExporter (traces)
        # - org.apache.nlpcraft.server.lifecycle.opencensus.NCPrometheusExporter (stats)
        # - org.apache.nlpcraft.server.lifecycle.opencensus.NCStackdriverTraceExporter (traces)
        # - org.apache.nlpcraft.server.lifecycle.opencensus.NCStackdriverStatsExporter (stats)
        #
        # NOTE: all built-in trace exporters use "always" sampling that is only suitable
        # for demo or development purposes. For production usage you need to modify the
        # sampling strategy: https://opencensus.io/tracing/sampling/
        lifecycle = ""

        # Properties for various OpenCensus built-in exporters.
        # All configuration properties are optional unless otherwise specified.
        # opencensus {
        #     jaeger {
        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
        #         serviceName = "nlpcraft-server"
        #     }
        #     prometheus {
        #         hostPort = "localhost:8888"
        #         namespace = "nlpcraft-server"
        #     }
        #     stackdriver {
        #         # Mandatory Google project ID.
        #         googleProjectId = "your_google_project_id"
        #         metricsPrefix = "custom.googleapis.com/nlpcraft/server"
        #     }
        #     zipkin {
        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
        #         serviceName = "nlpcraft-server"
        #     }
        # }

        # Apache Ignite database, which is used by default, doesn't require configuration.
        # MySql, Postgres and Oracle databases can be configured instead.
        database {
            # jdbc {
            #     # MySQL URL and driver.
            #     # Note that MySQL driver dependencies should be added to the project,
            #     # and scripts sql/mysql should be executed.
            #     # Tested under MySQL 5.7.17.
            #     url = "jdbc:mysql://localhost:3306/nlpcraft"
            #     driver = com.mysql.jdbc.Driver
            #     username = <user>
            #     password = <password>
            # }

            # jdbc {
            #     # Postgres URL and driver.
            #     # Note that Postgres driver dependencies should be added to the project,
            #     # and scripts sql/postgres should be executed.
            #     # Tested under Postgres 9.6.9.
            #     url = "jdbc:postgresql://localhost:5432/nlpcraft"
            #     driver = org.postgresql.Driver
            #     username = nlpcraft
            #     password = nlpcraft
            # }

            # jdbc {
            #     # Oracle URL and driver.
            #     # Note that Oracle driver dependencies should be added to the project,
            #     # and scripts sql/oracle should be executed.
            #     # Tested under Oracle 11G (XE).
            #     url = "jdbc:oracle:thin:@localhost:1521:XE"
            #     driver = oracle.jdbc.driver.OracleDriver
            #     username = nlpcraft
            #     password = nlpcraft
            # }

            # Apache Ignite In-Memory Computing Platform (persistence).
            jdbc {
                # Ignite JDBC URL and driver.
                url = "jdbc:ignite:thin://127.0.0.1/nlpcraft"
                driver = org.apache.ignite.IgniteJdbcThinDriver
                # username =
                # password =
            }

            # Only used when Apache Ignite is configured as persistence provider.
            # Allows to reset Ignite DB.
            igniteDbInitialize = false

            # Common JDBC connection pool for any supported database.
            c3p0 {
                maxStatements = 180

                pool {
                    initSize = 10
                    minSize = 1
                    maxSize = 50
                    acquireIncrement = 2
                }
            }
        }

        # REST server configuration.
        rest {
            # NOTE: 'localhost' or '127.0.0.1' don't work from Docker container.
            host = "0.0.0.0"
            port = 8081
            apiImpl = "org.apache.nlpcraft.server.rest.NCBasicRestApi"
        }

        # User manager configuration.
        user {
            pwdPoolBlowup = 3
            timeoutScannerFreqMins = 1
            accessTokenExpireTimeoutMins = 60
        }

        # Probe manager configuration.
        probe {
            links {
                # Default endpoints.
                #
                # NOTES:
                # ------
                # (1) If changed - they need to be changed on both server and probes.
                # (2) Don't use 'localhost' if server and probe(s) are on different hosts.
                # (3) Use "0.0.0.0" IP address when running server in a docker container.

                # This property can be overridden with system property.
                upLink = "0.0.0.0:8201" # Server to probe data pipe.

                # This property can be overridden with system property.
                downLink = "0.0.0.0:8202" # Probe to server data pipe.
            }

            pingTimeoutMs = 2000
            soTimeoutMs = 5000
            reconnectTimeoutMs = 5000
        }

        # Default date formatting for 'nlpcraft:date' token detection only.
        # Supported formats: MDY, DMY, YMD.
        datesFormatStyle = MDY

        # Comma-separated list of enabled built-in token providers (each token represents a named entity).
        # User models can only use built-in tokens from the token providers configured here.
        #
        # Supported values:
        # * 'nlpcraft' - Built-in NLPCraft tokens. Token IDs start with 'nlpcraft:'.
        # * 'opennlp' - Apache OpenNLP (https://opennlp.apache.org). Token IDs start with 'opennlp:'.
        # * 'stanford' - Stanford CoreNLP (https://stanfordnlp.github.io/CoreNLP). Token IDs start with 'stanford:'.
        # * 'google' - Google Natural Language (https://cloud.google.com/natural-language). Token IDs start with 'google:'.
        # * 'spacy' - Python NLP Library (https://spacy.io). Token IDs start with 'spacy:'.
        #
        # DO NOT confuse these token providers with underlying NLP engine ('opnenlp' or 'stanford').
        # NLP engine is used only for the basic NLP processing such as tokenization, lemmatization, etc.
        # NLP engines and supported token providers can be mixed and matched, i.e. 'stanford' NLP engine
        # can be used with 'google' and 'opennlp' token providers.
        #
        # See Integrations section (https://nlpcraft.apache.org/integrations.html) for details on how to
        # configure 3rd party token providers.
        # By default - only NLPCraft tokens are enabled and can be used by the user data models.
        tokenProviders = "nlpcraft"

        # If Spacy is enabled as a token provider (value 'spacy') - defines Spacy proxy URL.
        # spacy.proxy.url=http://localhost:5002

        # 'ctxword' server endpoint URL.
        ctxword.url="http://localhost:5000"
    }

    # Basic NLP toolkit to use on both server and probes. Possible values:
    # - 'opennlp'
    # - 'stanford'
    #
    # NOTE: Stanford CoreNLP requires special installation due to its licensing.
    # See https://nlpcraft.apache.org/integrations.html#stanford for more details.
    nlpEngine = "opennlp"

    # External configuration resources.
    #
    # NOTE:
    # ----
    # Due to licensing restrictions of the official ASF release policy some of the
    # configuration for NLPCraft cannot be shipped with the official Apache release.
    # Instead, NLPCraft will attempt to download these configuration files from the
    # external URL upon the first start.
    #
    # NLPCraft will attempt to download the missing configuration files from URL defined
    # in 'nlpcraft.extConfig.extUrl' property and place them into 'nlpcraft.extConfig.locDir'
    # folder on the local file system. On subsequent starts, NLPCraft will check if the required
    # file is already present locally and skip the download in such case. If 'nlpcraft.extConfig.checkMd5'
    # property is set to 'true' then on each start NLPCraft will check the checksum of each file
    # locally and remote and will re-download such file if the MD5 checksums don't match.
    #
    # By default, the external configuration is stored in the main Git repository for NLPCraft
    # project from where it will be downloaded ('/external' folder). See this folder in the Git
    # repository for more information: https://github.com/apache/incubator-nlpcraft/tree/master/external
    extConfig {
        # Mandatory.
        extUrl = "https://github.com/apache/incubator-nlpcraft/raw/master/external"

        # Optional.
        # Default value is $USER_HOME/.nlpcraft/extcfg
        # locDir = ...

        # If 'true', on each start NLPCraft will check the MD5 checksum of the each local and remote
        # external configuration file and will re-download such file if the checksum doesn't match.
        # Set it to 'false' to speed up the bootstrap of the NLPCraft server and the data probe if you
        # are certain that all external configuration files are properly downloaded and available
        # in 'nlpcraft.extConfig.locDir' local folder.
        checkMd5 = true
    }

    # +---------------------+
    # | Probe configuration. |
    # +---------------------+
    probe {
        # Any arbitrary descriptive name.
        id = "all.examples"

        # This is the default token (as in default company).
        # Note that this token must match the probe token for the company this probe
        # associated with. If changed from default, this token must be kept secure.
        token = "3141592653589793"

        # These are default up-link and down-link endpoints that the probe will connect to.
        # If changed - they need to be changed on both server and probe.
        upLink = "0.0.0.0:8201"   # Server to probe data pipe.
        downLink = "0.0.0.0:8202" # Probe to server data pipe.

        # All JARs in this folder will be scanned for models.
        # Safely ignored if 'null' - but then 'models' should have at least one element.
        jarsFolder = null

        # Specifies fully qualifies model class names for the probe to start with.
        #
        # Note that following models require 'google' on the server side.
        # See https://nlpcraft.apache.org/integrations.html#nlp for more details
        # on how to configure 3rd party token providers:
        # - "org.apache.nlpcraft.examples.phone.PhoneModel"
        models =
            """org.apache.nlpcraft.examples.alarm.AlarmModel,
            org.apache.nlpcraft.examples.echo.EchoModel,
            org.apache.nlpcraft.examples.helloworld.HelloWorldModel,
            org.apache.nlpcraft.examples.time.TimeModel,
            org.apache.nlpcraft.examples.weather.WeatherModel,
            org.apache.nlpcraft.examples.lightswitch.LightSwitchModel"""


        # Specify class names for probe life cycle components.
        # Each class should extend 'NCProbeLifecycle' interface and provide a no-arg constructor.
        #
        # The following built-in OpenCensus exporters are supported as lifecycle components:
        # - org.apache.nlpcraft.model.opencensus.NCJaegerExporter (traces)
        # - org.apache.nlpcraft.model.opencensus.NCZipkinExporter (traces)
        # - org.apache.nlpcraft.model.opencensus.NCPrometheusExporter (stats)
        # - org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter (traces)
        # - org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter (stats)
        lifecycle = ""

        # Properties for built-in OpenCensus exporters.
        # All configuration properties are optional unless otherwise specified.
        # opencensus {
        #     jaeger {
        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
        #         serviceName = "nlpcraft-probe"
        #     }
        #     prometheus {
        #         hostPort = "localhost:8889"
        #         namespace = "nlpcraft-probe"
        #     }
        #     stackdriver {
        #         # Mandatory Google project ID.
        #         googleProjectId = "your_google_project_id"
        #         metricsPrefix = "custom.googleapis.com/nlpcraft/probe"
        #     }
        #     zipkin {
        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
        #         serviceName = "nlpcraft-probe"
        #     }
        # }

        # Maximum execution result size in bytes. Default value is 1M.
        # When exceeded the request will be automatically rejected.
        resultMaxSizeBytes = 1048576
    }
}
