# This is the base configuration file for Kalamar.
# Further configurations can override these values.
# To define a new configuration, create a file in the
# root folder of your application with the name like
#
#   kalamar.[MYNAME].conf
#
# To load the configuration, start your application with
# the environment variable
#
#   MOJO_MODE=[MYNAME]
#
# Further typical configurations in this file include
#
# - hypnotoad
#     See Mojo::Server::Hypnotoad
# - MailException
#     See Mojolicious::Plugin::MailException
# - TagHelpers-Pagination
#     See Mojolicious::Plugin::TagHelpers::Pagination
# - Search
#     See Mojolicious::Plugin::Search
# - Localize
#     See Mojolicious::Plugin::Localize
# - TagHelpers-ContentBlock
#     See Mojolicious::Plugin::TagHelpers::ContentBlock
# - CHI
#     See Mojolicious::Plugin::CHI

# For Plugins,
# - Piwik
#     See Mojolicious::Plugin::Piwik

# The default Kustvakt api endpoint
my $api = 'http://localhost:9999/api/';
{
  Search => {
    engine => 'Kalamar::API'
  },
  Kalamar => {
    # Backend server path
    api_path => $ENV{'KALAMAR_API'} // $api,

    # Backend API version
    # api_version => '1.0',

    # In case, the user management of Kustvakt
    # is used, make this a true value
    auth_support => 0,

    # The name of the base corpus,
    # for query examples (see kalamar.queries.dict)
    # examplecorpus => 'dereko'

    # For further Plugins, add them
    # to this array:
    # plugins => []
  },

  # See Mojolicious::Plugin::TagHelpers::MailToChiffre
  'TagHelpers-MailToChiffre' => {
    method_name => 'PArok',
    pattern_rotate => 673
  }
}
