package graphical_compare;

#**************************************************************
#
#  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.
#
#**************************************************************



use CallExternals;
use stringhelper;
use timehelper;
use filehelper;
use loghelper;
use oshelper;
use cwstestresulthelper;
use solarenvhelper;
use ConvwatchHelper;

use strict;
use Cwd;
# use File::Basename;
use Getopt::Long;
use English;                  # $OSNAME, ...
use File::Path;
use Cwd 'chdir';
use Sys::Hostname;
use Time::localtime;

# my $cwd = getcwd();

BEGIN {
    use Exporter   ();
    our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);

    $VERSION     = 1.00;
    # if using RCS/CVS, this may be preferred
    $VERSION = do { my @r = (q$Revision: 1.2 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
    @ISA         = qw(Exporter);
    @EXPORT      = qw(&SingleDocumentCompare &setPrefix &setConnectionString);
    %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
    # your exported package globals go here,
    # as well as any optionally exported functions
    @EXPORT_OK   = ( ); # qw($Var1 %Hashit &func3);
}


our $nTimeOut = 300 * 1000;
our $viewable = 1;
our $port;
our $resolution;
our $overwritereference;
our $fixreference;
our $sConncectionString;

sub setConnectionString($)
{
    $sConncectionString=shift;
}

sub getOOoRunnerClasspath()
{
    my $sSourceRoot;
    my $sUPDExtensions = "";
    if (defined ($ENV{SOL_TMP}) && defined ($ENV{SOLARVERSION}))
    {
        $sSourceRoot = $ENV{SOLARVERSION};
    }
    elsif (defined $ENV{SOURCE_ROOT})
    {
        $sSourceRoot = $ENV{SOURCE_ROOT};
        $sSourceRoot = appendPath($sSourceRoot, $ENV{WORK_STAMP});
    }
    else
    {
        $sSourceRoot = $ENV{SOLARVERSION};
        $sUPDExtensions = ".$ENV{UPDMINOR}";
    }
    $sSourceRoot = appendPath($sSourceRoot, $ENV{INPATH});
    my $sSourceRootBin = appendPath($sSourceRoot, "bin" . $sUPDExtensions);
    my $sSourceRootLib = appendPath($sSourceRoot, "lib" . $sUPDExtensions);

    if (! -d $sSourceRoot )
    {
        log_print( "SourceRoot not found, search it in '$sSourceRoot'\n");
        return "";
    }

    my $sOOoRunnerPath = $sSourceRootBin;
    my $sUnoilPath   = $sSourceRootBin;
    my $sRidlPath    = $sSourceRootBin;
    my $sJurtPath    = $sSourceRootBin;
    my $sJuhPath     = $sSourceRootBin;
    my $sJavaUnoPath = $sSourceRootBin;

    my $sOOoRunnerClasspath =
        appendPath( $sRidlPath,      "ridl.jar") . getJavaPathSeparator() .
        appendPath( $sUnoilPath,     "unoil.jar") . getJavaPathSeparator() .
        appendPath( $sJurtPath,      "jurt.jar") . getJavaPathSeparator() .
        appendPath( $sJuhPath,       "juh.jar") . getJavaPathSeparator() .
        appendPath( $sJavaUnoPath,   "java_uno.jar") . getJavaPathSeparator() .
        appendPath( $sOOoRunnerPath, "OOoRunnerLight.jar");
    if (isWindowsEnvironment())
    {
        $sOOoRunnerClasspath .= getJavaPathSeparator() . $sSourceRootBin;
    }
    else
    {
        $sOOoRunnerClasspath .= getJavaPathSeparator() . $sSourceRootLib;
    }
    return $sOOoRunnerClasspath;
}

# ------------------------------------------------------------------------------
sub getTempPath()
{
    my $sTempPath;
    if (isWindowsEnvironment())
    {
        $sTempPath = "C:/temp";
    }
    elsif (isUnixEnvironment())
    {
        $sTempPath = "/tmp";
    }
    else
    {
        die "getTempPath() Failed, due to unsupported environment.\n";
    }
    return $sTempPath;
}
# ------------------------------------------------------------------------------

sub getProjectOutput()
{
    my $sOutput = appendPath(getProjectRoot(), $ENV{INPATH});
    $sOutput = appendPath($sOutput, "misc");
    return $sOutput;
}

# ------------------------------------------------------------------------------
sub getProjectOutputReference()
{
    my $sOutput = appendPath(getProjectRoot(), $ENV{INPATH});
    $sOutput = appendPath($sOutput, "reference");
    return $sOutput;
}


sub searchForReference($)
{
    my $sFile = shift;
    if ( -e $sFile )
    {
        return 0;
    }
    if ( -e $sFile . ".ps")
    {
        return 0;
    }
    if ( -e $sFile . ".pdf")
    {
        return 0;
    }
    return 1;
}
# ------------------------------------------------------------------------------

# my $sOfficeName = $officeprefixname . $officename;
sub SingleDocumentCompare($$$$$$)
{
    # get all about the document to compare
    my $sDocumentPoolPath = shift;
    my $sDocumentPool = shift;
    my $sDocumentName = shift;
    my $sDebug = "";

    # get all about the destination office
    my $sCreatorType = shift;
    if (! $sCreatorType)
    {
        # log_print( "parameter -creatortype not given. Use 'OOo'\n");
        $sCreatorType = "ps";
    }
    my $prepareonly = shift;
    my $show = shift;

    # my $nSimpleCompareTime = getTime();

    my $nConvwatchFailed = 0;
    set_logfile( appendPath(getProjectOutput(), $sDocumentName . ".txt" ));

    print("$sDocumentName");
    log_print("\n");
    log_print("Graphical compare on document: '$sDocumentName'\n");
    # ------------------------------------------------------------------------------
    # create postscript or pdf from first installed office
    # ------------------------------------------------------------------------------

    my $sOOoRunnerClasspath = quoteIfNeed(getOOoRunnerClasspath());
    if ($OSNAME eq "cygwin")
    {
        if (!startswith($sOOoRunnerClasspath, "\""))
        {
            $sOOoRunnerClasspath = quote($sOOoRunnerClasspath);
        }
    }
    if (length($sOOoRunnerClasspath) == 0)
    {
        $nConvwatchFailed == 1;
    }
    # ------------------------------------------------------------------------------
    # create postscript or pdf from second installed office
    # ------------------------------------------------------------------------------

    my $sPathesIni = appendPath(getProjectOutput(), "pathes.ini");
    my $gspath = getFromPathes($sPathesIni, "gs.path");
    my $gsexe = getFromPathes($sPathesIni, "gs.exe");
    my $impath = getFromPathes($sPathesIni, "imagemagick.path");
    my $javaexe = getFromPathes($sPathesIni, "java.exe");
    setJavaExecutable($javaexe);

    log_print("----- CREATE POSTSCRIPT OR PDF WITH RUNNING OFFICE -----\n");
    # my $nPrepareSecondPostscriptTime = getTime();
    if ($nConvwatchFailed == 0)
    {
        my $sInputPath = $sDocumentPoolPath;
        $sInputPath = appendPath($sInputPath, $sDocumentPool);
        $sInputPath = appendPath($sInputPath, $sDocumentName);

        if (! -f $sInputPath )
        {
            $nConvwatchFailed = 1;
            log_print("ERROR: File '$sInputPath' doesn't exists.\n");
        }
        else
        {
            my $sOutputPath = getProjectOutput();
            my $sPropertyFile = appendPath(getProjectOutput() , $sDocumentName . ".build.props");

            local *PROPERTYFILE;
            if (open(PROPERTYFILE, ">$sPropertyFile"))
            {
                print PROPERTYFILE "# This file is automatically created by graphical_compare.pl\n";
                print PROPERTYFILE "DOC_COMPARATOR_PRINT_MAX_PAGE=9999\n";
                print PROPERTYFILE "DOC_COMPARATOR_GFX_OUTPUT_DPI_RESOLUTION=180\n";
                print PROPERTYFILE "DOC_COMPARATOR_REFERENCE_CREATOR_TYPE=$sCreatorType\n";
                print PROPERTYFILE "TEMPPATH=" . getTempPath() . "\n";
                if ($sConncectionString)
                {
                    print PROPERTYFILE "ConnectionString=$sConncectionString\n";
                }
                else
                {
                    print PROPERTYFILE "ConnectionString=pipe,name=" . getUsername() . "\n";
                }
                print PROPERTYFILE "OFFICE_VIEWABLE=true\n";
                print PROPERTYFILE "CREATE_DEFAULT_REFERENCE=true\n";
                print PROPERTYFILE "DOC_COMPARATOR_INPUT_PATH=$sInputPath\n";
                print PROPERTYFILE "DOC_COMPARATOR_OUTPUT_PATH=$sOutputPath\n";
                if (isWindowsEnvironment())
                {
                    print PROPERTYFILE "DOC_COMPARATOR_PRINTER_NAME=CrossOffice Generic Printer\n";
                }
                print PROPERTYFILE "NoOffice=true\n";

                close(PROPERTYFILE);
            }
            else
            {
                print "Can't open '$sPropertyFile' for write.\n";
            }
            if ( -e "$sPropertyFile")
            {
                # start OOoRunner
                # sleep 10;
                # $sOOoRunnerClasspathFromDestinationName = quoteIfNeed(getOOoRunnerClasspath());
                my $sParams;
                if ( $ENV{PERL} )
                {
                    $sParams = "-Dperl.exe=" . convertCygwinPath($ENV{PERL});
                }

                $sParams .= " -cp " . $sOOoRunnerClasspath .
                    " org.openoffice.Runner" .
                    " -TimeOut $nTimeOut" .
                    " -tb java_complex" .
                    " -ini $sPropertyFile" .
                    " -o graphical.PostscriptCreator";
                # $sParams .= " -cs pipe,name=$USER";

                # $sDebug = "-Xdebug  -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
                my $err = calljava(getJavaExecutable(), $sParams, $sDebug);
                $sDebug = "";
                log_print( "\n\n");
                if ($err != 0)
                {
                    my $sFailure = "Failed after try to create Postscript/pdf document for " . $sDocumentName;
                    log_print("ERROR: $sFailure\n");
                    $nConvwatchFailed = 1;
                }
            }
            else
            {
                my $sFailure = "There is no propertyfile: $sPropertyFile";
                log_print( "ERROR: $sFailure\n");
                $nConvwatchFailed=1;
            }
        }

        # set prepareonly and it is possible to only create ps or pdf files
        if ($prepareonly)
        {
            print(" [only create ");
            if ($sCreatorType eq "ps" || $sCreatorType eq "pdf")
            {
                print(" $sCreatorType");
            }
            else
            {
                print(" (${sCreatorType}?)");
            }
            if ($nConvwatchFailed == 0)
            {
                print(" ok");
            }
            else
            {
                print(" failed")
            }
            print("]\n");
            return $nConvwatchFailed;
        }


        # ------------------------------------------------------------------------------
        # create jpeg from postscript or pdf from second installed office
        # ------------------------------------------------------------------------------

        if ($nConvwatchFailed == 0)
        {
            log_print("----- CREATE JPEG FROM POSTSCRIPT OR PDF FROM RUNNING OFFICE -----\n");
            # start OOoRunner
            my $sInputPath = getProjectOutput();
            $sInputPath = appendPath($sInputPath, $sDocumentName);

            my $sOutputPath = getProjectOutput();

            my $sParams = "-cp " . $sOOoRunnerClasspath .
                " org.openoffice.Runner" .
                " -TimeOut $nTimeOut" .
                " -tb java_complex" .
                " -DOC_COMPARATOR_INPUT_PATH " . quoteIfNeed($sInputPath) .
                " -DOC_COMPARATOR_OUTPUT_PATH "  . quoteIfNeed($sOutputPath) .
                " -DOC_COMPARATOR_REFERENCE_CREATOR_TYPE $sCreatorType" .
                " -NoOffice" .
                " -NoSmallPictures" .
                " -o graphical.JPEGCreator";
            if ($gspath)
            {
                $sParams .= " -gs.path " . quoteIfNeed($gspath);
            }
            if ($gsexe)
            {
                $sParams .= " -gs.exe $gsexe";
            }

            # $sDebug = "-Xdebug  -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
            my $err = calljava(getJavaExecutable(), $sParams, $sDebug);
            $sDebug = "";
            # log_print( "\n\n");
            if ($err != 0)
            {
                my $sFailure = "Failed after try to create JPEG from Postscript/pdf document for " . $sDocumentName;
                log_print("ERROR: $sFailure\n");
                $nConvwatchFailed = 1;
            }
        }
    }

    # ------------------------------------------------------------------------------
    # create jpeg from postscript or pdf from references
    # ------------------------------------------------------------------------------

    if ($nConvwatchFailed == 0)
    {
        log_print("----- CREATE JPEG FROM POSTSCRIPT OR PDF FROM REFERENCE -----\n");

        # start OOoRunner
        my $sInputPath = appendPath(getProjectRoot(), "references");
        $sInputPath = appendPath($sInputPath, getEnvironment());
        $sInputPath = appendPath($sInputPath, $sDocumentPool);
        $sInputPath = appendPath($sInputPath, $sDocumentName);

        my $err = searchForReference($sInputPath);
        if ($err != 0)
        {
            log_print("ERROR: Can't find Postscript or PDF reference for '$sInputPath'\n");
            $nConvwatchFailed = 1;
        }
        else
        {
            my $sOutputPath = getProjectOutputReference();
            rmkdir $sOutputPath;

            my $sIndexFile = appendPath($sOutputPath, "index.ini");
            # we need the index.ini for better run through
            local *INDEXINI;
            if ( ! -e $sIndexFile)
            {
                if (open(INDEXINI, ">$sIndexFile"))
                {
                    # print INDEXINI "[$sDocumentName]\n";
                    close(INDEXINI);
                }
            }
            my $sParams = "-cp " . $sOOoRunnerClasspath .
                " org.openoffice.Runner" .
                " -TimeOut $nTimeOut" .
                " -tb java_complex" .
                " -DOC_COMPARATOR_INPUT_PATH " . quoteIfNeed($sInputPath) .
                " -DOC_COMPARATOR_OUTPUT_PATH "  . quoteIfNeed($sOutputPath) .
                " -DOC_COMPARATOR_REFERENCE_CREATOR_TYPE $sCreatorType" .
                " -NoOffice" .
                " -NoSmallPictures" .
                " -o graphical.JPEGCreator";
            if ($gspath)
            {
                $sParams .= " -gs.path " . quoteIfNeed($gspath);
            }
            if ($gsexe)
            {
                $sParams .= " -gs.exe $gsexe";
            }

            # $sDebug = "-Xdebug  -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
            my $err = calljava(getJavaExecutable(), $sParams, $sDebug);
            $sDebug = "";
            # log_print( "\n\n");
            if ($err != 0)
            {
                my $sFailure = "Failed after try to create JPEG from Postscript/pdf document for references.";
                log_print("ERROR: $sFailure\n");
                $nConvwatchFailed = 1;
            }
        }
    }
    # ------------------------------------------------------------------------------
    # compare JPEGs
    # ------------------------------------------------------------------------------

    if ($nConvwatchFailed == 0)
    {
        log_print("----- COMPARE JPEGS -----\n");
        my $sInputPath = appendPath(getProjectOutputReference(), $sDocumentName);

        my $sOutputPath = getProjectOutput();

        my $sParams = "-Xmx512m" .
            " -cp " . $sOOoRunnerClasspath .
            " org.openoffice.Runner" .
            " -TimeOut $nTimeOut" .
            " -tb java_complex" .
            " -DOC_COMPARATOR_INPUT_PATH "  . quoteIfNeed($sInputPath) .
            " -DOC_COMPARATOR_OUTPUT_PATH " . quoteIfNeed($sOutputPath) .
            " -NoOffice" .
            " -NoSmallPictures" .
            " -o graphical.JPEGComparator";
        if ($impath)
        {
            $sParams .= " -imagemagick.path " . quoteIfNeed($impath);
        }

        # start OOoRunner
        # $sDebug = "-Xdebug  -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
        my $err = calljava(getJavaExecutable(), $sParams, $sDebug);
        $sDebug = "";
        log_print( "\n\n");
        if ($err != 0)
        {
            my $sFailure = "Failed after compare JPEGs $sDocumentName\n";
            log_print("ERROR: $sFailure\n");
            $nConvwatchFailed = 1;

            if ($show)
            {
                # try to execute new java tool to show graphical compare
                my $sJavaProgram = appendPath(getProjectRoot(), $ENV{INPATH});
                $sJavaProgram = appendPath($sJavaProgram, "class");
                $sJavaProgram = appendPath($sJavaProgram, "ConvwatchGUIProject.jar");
                if ( -e "$sJavaProgram")
                {
                    my $sInputPath = appendPath(getProjectOutput(), $sDocumentName . ".ps.ini");
                    if (! -e $sInputPath)
                    {
                        $sInputPath = appendPath(getProjectOutput(), $sDocumentName . ".pdf.ini");
                        if (! -e $sInputPath)
                        {
                            $sInputPath = 0;
                        }
                    }
                    if ($sInputPath)
                    {
                        my $sParams = "-Xms128m -Xmx512m -jar $sJavaProgram $sInputPath";
                        # $sParams .= " -cs pipe,name=$USER";
                        # my $sJavaExe = "C:/Program Files/Java/jdk1.6.0_16/bin/java.exe"; # getJavaExecutable()
                        my $sJavaExe = getJavaExecutable();
                        # $sDebug = "-Xdebug  -Xrunjdwp:transport=dt_socket,server=y,address=9001,suspend=y";
                        my $err = calljava($sJavaExe, $sParams, $sDebug);
                        # $sDebug = "";
                        # log_print( "\n\n");
                        # if ($err != 0)
                        # {
                        #     my $sFailure = "Failed after try to create Postscript/pdf document for " . $sDocumentName;
                        #     log_print("ERROR: $sFailure\n");
                        #     $nConvwatchFailed = 1;
                        # }
                    }
                }
                else
                {
                    print "WARNING: The show program '$sJavaProgram' doesn't exists.\n";
                }
            }
        }
    }

    log_print( "\n\n");
    close_logfile();

    if ($nConvwatchFailed == 0)
    {
        print(" [ok]\n");
    }
    else
    {
        print(" [FAILED]\n");
        print("\nPrint output of test: $sDocumentName\n");
        my $sLogFile = appendPath(getProjectOutput(), $sDocumentName . ".txt");
        showFile($sLogFile);
    }
    # printTime(endTime($nSimpleCompareTime));

    return $nConvwatchFailed;
}

# ------------------------------------------------------------------------------
# cat $file
sub showFile($)
{
    my $logfile = shift;
    local *LOGFILE;
    if (open(LOGFILE, "$logfile"))
    {
        my $line;
        while ($line = <LOGFILE>)
        {
            chomp($line);
            print $line ."\n";
        }
        close(LOGFILE);
    }
}


1;
