#!/usr/bin/perl

# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <https://www.gnu.org/licenses>.

use Modern::Perl;

use Test::NoWarnings;
use Test::More tests => 5;
use FindBin qw($Bin $Script);

use_ok('Koha::Config');

my $config_filepath = "$Bin/../data/koha-conf.xml";

subtest 'read_from_file() tests' => sub {
    plan tests => 3;

    is(
        Koha::Config->read_from_file(undef), undef,
        "Undef parameter makes function return undef"
    );

    my $got      = eval { Koha::Config->read_from_file($config_filepath) };
    my $expected = {
        'listen' => {
            'biblioserver' => {
                'content' => 'unix:/home/koha/var/run/zebradb/bibliosocket',
            },
            'authorityserver' => {
                'content' => 'unix:/home/koha/var/run/zebradb/authoritysocket',
            },
        },
        'server' => {
            'biblioserver' => {
                'listenref'  => 'biblioserver',
                'directory'  => '/home/koha/var/lib/zebradb/biblios',
                'config'     => '/home/koha/etc/zebradb/zebra-biblios-dom.cfg',
                'cql2rpn'    => '/home/koha/etc/zebradb/pqf.properties',
                'xi:include' => [
                    {
                        'href'     => '/home/koha/etc/zebradb/retrieval-info-bib-dom.xml',
                        'xmlns:xi' => 'http://www.w3.org/2001/XInclude'
                    },
                    {
                        'xmlns:xi' => 'http://www.w3.org/2001/XInclude',
                        'href'     => '/home/koha/etc/zebradb/explain-biblios.xml'
                    }
                ],
            },
            'authorityserver' => {
                'listenref'  => 'authorityserver',
                'directory'  => '/home/koha/var/lib/zebradb/authorities',
                'config'     => '/home/koha/etc/zebradb/zebra-authorities-dom.cfg',
                'cql2rpn'    => '/home/koha/etc/zebradb/pqf.properties',
                'xi:include' => [
                    {
                        'xmlns:xi' => 'http://www.w3.org/2001/XInclude',
                        'href'     => '/home/koha/etc/zebradb/retrieval-info-auth-dom.xml'
                    },
                    {
                        'href'     => '/home/koha/etc/zebradb/explain-authorities.xml',
                        'xmlns:xi' => 'http://www.w3.org/2001/XInclude'
                    }
                ],
            },
        },
        'serverinfo' => {
            'biblioserver' => {
                'ccl2rpn'  => '/home/koha/etc/zebradb/ccl.properties',
                'user'     => 'kohauser',
                'password' => 'zebrastripes',
            },
            'authorityserver' => {
                'ccl2rpn'  => '/home/koha/etc/zebradb/ccl.properties',
                'user'     => 'kohauser',
                'password' => 'zebrastripes',
            }
        },
        'config' => {
            'db_scheme'             => 'mysql',
            'database'              => 'koha',
            'hostname'              => 'localhost',
            'port'                  => '3306',
            'user'                  => 'kohaadmin',
            'pass'                  => 'katikoan',
            'tls'                   => 'no',
            'ca'                    => '',
            'cert'                  => '',
            'key'                   => '',
            'biblioserver'          => 'biblios',
            'biblioservershadow'    => '1',
            'authorityserver'       => 'authorities',
            'authorityservershadow' => '1',
            'pluginsdir'            => '/home/koha/var/lib/plugins',
            'enable_plugins'        => '0',
            'upload_path'           => '',
            'tmp_path'              => '',
            'intranetdir'           => '/home/koha/src',
            'opacdir'               => '/home/koha/src/opac',
            'opachtdocs'            => '/home/koha/src/koha-tmpl/opac-tmpl',
            'intrahtdocs'           => '/home/koha/src/koha-tmpl/intranet-tmpl',
            'includes'              => '/home/koha/src/koha-tmpl/intranet-tmpl/prog/en/includes/',
            'logdir'                => '/home/koha/var/log',
            'docdir'                => '/home/koha/doc',
            'backupdir'             => '/home/koha/var/spool',
            'mana_config'           => 'https://mana-kb.koha-community.org',
            'backup_db_via_tools'   => '0',
            'backup_conf_via_tools' => '0',
            'install_log'           => '/home/koha/misc/koha-install-log',
            'useldapserver'         => '1',
            'ldapserver'            => {
                ldapserver => {
                    hostname => 'ldap://another_ldap_server:389',
                    user     => 'user',
                    pass     => 'password',
                    mapping  => { firstname => { is => 'givenName' } }
                }
            },
            'useshibboleth' => '0',
            'shibboleth'    => {
                'autocreate' => '1',
                'matchpoint' => 'userid',
                'mapping'    => {
                    'userid'       => { 'is'      => 'uid' },
                    'branchcode'   => { 'content' => 'MAIN', 'is' => 'MAIN' },
                    'categorycode' => { 'content' => 'STAFF' },
                },
            },
            'zebra_lockdir'         => '/home/koha/var/lock/zebradb',
            'lockdir'               => '__LOCK_DIR__',
            'use_zebra_facets'      => '1',
            'zebra_max_record_size' => '1024',
            'log4perl_conf'         => '/home/koha/etc/log4perl.conf',
            'memcached_servers'     => '127.0.0.1:11211',
            'memcached_namespace'   => 'KOHA',
            'template_cache_dir'    => '/tmp/koha',
            'api_secret_passphrase' => 'CHANGEME',
            'access_dirs'           => {
                access_dir => [ '/dir_1', '/dir_2' ],
            },
            'ttf' => {
                'font' => [
                    {
                        'type'    => 'TR',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf',
                    },
                    {
                        'type'    => 'TB',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf',
                    },
                    {
                        'type'    => 'TI',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSerif-Italic.ttf',
                    },
                    {
                        'type'    => 'TBI',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSerif-BoldItalic.ttf',
                    },
                    {
                        'type'    => 'C',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf',
                    },
                    {
                        'type'    => 'CB',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf',
                    },
                    {
                        'type'    => 'CO',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Oblique.ttf',
                    },
                    {
                        'type'    => 'CBO',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSansMono-BoldOblique.ttf',
                    },
                    {
                        'type'    => 'H',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf',
                    },
                    {
                        'type'    => 'HO',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSans-Oblique.ttf',
                    },
                    {
                        'type'    => 'HB',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf',
                    },
                    {
                        'type'    => 'HBO',
                        'content' => '/usr/share/fonts/truetype/dejavu/DejaVuSans-BoldOblique.ttf',
                    },
                ],
            },
            'sms_send_config'    => '/home/koha/etc/sms_send/',
            'plack_max_requests' => '50',
            'plack_workers'      => '2',
            'elasticsearch'      => {
                'server' => [
                    'localhost:9200',
                ],
                'index_name' => 'koha_master',
                'cxn_pool'   => 'Static',
            },
            'interlibrary_loans' => {
                'backend_directory' => '/home/koha/src/Koha/Illbackends',
                'branch'            => {
                    'code'   => 'CPL',
                    'prefix' => 'ILL',
                },
                'staff_request_comments' => 'hide',
                'reply_date'             => 'hide',
                'digital_recipient'      => 'branch',
            },
            'timezone'           => '',
            'bcrypt_settings'    => '__BCRYPT_SETTINGS__',
            'encryption_key'     => '__ENCRYPTION_KEY__',
            'git_install'        => '0',
            'strict_sql_modes'   => '0',
            'plugin_repos'       => '',
            'koha_xslt_security' => '',
            'smtp_server'        => {
                'host'      => 'localhost',
                'port'      => '25',
                'timeout'   => '120',
                'ssl_mode'  => 'disabled',
                'user_name' => '',
                'password'  => '',
                'debug'     => '0',
            },
            'message_broker' => {
                'hostname' => 'localhost',
                'port'     => '61613',
                'username' => 'guest',
                'password' => 'guest',
                'vhost'    => '',
            },
        },
    };
    is_deeply( $got, $expected, 'File read correctly' );

    # Reading a Perl script as XML should fail hopefully
    eval { Koha::Config->read_from_file("$Bin/$Script") };
    like( $@, qr{.*Error reading file.*}, 'File failing to read raises warning' );
};

subtest 'get_instance' => sub {
    plan tests => 3;

    my $config = Koha::Config->get_instance($config_filepath);
    isa_ok( $config, 'Koha::Config', 'get_instance returns a Koha::Config object' );
    my $same_config = Koha::Config->get_instance($config_filepath);
    is( $config, $same_config, '2nd call to get_instance returns the same object' );

    local $ENV{KOHA_CONF} = $config_filepath;
    my $default_config = Koha::Config->get_instance;
    is( $default_config, $config, 'get_instance without parameters reads $KOHA_CONF' );
};

subtest 'get' => sub {
    plan tests => 7;

    my $config = Koha::Config->get_instance($config_filepath);

    is_deeply(
        $config->get( 'biblioserver', 'listen' ),
        { content => 'unix:/home/koha/var/run/zebradb/bibliosocket' },
    );

    is_deeply(
        $config->get( 'biblioserver', 'server' ),
        {
            'listenref'  => 'biblioserver',
            'directory'  => '/home/koha/var/lib/zebradb/biblios',
            'config'     => '/home/koha/etc/zebradb/zebra-biblios-dom.cfg',
            'cql2rpn'    => '/home/koha/etc/zebradb/pqf.properties',
            'xi:include' => [
                {
                    'href'     => '/home/koha/etc/zebradb/retrieval-info-bib-dom.xml',
                    'xmlns:xi' => 'http://www.w3.org/2001/XInclude'
                },
                {
                    'xmlns:xi' => 'http://www.w3.org/2001/XInclude',
                    'href'     => '/home/koha/etc/zebradb/explain-biblios.xml'
                }
            ],
        },
    );

    is_deeply(
        $config->get( 'biblioserver', 'serverinfo' ),
        {
            'ccl2rpn'  => '/home/koha/etc/zebradb/ccl.properties',
            'user'     => 'kohauser',
            'password' => 'zebrastripes',
        },
    );

    is( $config->get('db_scheme'), 'mysql' );
    is( $config->get('ca'),        '' );

    is( $config->get('unicorn'), undef, 'returns undef if key does not exist' );
    is_deeply( [ $config->get('unicorn') ], [undef], 'returns undef even in list context' );
};
