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
;
}
