#!/usr/bin/env perl
use strict;
use warnings;

use Scalar::Util qw(reftype);
use Getopt::Long qw(GetOptions);
use List::Util qw(max);
use Data::Dumper;

my $DEBUG = $ENV{DEBUG} // 0;

sub dprint {
  print STDERR @_ unless $DEBUG == 0;
}

sub dprintf {
  printf STDERR @_ unless $DEBUG == 0;
}

my $count  = 2;
my $output;
my $delim = '\t';
my $help;

GetOptions(
    'count|c=i' => \$count,
    'output|o=s' => \$output,
    'delimiter|d=s' => \$delim,
    'help|h'     => \$help,
) or die "Error in command line arguments\n";

if ($help) {
    print <<"USAGE";
Usage:
  script.pl [-c COUNT] [-o OUTPUT] [input_files...]

Options:
  -c, --count   Integer count (default: 2)
  -d, --delimiter  Delimiter string (default: space)
  -o, --output  Output file (default: STDOUT)
  -h, --help    Show help

If no input files are provided, STDIN is used.
USAGE
    exit 0;
}

my @input_files = @ARGV;

my $IN;
if (@input_files) {
    open($IN, '-|', 'cat', @input_files)
        or die "Cannot open input files: $!";
} else {
    $IN = *STDIN;
}

my $OUT;
if (defined $output) {
    open($OUT, '>', $output)
        or die "Cannot open output file '$output': $!";
} else {
    $OUT = *STDOUT;
}

my @rows;
my @sizes;
my @maxes = (0) x $count;

my $inx = 0;

while (my $line = <$IN>) {
    chomp $line;

    my @row = split /$delim/, $line;
    my $len = scalar @row;

    die "$inx: $len != $count" if $len != $count;

    push @rows, \@row;

    for (my $i = 0; $i < $len; $i++) { 
      my $old = length($maxes[$i]) // -1;
      my $new = length($row[$i]) // -1;
      my $res = max(max($old, $new), $maxes[$i]);
      dprint "\tdumping $inx($i) as $res, $old, $new:\n";
      $maxes[$i] = $res;
    };

    $inx++;
}

dprint(Data::Dumper->Dump([\@rows, \@maxes, $count], ["rows", "maxes", "count"]));

for (my $i = 0; $i < $inx; $i++) {
  dprint "i:$i\n";
  my @row = @{$rows[$i]};
  map {
    dprint "\t($maxes[$_]) n: $_ ";
    my $txt = $row[$_];
    print pack("A".max($maxes[$_],(length $txt)), $txt);
    print " " unless $_ == $#maxes;
    dprint("\t", Data::Dumper->Dump([\@row, $row[$_]], ["row", "inxrow"])), "\n";
  } 0..$#maxes;
  print "\n";
}

close $IN if @input_files;
close $OUT if defined $output;
