#!/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;
}
