# Copyrights 2007-2021 by [Mark Overmeer <markov@cpan.org>].
#  For other contributors see ChangeLog.
# See the manual pages for details on the licensing terms.
# Pod stripped from pm file by OODoc 2.02.
# This code is part of distribution Log-Report. Meta-POD processed with
# OODoc into POD and HTML manual-pages.  See README.md
# Copyright Mark Overmeer.  Licensed under the same terms as Perl itself.

package Dancer2::Logger::LogReport;
use vars '$VERSION';
$VERSION = '1.31';

# ABSTRACT: Dancer2 logger engine for Log::Report

use strict;
use warnings;

use Moo;
use Dancer2::Core::Types;
use Scalar::Util qw/blessed/;
use Log::Report  'log-report', syntax => 'REPORT';

our $AUTHORITY = 'cpan:MARKOV';

my %level_dancer2lr =
  ( core  => 'TRACE'
  , debug => 'TRACE'
  );

with 'Dancer2::Core::Role::Logger';

# Set by calling function
has dispatchers =>
  ( is     => 'ro'
  , isa    => Maybe[HashRef]
  );

sub BUILD
{   my $self     = shift;
    my $configs  = $self->dispatchers || {default => undef};
    $self->{use} = [keys %$configs];

    dispatcher 'do-not-reopen';

    foreach my $name (keys %$configs)
    {   my $config = $configs->{$name} || {};
        if(keys %$config)
        {   my $type = delete $config->{type}
                or die "dispatcher configuration $name without type";

            dispatcher $type, $name, %$config;
        }
    }
}

around 'error' => sub {
    my ($orig, $self) = (shift, shift);

    # If it's a route exception (generated by Dancer) and we're also using the
    # Plugin, then the plugin will handle the exception using its own hook into
    # the error system. This should be able to removed in the future with
    # https://github.com/PerlDancer/Dancer2/pull/1287
    return if $_[0] =~ /^Route exception/
           && $INC{'Dancer2/Plugin/LogReport.pm'};

    $self->log(error => @_);
};


sub log   # no protoypes in Dancer2
{   my ($self, $level, $msg) = @_;

    my %options;
    # If only using the logger on its own (without the associated plugin), make
    # it behave like a normal Dancer logger
    unless ($INC{'Dancer2/Plugin/LogReport.pm'})
    {   $msg = $self->format_message($level, $msg);
        $options{is_fatal} = 0;
    }

    # the levels are nearly the same.
    my $reason = $level_dancer2lr{$level} || uc $level;

    report \%options, $reason => $msg;
    undef;
}
 
1;
