#!/usr/bin/perl

use strict;
use warnings;

use Carp qw(confess);
use Data::Dumper;
use Date::Format;
use List::Util qw(shuffle);

use Ernad::Email;
use Ernad::IssueState;
use Ernad::ReportState;

my $impna=$ARGV[0] // '';
if(not defined($impna)) {
  print "fatal: I need the impna $impna\n";
  exit;
}

my $issue_count_trigger=$ARGV[1] // 3;
if(not $issue_count_trigger) {
  print "no issue_count_trigger\n";
  exit;
}

my $editor_inactive_days=$ARGV[2] // 2;
if(not $editor_inactive_days) {
  print "no editor_inactive_days\n";
  exit;
}

our $e=Ernad::Erimp->new({'impna'=>$impna});
if(not $e) {
  die "invalid impna $impna";
}

if($e->{'testing'}) {
  $issue_count_trigger=0;
  $editor_inactive_days=0;
}

my $start_tist=time;
my $date_path=time2str("%Y-%m-%d",$start_tist);
my $save_dir=$e->{'dir'}->{'web'}.'/edit_watch';
if(not -d $save_dir) {
  die "no such directory '$save_dir'";
}
my $day=24*60*60;

foreach my $repcode (shuffle $e->list_repcodes()) {
  ## This is a temporary check to skip the allport
  if(not $e->{'conf'}) {
    die "I need this here.";
  }
  ## this is temporary, as list_repcodes may have the allport
  if($repcode eq $e->{'conf'}->{'allport_repcode'}) {
    next;
  }
  if(not $e->{'r'}) {
    confess "My erimp does not see its recon.";
  }
  ## load returns a document
  my $status=$e->{'r'}->load($repcode);
  if(not ref $status eq 'XML::LibXML::Document') {
    warn "Report $repcode is $status."
  }
  # $e->status($repcode) or next;
  ## check that there is an editor
  $e->{'report'}->{$repcode}->{'xml'}->{'editor'} or next;
  my $issue_doc=check_for_edit_backlog($repcode, $issue_count_trigger) or next;
  if(is_editor_active($repcode, $editor_inactive_days)) {
    next;
  }
  my $save_string=$save_dir.'/'.$repcode.'/'.$date_path;
  my $email_file=&Ernad::Email::prepare_email($issue_doc,'edit_watch',$save_string);
  if($e->{'testing'}) {
    print "I am testing. The email file is $email_file\n";
    next;
  }
  &Ernad::Email::send_email($email_file);
}

sub check_for_edit_backlog {
  my $repcode=shift;
  my $issue_trigger=shift;
  my $issue_doc=Ernad::IssueState::state_summary_doc($repcode,$e);
  if($e->{'testing'}) {
    my $testing_file=$e->{'dir'}->{'test'}.'/edit_watch.xml';
    ## this function is scheduled for removal
    ##&Ernad::Common::save_xml($issue_doc,$testing_file);
    $issue_doc->toFile($testing_file);
  }
  my $xpc=$e->{'x'}->{'xpc'} // confess "I need an xpc";
  my $count_outstanding_issues_xp='count(/amf:amf/amf:collection/e:issues/e:issue)';
  my $number_of_outstanding_issues=$xpc->findvalue($count_outstanding_issues_xp,$issue_doc);
  if($number_of_outstanding_issues < $issue_trigger) {
    #print "skipping $repcode, only $number_of_outstanding_issues\n";
    return 0;
  }
  #print "$repcode has $number_of_outstanding_issues outstanding\n";
  return $issue_doc;
}

sub is_editor_active {
  my $repcode=shift;
  my $activity_limit_days=shift;
  my $rs=new Ernad::ReportState($repcode, $e);
  $rs->load();
  my $update_tist=$rs->{'update_tist'};
  my $active_ago=($start_tist-$update_tist)/$day ;
  if($active_ago < $activity_limit_days) {
    return 1;
  }
  return 0;
}
