use strict;
use warnings;

use lib 't/lib';

use Test::More tests => 11;
use Data::Dumper;
use Footprintless::ExtendedTestFactory;
use File::Basename;
use File::Spec;

BEGIN {
    # Clear out the env vars to prevent failures due to automatic configuration
    # with invalid env vars (ex: FPL_CONFIG_PROPS=:/foo/bar)
    $ENV{FPL_CONFIG_DIRS}  = "";
    $ENV{FPL_CONFIG_PROPS} = "";
    use_ok('Footprintless');
}

eval {
    require Getopt::Long;
    Getopt::Long::Configure( 'pass_through', 'bundling' );
    my $level = 'error';
    Getopt::Long::GetOptions( 'log:s' => \$level );

    require Log::Any::Adapter;
    Log::Any::Adapter->set( 'Stdout',
        log_level => Log::Any::Adapter::Util::numeric_level($level) );
};

my $logger = Log::Any->get_logger();

my $test_dir = dirname( File::Spec->rel2abs($0) );

my ($fpl);

ok( $fpl = Footprintless->new(
        config_dirs            => File::Spec->catdir( $test_dir,  'config/entities' ),
        config_properties_file => File::Spec->catfile( $test_dir, 'config/credentials.pl' )
    ),
    'load data/entities'
);

ok( $fpl->entities()->{dev}, 'root is dev' );

ok( $fpl = Footprintless->new( entities => { foo => 'bar' } ), 'entities hashref' );
is( $fpl->entities()->{foo}, 'bar', 'entities hashref foo is bar' );

ok( $fpl =
        Footprintless->new( entities => Config::Entities->new( { entity => { foo => 'bar' } } ) ),
    'entities Config::Entities'
);
is( $fpl->entities()->{foo}, 'bar', 'entities Config::Entities foo is bar' );

my $extended_footprintless =
    Footprintless->new( factory => Footprintless::ExtendedTestFactory->new() );
ok( $extended_footprintless, 'extended footprintless' );
is( $extended_footprintless->foo('bar'), 'bar', 'extended footprintless foobar' );

$extended_footprintless =
    Footprintless->new(
    entities => { footprintless => { factory => 'Footprintless::ExtendedTestFactory' } } );
ok( $extended_footprintless, 'extended footprintless.factory' );
is( $extended_footprintless->foo('bar'), 'bar', 'extended fpl.factory foobar' );