#!/usr/bin/perl

package App::term::hr;
use vars qw($VERSION);

my  $APP = 'hr';
$VERSION = '0.11';

use strict;
use warnings;

use utf8;

use Pod::Usage;

use Getopt::Long        qw(GetOptions);
Getopt::Long::Configure('bundling_override');

use Term::ExtendedColor qw(fg bg bold);


#< options
my %opt  = (
  char  => '=',
  size  => undef,
  pre   => 0,
  post  => 0,
);

my $attributes = '';
GetOptions(
  'c|char:s'    => \$opt{char},
  's|size:i'    => \$opt{size},
  'pre:i'       => \$opt{pre},
  'post:i'      => \$opt{post},

  'fg:i'        => sub {
    $attributes .= ($attributes !~ m/^$/)
      ? ";38;5;$_[1]"
      : "38;5;$_[1]"
  },

  'bg:i'        => sub {
    $attributes .= ($attributes !~ m/^$/)
      ? ";48;5;$_[1]"
      : "48;5;$_[1]"
  },

  'b|bold'      => sub {
    $attributes .= ($attributes !~ m/^$/)
      ? ";1"
      : "38;5;1"
  },

  'i|italic'    => sub {
    $attributes .= ($attributes !~ m/^$/)
      ? ";3"
      : "3"
  },

  'u|underline' => sub {
    $attributes .= ($attributes !~ m/^$/)
      ? ";4"
      : "4"
  },
  'r|reverse'   => sub {
    $attributes .= ($attributes !~ m/^$/)
      ? ";7"
      : "7"
  },

  'h|help'    => sub { pod2usage(verbose => 1); },
  'm|man'     => sub { pod2usage(verbose => 3); },
  'v|version' => sub { printf "%s v%s\n", $APP, $VERSION; exit },
);
#>


hr();


sub hr {
  my $char = shift // $opt{char};

  my $hr = sprintf "%s%s%s",
     ' ' x $opt{pre},
     $char x columns(),
     ' ' x $opt{post};

  if($attributes !~ m/^$/) {
    $hr = color($hr, $attributes);
    print $hr;
  }

  else {
    print $hr;
#    print $char x columns();
  }
  print "\n";
}

sub columns {
  return $opt{size} if defined($opt{size});
  my $width = 80; # sane default


  if(defined $ENV{COLUMNS}) {
    $width = $ENV{COLUMNS};
  }
  elsif(eval { require Term::Size; 1 }) {
    ($width, undef) = Term::Size::chars();
  }

  $width = ($width - ($opt{pre} + $opt{post}));

  return $width;
}

sub color {
  my $str    = shift;
  my $colors = shift;
  return fg($colors, $str);
}


=head1 NAME

hr - define a thematic change in the content of a terminal session

=head1 SYNOPSIS

  hr [OPTIONS]

=head1 DESCRIPTION

hr prints a horisontal bar in your terminal. Useful when you run a
chain of commands that might produce a lot of output and you need to
differentiate where a given output is coming from.


=head1 OPTIONS

  -c,    --char       Character to use
  -s,    --size       Number of columns
  -pre,  --pre        Pad the left side with whitespace n
  -post, --post       Pad the right side with whitespace n
  -fg,   --fg         Foreground color to use, int 0-255
  -bg,   --bg         Background color to use, int 0-255
  -b,    --bold       Use bold
  -i,    --italic     Use italics
  -u,    --underline  Use underline
  -r,    --reverse    Use reverse video

  -h,    --help       Display this help and exit
  -m,    --man        Display the manual and exit
  -v,    --version    Display version info and exit

=head1 EXAMPLES

    # display a yellow underlined bar using the default '=' character
    hr -fg 220 --underline

    # display a red solid bar padded by 10 columns from right and left
    hr -fg 160 -c ▀ --pre 10 --post 10

    # display a solid grey, thick bar using ascii character _ and the bold,
    # underline and reverse video attributes

    hr -fg 240 -c_ -bur

    # display a bar made of dots, with 5 column spacing one each size
    # and 20 columns wide.

    hr -fg 197 -c· -pre 5 -post 5 -size 20

    # use all options at once, because why not?
    hr -c ! -fg 52 -bg 196 -biur -s 70 -pre 5 -post 5

    # use several characters to form a bar using arithmetics
    hr -c "  japh  " -fg 1 -bg 0 -b -s $(($COLUMNS / 8))


=head1 AUTHOR

  Magnus Woldrich
  CPAN ID: WOLDRICH
  m@japh.se
  http://japh.se
  http://github.com/trapd00r

=head1 COPYRIGHT

Copyright 2019 B<THIS APPLICATION>s L</AUTHOR> and L</CONTRIBUTORS> as listed
above.

=head1 LICENSE

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

=cut