use Test::More;
use strict; use warnings;

use Path::Tiny;
use Try::Tiny;

my $this_class = 'Bot::Cobalt::Logger';

my $test_log_path = Path::Tiny->tempfile(CLEANUP => 1);

use_ok( $this_class );

eval {; $this_class->new };
ok $@, 'new() with no args dies';

eval {;  $this_class->new(level => 'abcd') };
ok $@, 'new() with invalid level arg dies';

my $logobj = new_ok( $this_class => [
    level => 'info',
  ],
);

## We're in 'info', shouldn't log debug.
ok( ! $logobj->_should_log('debug'), 'should not log debug()' );
ok( $logobj->_should_log('info'), 'should log info()' );
ok( $logobj->_should_log('warn'), 'should log warn()' );
ok( $logobj->_should_log('error'), 'should log error()' );

## Reset level()
ok( $logobj->set_level('warn'), 'set_level warn' );
ok( $logobj->level eq 'warn', 'level is warn' );
ok( ! $logobj->_should_log('info'), 'should not log info()' );

## Manipulate output() object

isa_ok( $logobj->output, 'Bot::Cobalt::Logger::Output' );
ok(
  $logobj->output->add(
    myfile => {
      type => 'File',
      file => $test_log_path,
    },
  ),
  'add() file output class'
);

can_ok( $logobj,
  qw/
    debug
    info
    warn
    error
  /,
);

ok( $logobj->set_level('debug'), 'set_level debug' );
ok( $logobj->debug("Testing", "debug"), 'debug()' );
ok( $logobj->info("Testing", "info"), 'info()' );
ok( $logobj->warn("Testing", "warn"), 'warn()' );
ok( $logobj->error("Testing", "error"), 'error()' );

my $contents = do { local (@ARGV, $/) = $test_log_path ; <> };

cmp_ok( split(/\n/, $contents), '==', 4, 'logfile has expected line count' );

unlink $test_log_path;

## FIXME
##  test caller details
##  test log_format / time_format triggers and constructor opts
##   (output obj's settings should change also)

done_testing