#!/usr/bin/perl

use strict;

$| = 1;

use Getopt::Long;
use Data::Dumper;
use POSIX; 

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::DB::Item::Client;
use Common::DB::Item::MapFaceFile;
use Common::RSDB;
use Common::RSApp;

use lib '/app/tools/appuser/lib';
use AppUser::DB::Item::User;

use lib '/app/tools/data_classes/lib';
use Client::Service;

my %args = ();
parseCommandLine(\%args);

my $startDate = $args{startDate};
my $endDate   = $args{endDate};


# This isn't really client specific, but it seems like we need the singleton anyway...
my $appSingleton = Common::RSApp->new( clientID => 202 );



binmode STDOUT, ":utf8";


my $fileName = "MapFace_Completed_Files";

if ($startDate) {
    $fileName .= "_From_$startDate";    
} 

if ($endDate) {
    $fileName .= "_Up_To_$endDate"; 
} else {
    my $now = strftime("%Y-%m-%d", localtime(time)); 
    $fileName .= "_Up_To_$now";
}

$fileName .= ".txt";

open FILE, ">$fileName" or die $!;
binmode FILE, ":utf8";


#------------------------------------------------------------------
# Build the header
#------------------------------------------------------------------
my $header;
my $header = join("\t",
   "Customer", "Service", "File Name", "Received", "# of Errors", "Errors Mapped",
   "Errors Approved", "Resolving User", "Approving User"
);

_writeln("$header\n");



my %clientNames;
my %serviceNames;
my %userNames;

# We need to set the end date time right at the end, so that we can include everything from that date.
if ($endDate) {
    $endDate .= " 23:59:59";   
}

my $files = Common::DB::Item::MapFaceFile->GetAllCompleted(startDate => $startDate, endDate => $endDate);

while ($files->hasNext()) {

    my $file = $files->next();

    my $clientName;
    if ($clientNames{$file->client_id})
    {
        $clientName = $clientNames{$file->client_id};
    }
    else
    {
        my $client = Common::DB::Item::Client->Lookup(client_id => $file->client_id);
        $clientName = $client->client_name;
        $clientNames{$file->client_id} = $clientName;
    }

    my $serviceName;
    if ($serviceNames{$file->service_id})
    {
        $serviceName = $serviceNames{$file->service_id};
    }
    else
    {
        $serviceName = Client::Service::GetDefaultServiceName(service_id => $file->service_id);
        $serviceNames{$file->service_id} = $serviceName;
    }

    my $fileName = $file->orig_file_name;
    
    my $dateCreated = $file->date_created;
    
    my $initialErrors = $file->initial_errors;
    
    my $mappedErrors = $initialErrors - $file->remaining_errors;
    
    my $approvedErrors = $file->approved_mappings;

    my $resolvingUser;
    if ($file->resolving_user_id) 
    {
        if ($userNames{$file->resolving_user_id})
        {
            $resolvingUser = $userNames{$file->resolving_user_id};
        }
        else
        {       
    		my $user = AppUser::DB::Item::User->Lookup(user_id => $file->resolving_user_id);
    		$resolvingUser = $user->first_name . " " . $user->last_name;	               
            $userNames{$file->resolving_user_id} = $resolvingUser;
        }
    }

    my $approvingUser;
    if ($file->approving_user_id)
    {
        if ($userNames{$file->approving_user_id})
        {
            $approvingUser = $userNames{$file->approving_user_id};
        }
        else
        {       
    		my $user = AppUser::DB::Item::User->Lookup(user_id => $file->approving_user_id);
    		$approvingUser = $user->first_name . " " . $user->last_name;	               
            $userNames{$file->approving_user_id} = $approvingUser;
        }
    }

    my $dataRow = join("\t", $clientName, $serviceName, $fileName, $dateCreated, $initialErrors,
                             $mappedErrors, $approvedErrors, $resolvingUser, $approvingUser,
    );


    _writeln( "$dataRow\n" ); 
}# file loop

close FILE if ( $fileName );

#==============
#
# Subroutines
#
#==============

sub _writeln {
   my($s) = @_;
   if ( $fileName ) {
      print FILE $s;
   } else {
      print $s;
   }
}

sub parseCommandLine {
   my( $a ) = @_;
   my $startDate;
   my $endDate;
   GetOptions(
      's|start_date=s' => \$startDate,
      'e|end_date=s' => \$endDate,
   );

   ${_[0]}{startDate} = $startDate;
   ${_[0]}{endDate} = $endDate;

}#parseCommandLine

sub usage {
   my $errstr = shift;
   my $text = ($errstr) ? "ERROR: $errstr\n" : '';
   $text .= "Usage $0 -s <startDate> (YYYY-MM-DD format)\n";
   $text .= "Usage $0 -e <endDate> (YYYY-MM-DD format)\n";
   return $text;
}
