#!/usr/bin/perl
# Copyright © 2018, Bradley M. Kuhn
#   License: AGPL-3.0-or-later

use strict;
use warnings;

use autodie qw(:all);

use Getopt::Long;
use File::Spec;
use Date::Manip qw(ParseDate UnixDate);

my($VERBOSE, $INTERACTIVE, $RT_CMD, $SVN_CMD);

###############################################################################
sub TicketIDsReadyForPayment () {
  my @ticketSpecs;
  open(my $rtLsFH, "-|", "$RT_CMD", "ls", "-i", "Status = 'ready-for-payment'");
  print "Running: rt ls -i Status=ready-for-payment\n" if ($VERBOSE >= 10);
  while (my $lsLine = <$rtLsFH>) {
    print "rt ls line from Ready for payment search: $lsLine" if ($VERBOSE >= 10);
    chomp $lsLine;
    next if $lsLine =~ /^\s*$/;   # There are sometimes blank lines in the rt ls -i output,
    push(@ticketSpecs, $lsLine);  # particularly with 0 results, and no empty strings go on this list
  }
  print "Done: rt ls -i Status=ready-for-payment\n" if ($VERBOSE >= 10);
  close $rtLsFH;
  return @ticketSpecs;
}
###############################################################################
sub FindMostRecentPaymentMethodForTicket ($) {
  my($ticketSpec) = @_;
  my $paymentMethod;
  $ticketSpec =~ s%^\s*ticket\s*/\s*%%;
  open(my $rtShowFH, "-|", "$RT_CMD", "show", $ticketSpec);
  while (my $showLine = <$rtShowFH>) {
    print STDERR "rt show line for $ticketSpec: $showLine" if ($VERBOSE >= 10);
    $paymentMethod = lc($1)
      if ($showLine =~ /^\s*PAYMENT\s+METHOD\s*:\s*(.*?)\s*$/);
    # don't 'last' when found as we want the last one.
  }
  close $rtShowFH;
  return $paymentMethod;
}
###############################################################################

GetOptions("verbose=i" => \$VERBOSE, "interactive" => \$INTERACTIVE,
           "rtCommand=s" => \$RT_CMD, "svnCommand=s" => \$SVN_CMD);

$RT_CMD = '/usr/bin/rt' unless defined $RT_CMD;
$SVN_CMD = '/usr/bin/svn' unless defined $SVN_CMD;

$INTERACTIVE = 0 if not defined $INTERACTIVE;

my @ticketSpecs = TicketIDsReadyForPayment();

if (@ticketSpecs <= 0) {
  print "No tickets found that are ready for payment at this time\n";
  exit 0;
}

my %payments;
foreach my $ticketSpec (@ticketSpecs) {
  my $paymentMethod = FindMostRecentPaymentMethodForTicket($ticketSpec);
  print STDERR "$ticketSpec has payment method of $paymentMethod\n" if ($VERBOSE > 6);
  if (not defined $paymentMethod) {
    warn "Cannot find payment method for ticket, $ticketSpec";
    $paymentMethod = "UNKNOWN PAYMENT METHOD";
  }
  push(@{$payments{$paymentMethod}}, $ticketSpec);
}
foreach my $paymentMethod (sort { $a cmp $b } keys %payments) {
  print "$paymentMethod: Count: ", scalar(@{$payments{$paymentMethod}}), "\n";
  print "     Tickets: ", join(", ", map { s%^\s*ticket\s*/\s*%%; $_; } @{$payments{$paymentMethod}}), "\n";
}
###############################################################################
#
# Local variables:
# compile-command: "perl -c rt-bulk-prep-pay.plx"
# perl-indent-level: 2
# End: