eval 'exec perl -wS $0 ${1+\"$@\"}'
    if 0;

#**************************************************************
#  
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#  
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#  
#**************************************************************



BEGIN
{
    #       Adding the path of this script file to the include path in the hope
    #       that all used modules can be found in it.
    $0 =~ /^(.*)[\/\\]/;
    push @INC, $1;
    # print "PATH: " . $1 . "\n";
}

# my $e;
# foreach $e (keys %ENV)
# {
#     print "$e := $ENV{$e}" . "\n";
# }

use strict;
use graphical_compare;
use ConvwatchHelper;
use filehelper;
use timehelper;
use loghelper;

use Cwd;
use File::Basename;
use Getopt::Long;
use English;                  # $OSNAME, ...
use File::Path;
use Cwd 'chdir';

our $help;                    # Help option flag
our $version;                 # Version option flag
# our $test;

# our $MAJOR;
# our $MINOR;
# our $cwsname;
our $pool;
our $document;
our $creatortype;
our $prepareonly = 0;
our $force;
our $verbose = 0;
our $show = 0;
our $connectionstring;

# Prototypes
sub print_usage(*);
sub prepare();
sub CompareFiles($$);

# flush STDOUT
# my $old_handle = select (STDOUT); # "select" STDOUT and save # previously selected handle
# $| = 1; # perform flush after each write to STDOUT
# select ($old_handle); # restore previously selected handle

$OUTPUT_AUTOFLUSH=1; # works only if use English is used.

our $version_info = 'compare.pl';

GetOptions(
#            "MAJOR=s"       => \$MAJOR,
#            "MINOR=s"       => \$MINOR,
#            "cwsname=s"     => \$cwsname,
           "pool=s"        => \$pool,
           "document=s"    => \$document,
           "creatortype=s" => \$creatortype,
           "prepareonly=s" => \$prepareonly,
           "connectionstring=s" => \$connectionstring,

           "force"         => \$force,
           "verbose"       => \$verbose,
           "show"          => \$show,

#           "test"          => \$test,
           "help"          => \$help,
           "version"       => \$version
           );

if ($help)
{
    print_usage(*STDOUT);
    exit(0);
}
# Check for version option
if ($version)
{
    print STDERR "$version_info\n";
    exit(0);
}

if ($prepareonly)
{
    $force=1;
}

prepare();
if ($connectionstring)
{
    setConnectionString($connectionstring);
}

my $sDocumentPool = appendPath(getProjectRoot(), "document-pool");
# print "ProjectRoot: " . getProjectRoot() . "\n";
if ($ENV{DOCUMENTPOOL})
{
    if ( -d $ENV{DOCUMENTPOOL})
    {
        print "overwrite default Documentpool: '$sDocumentPool'\n";
        print "       with \$ENV{DOCUMENTPOOL}: $ENV{DOCUMENTPOOL}\n";
        $sDocumentPool = $ENV{DOCUMENTPOOL};
    }
    else
    {
        print "Given \$DOCUMENTPOOL doesn't exist.\n";
    }
}

my $err = 0;
my $nCompareTime = getTime();

# if we want to check one file, give -pool and -document
# if we want to check the whole pool, give -pool
# if we want to check all, call without parameters
if ($pool)
{
    if ($document)
    {
        $err = SingleDocumentCompare( $sDocumentPool,
                                      $pool,
                                      $document,
                                      $creatortype,
                                      $prepareonly,
                                      $show
                                     );
    }
    else
    {
        $err = CompareFiles($sDocumentPool, $pool);
    }
}
else
{
    local *DIR;
    if (opendir (DIR, $sDocumentPool))           # Directory oeffnen
    {
        my $myfile;
        while ($myfile = readdir(DIR))
        {                                        # ein filename holen
            if ($myfile eq "." ||
                $myfile eq "..")
            {
                next;
            }
            my $sDocumentPath = appendPath($sDocumentPool, $myfile);
            if ( -d $sDocumentPath )
            {
                $err += CompareFiles($sDocumentPool, $myfile);
            }
            elsif ( -f $sDocumentPath )
            {
                print "Warning: the file '$myfile' will not compared.\n";
            }
        }
        closedir(DIR);        
    }
    # my $sPool = "eis-chart";
    # $err += CompareFiles($sDocumentPool, "eis-chart");
    # $err += CompareFiles($sDocumentPool, "eis-impress");
    # $err += CompareFiles($sDocumentPool, "eis-writer");
    # $err += CompareFiles($sDocumentPool, "eis-calc");

}

printTime(endTime($nCompareTime));
exit ($err);

# ------------------------------------------------------------------------------

sub CompareFiles($$)
{
    my $sDocumentPath = shift;
    my $sPool = shift;
    my %aFailedHash;
    my $startdir = appendPath($sDocumentPath, $sPool);

    local *DIR;
    if (opendir (DIR, $startdir))           # Directory oeffnen
    {
        my $myfile;
        while ($myfile = readdir(DIR))
        {                                  # ein filename holen
            if ($myfile eq "knownissues.xcl")
            {
                next;
            }
            my $sAbsoluteFile = appendPath($startdir, $myfile);
            if (-f $sAbsoluteFile)
            {
                my $nIssue;
                my $sIssueText;
                ($nIssue, $sIssueText) = checkForKnownIssue($startdir, $myfile);
                if ($nIssue == 0)
                {
                    $err = SingleDocumentCompare(
                                             # "/net/so-gfxcmp-documents.germany.sun.com/export/gfxcmp/document-pool", # $documentpoolpath,
                                             $sDocumentPool,
                                             $sPool,                  # $documentpool,
                                             $myfile,                 # $documentname);
                                             $creatortype,            # $destinationcreatortype,
                                             $prepareonly,
                                             $show
                                             );
                    $aFailedHash{$myfile} = $err;
                }
                else
                {
                    print "$myfile [KNOWN ISSUE: #$sIssueText#]\n";
                }
            }
        }
        closedir(DIR);
    }
    
    print "***** State for graphical compare of pool: '$sPool' ******\n";
    my $nErrorCount = 0;
    my $file;
    foreach $file (keys %aFailedHash)
    {
        if ($aFailedHash{$file} != 0)
        {
            print "Failed: $file\n";
            $nErrorCount++;
        }
    }
    print "Whole unit: ";
    if ($nErrorCount > 0)
    {
        print "PASSED.FAILED\n";
    }
    else
    {
        print "PASSED.OK\n";
    }
    print "************************************************************\n";
    return $nErrorCount;
}
# ------------------------------------------------------------------------------
# return issue number if file exists in knownissues.xcl file
sub checkForKnownIssue($$)
{
    my $startdir = shift;
    my $myfile = shift;
    
    if ($force)
    {
        return 0,"";
    }

    my $sKnownIssueFile = appendPath($startdir, "knownissues.xcl");
    my $sIssueText = "unknown";
    local *ISSUES;
    my $nIssue = 0;
    my $sCurrentSection;

    if (open(ISSUES, $sKnownIssueFile))
    {
        my $line;
        while ($line = <ISSUES>)
        {
            chomp($line);
            if ($line =~ /\[(.*)\]/ )
            {
                $sCurrentSection = $1;
                next;
            }
            if ($sCurrentSection eq $creatortype)
            {
                if ($line =~ /\#\#\# (.*) \#\#\#/ )
                {
                    $sIssueText = $1;
                }
                if ($line =~ /^${myfile}$/ )
                {
                    $nIssue = 1;
                    last;
                }
            }
        }
        close(ISSUES);
    }
    return $nIssue, $sIssueText;
}
# ------------------------------------------------------------------------------
sub prepare()
{
    # directory structure:
    # documents will be found in
    # ../document-pool/eis-tests

    # references will be found in
    # ../references/unxlngi/eis-tests
    # ../references/wntmsci/eis-tests

    # output goes to
    # ../unxlngi6.pro/misc

    if ($verbose)
    {
        setVerbose();
    }

    # TEST
    if (!$ENV{INPATH})
    {
        if ($OSNAME eq "linux")
        {
            # just for debug
            setINPATH("unxlngi6.pro");
        }
    }
    else
    {
        setINPATH($ENV{INPATH});
    }

    if (! $creatortype)
    {
        $creatortype= "ps";
    }

    my $cwd = getcwd();
    print "Current Directory: $cwd\n" if ($verbose);
    my $sProjectBase;
    if ($ENV{PRJ})
    {
        # print "cwd:=$cwd\n";
        # print "PRJ:=$ENV{PRJ}\n";
        $sProjectBase = appendPath($cwd, $ENV{PRJ});
    }
    else
    {
        $sProjectBase = dirname($cwd);
    }
    if ($OSNAME eq "cygwin")
    {
        $sProjectBase = `cygpath -w $sProjectBase`;
        chomp($sProjectBase);
        $sProjectBase = unixpath($sProjectBase);
        # print "cygwin patch \$sProjectBase := $sProjectBase\n";
    }
    # print "Project base path: $sProjectBase\n";
    setProjectRoot($sProjectBase);


    # TEST TEST TEST
    # exit (0);
}
# ------------------------------------------------------------------------------
sub print_usage(*)
{
    local *HANDLE = $_[0];
    my $tool_name = basename($0);

    print(HANDLE <<END_OF_USAGE);

Usage: $tool_name [OPTIONS] 

    -pool                    Give pool name out of document-pool directory.
                             But all documents list in knownissues.xcl will not check.
    -document                Give a single document to test, the known issue list will ignored.
    -creatortype=s           s:ps  create postscript files via print to file.
                             s:pdf create PDF file via export to pdf.
    -h, --help               Print this help, then exit
    -v, --version            Print version number, then exit

END_OF_USAGE
;
}
