use strict;
use warnings;

use Test::More tests => 16;
use Data::Dumper;

use_ok 'Rex::CMDB';
use_ok 'Rex::Commands';
use_ok 'Rex::Commands::File';

Rex::Commands->import;
Rex::CMDB->import;

set(
  cmdb => {
    type => "YAML",
    path => "t/cmdb",
  }
);

my $ntp = get( cmdb( "ntp", "foo" ) );
ok( $ntp->[0] eq "ntp1" && $ntp->[1] eq "ntp2",
  "got something from default.yml" );

my $name = get( cmdb( "name", "foo" ) );
is( $name, "foo", "got name from foo.yml" );

my $dns = get( cmdb( "dns", "foo" ) );
ok( $dns->[0] eq "1.1.1.1" && $dns->[1] eq "2.2.2.2",
  "got dns from env/default.yml" );

my $vhost = get( cmdb( "vhost", "foo" ) );
ok( $vhost->{name} eq "foohost" && $vhost->{doc_root} eq "/var/www",
  "got vhost from env/foo.yml" );

$ntp = undef;
$ntp = get( cmdb("ntp") );
ok( $ntp->[0] eq "ntp1" && $ntp->[1] eq "ntp2",
  "got something from default.yml" );

$dns = undef;
$dns = get( cmdb("dns") );
ok( $dns->[0] eq "1.1.1.1" && $dns->[1] eq "2.2.2.2",
  "got dns from env/default.yml" );

my $all = get( cmdb( undef, "foo" ) );
is( $all->{ntp}->[0], "ntp1",    "got ntp1 from cmdb - all request" );
is( $all->{dns}->[1], "2.2.2.2", "got dns2 from cmdb - all request" );
is( $all->{vhost}->{name}, "foohost",
  "got vhost name from cmdb - all request" );
is( $all->{name}, "foo", "got name from cmdb - all request" );

Rex::Config->set_register_cmdb_template(1);
my $content = 'Hello this is <%= $::name %>';
is(
  template( \$content, __no_sys_info__ => 1 ),
  "Hello this is defaultname",
  "get keys from CMDB"
);

is(
  template( \$content, { name => "baz", __no_sys_info__ => 1 } ),
  "Hello this is baz",
  "overwrite keys from CMDB"
);

set(
  cmdb => {
    type           => "YAML",
    path           => "t/cmdb",
    merge_behavior => 'LEFT_PRECEDENT',
  }
);

my $foo_all = get( cmdb( undef, "foo" ) );

is_deeply(
  $foo_all,
  {
    'ntp'    => [ 'ntp1',            'ntp2' ],
    'newntp' => [ 'ntpdefaultfoo01', 'ntpdefaultfoo02', 'ntp1', 'ntp2' ],
    'dns'    => [ '1.1.1.1',         '2.2.2.2' ],
    'vhost' => {
      'name'     => 'foohost',
      'doc_root' => '/var/www'
    },
    'name'   => 'foo',
    'vhost2' => {
      'name'     => 'vhost2foo',
      'doc_root' => '/var/www'
    },
    'users' => {
      'root' => {
        'password' => 'proot',
        'id'       => '0'
      },
      'user02' => {
        'password' => 'puser02',
        'id'       => '600'
      },
      'user01' => {
        'password' => 'puser01',
        'id'       => '500'
      }
    }
  },
  "DeepMerge CMDB"
);
