package App::Midgen::Role::Output::Infile;

use constant {
	BLANK => q{ }, 
	NONE => q{}, 
	THREE => 3, 
	EIGHT => 8, 
	NINE => 9,
	TEN => 10
};

use Moo::Role;
requires qw( core dual_life debug );
use Try::Tiny;

# Load time and dependencies negate execution time
# use namespace::clean -except => 'meta';

our $VERSION = '0.30';
$VERSION = eval $VERSION;    ## no critic

use English qw( -no_match_vars );
local $OUTPUT_AUTOFLUSH = 1;

use Term::ANSIColor qw( :constants colored );
use Data::Printer {caller_info => 1, colored => 1,};
use File::Spec;

#######
# header_infile
#######
sub header_infile {
	my $self = shift;

	print qq{\n};

	return;
}
#######
# body_infile
#######
sub body_infile {
	my $self = shift;

	return;
}
#######
# footer_infile
#######
sub footer_infile {
	my $self = shift;

	p $self->{modules} if $self->debug;

	# Let's work out our padding
	my $pm_length  = 0;
	my $dir_length = 0;
	foreach my $module_name (sort keys %{$self->{modules}}) {

		if (length $module_name > $pm_length) {
			$pm_length = length $module_name;
		}
		try {
			foreach my $foundin (sort @{$self->{modules}{$module_name}{infiles}}) {
				if (length $foundin->[0] > $dir_length) {
					$dir_length = length $foundin->[0];
				}
			}
		};

	}

	print "  "
		. "-" x $pm_length
		. "-" x EIGHT
		. "-" x TEN
		. "-" x $dir_length
		. "-" x TEN . "\n";


	printf " | %-*s | %-*s | %-*s | %-*s |\n", $pm_length, 'Module', EIGHT,
		'Version ', EIGHT, 'Installed', $dir_length, 'Found in';
	print "  "
		. "-" x $pm_length
		. "-" x EIGHT
		. "-" x TEN
		. "-" x $dir_length
		. "-" x TEN . "\n";


	foreach my $module_name (sort keys %{$self->{modules}}) {

		# honnor options dual-life and core module display
		if ($self->core) {

			# do nothing
		}
		elsif ($self->dual_life) {
			next
				if ($self->{modules}{$module_name}{corelist}
				and not $self->{modules}{$module_name}{dual_life});
		}
		else {
			next if $self->{modules}{$module_name}{corelist};
		}

		try {
			foreach my $foundin (sort @{$self->{modules}{$module_name}{infiles}}) {
				my $dir_relative = $foundin->[0];
				$dir_relative =~ s{^/}{};
				printf " | %-*s | %-*s | %-*s | %-*s |\n", $pm_length, $module_name,
					EIGHT, $foundin->[1], NINE, $self->in_local_lib($module_name),
					$dir_length, $dir_relative,;
			}
		};
	}

	print "  "
		. "-" x $pm_length
		. "-" x EIGHT
		. "-" x TEN
		. "-" x $dir_length
		. "-" x TEN . "\n";

	print qq{\n};

	return;
}

no Moo;

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

App::Midgen::Role::Output::Infile - Modules and files they were found in,
used by L<App::Midgen>

=head1 VERSION

version: 0.30

=head1 DESCRIPTION

This output format list modules found against the files they were Included in.

=head1 METHODS

=over 4

=item * header_infile

=item * body_infile

=item * footer_infile

=back

=head1 DEPENDENCIES

L<Term::ANSIColor>

=head1 SEE ALSO

L<App::Midgen>

=head1 AUTHOR

See L<App::Midgen>

=head2 CONTRIBUTORS

See L<App::Midgen>

=head1 COPYRIGHT

See L<App::Midgen>

=head1 LICENSE

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut
