package TAP::Formatter::Pretty::Multi;
use strict;
use warnings;
use utf8;

use TAP::Formatter::Base ();
use POSIX qw(strftime);
use parent qw(TAP::Formatter::Base);

sub open_test {
    my ( $self, $test, $parser ) = @_;

    my $class
      = $self->jobs > 1
      ? 'TAP::Formatter::Console::ParallelSession'
      : 'TAP::Formatter::Pretty::Multi::Session';

    eval "require $class"; ## no critic.
    $self->_croak($@) if $@;

    my $session = $class->new(
        {   name       => $test,
            formatter  => $self,
            parser     => $parser,
            show_count => $self->show_count,
        }
    );

    $session->header;

    return $session;
}

sub _set_colors {
    my ( $self, @colors ) = @_;
    if ( my $colorizer = $self->_colorizer ) {
        my $output_func = $self->{_output_func} ||= sub {
            $self->_output(@_);
        };
        $colorizer->set_color( $output_func, $_ ) for @colors;
    }
}

sub _output_success {
    my ( $self, $msg ) = @_;
    $self->_set_colors('green');
    $self->_output($msg);
    $self->_set_colors('reset');
}

sub _failure_output {
    my $self = shift;
    $self->_set_colors('red');
    my $out = join '', @_;
    my $has_newline = chomp $out;
    $self->_output($out);
    $self->_set_colors('reset');
    $self->_output($/)
      if $has_newline;
}

sub _format_name {
    my ( $self, $test ) = @_;
    my $name = $test;
    my $periods = '=' x (( $self->_longest + 2 - length $test ));

    $self->_output("\n");
    $self->_set_colors('yellow');
    if ($self->timer) {
        my $stamp = $self->_format_now();
        $self->_set_colors('green');
        $self->_output("$stamp ");
        $self->_set_colors('yellow');
    }
    $self->_output("==> ");
    $self->_set_colors('cyan');
    $self->_output("$name");
    $self->_set_colors('yellow');
    $self->_output(" <$periods\n");
    $self->_set_colors('reset');

    return ''; # as pretty format name has already been written
}

1;

