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



# This is a pre check, which checks if some extra software exists

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

use strict;
use English;                  # $OSNAME, ...
use Getopt::Long;
use Cwd;
use Cwd 'chdir';
my $cwd = getcwd();

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

# 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 $sGlobalIniFile;
our $verbose = 0;
our $ghostscript;
our $imagemagick;
our $java6;
our $printerdriver;

our $version_info = 'compare.pl';

GetOptions(
           "ghostscript"   => \$ghostscript,
           "imagemagick"   => \$imagemagick,
           "java6"         => \$java6,
           "printerdriver" => \$printerdriver,
           "verbose"       => \$verbose,

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

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

# prepare the GlobalIniFile

sub prepare()
{
    my $sEnv = "$ENV{PRJ}";
    if (! $sEnv)
    {
        print "Warning: Seems you are not in a makefile.mk environment.\n";
        $sEnv = "..";
    }
    my $sPath = getcwd();
    $sPath .= "/" . $sEnv;
    chdir ($sPath);
    cwd();
    $sPath = getcwd();
    my $sInpath = $ENV{INPATH};
    $sPath .= "/" . $sInpath . "/misc";
    $sGlobalIniFile = "$sPath/pathes.ini";
    print "Global Path ini file is: $sGlobalIniFile\n" if ($verbose);
}

sub unixpath($)
{
    my $path = shift;
    $path =~ s/\\/\//g; # make out of '\' a '/'
    return $path;
}

# search for file in a given path list.
# the path list should be separated as the path variable in the corresponding OS
sub searchForFileInPath($$)
{
    my $sFile = shift;
    my $sPathList = shift;

    my $sep = ':';
    if ($OSNAME eq "MSWin32")
    {
        $sep = ';';
    }
    my @path = split($sep, $sPathList);

    my $sPath;
    my $startdir;
    my $bFound = 0;
    my $olddir = getcwd();

    my $sWindowsHomeDir = unixpath(lc($ENV{WINDIR}));

    foreach $startdir (@path)
    {
        my $nCount = 0;
        #
        # IMPORTANT: leave out windir path.
        #
        if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
        {
            my $sPath = unixpath(lc(convertCygwinPath($startdir)));
            if ($sPath =~ /^$sWindowsHomeDir/ )
            {
                print "path: $startdir is windows path leave out.\n" if ($verbose);
                next;
            }
        }

        local *DIR;
        if (opendir (DIR, $startdir))           # open directory
        {
            print "path: $startdir" if ($verbose);
            chdir ($startdir);
            cwd();
            my $myfile;
            while ($myfile = readdir(DIR))      # get filename
            {
                if (-f $myfile )                # is it a file?
                {
                    $nCount ++;
                    if ($myfile eq $sFile)      # is it the real file?
                    {
                        $sPath = $startdir;
                        $bFound = 1;
                        last;
                    }
                }
            }
            closedir(DIR);
            print " ($nCount)\n" if ($verbose);
        }
        if ($bFound == 1)
        {
            last;
        }
    }
    chdir ($olddir);
    cwd();

    return $sPath;
}


prepare();
# don't remove the inifile, only build clean should do this.
# if ( -e "$sGlobalIniFile")
# {
#     unlink($sGlobalIniFile);
# }


# small helper, which replaces the return code
sub errorAdaption($)
{
    my $error = shift;
    if ($error != 0)
    {
        $error = $error / 256;
    }
    if ($error > 127)
    {
        $error = $error - 256;
    }
    return $error;
}

# for every error we increment this variable by 1
our $nGlobalErrors = 0;

sub handleError($$)
{
    my $error = shift;
    my $sText = shift;
    if ($error != 0)
    {
        print "ERROR: search for $sText has failed with Errornumber: $error\n";
        $nGlobalErrors ++;
    }
}

sub convertCygwinPath($)
{
    my $sPath = shift;

    if ($OSNAME eq "cygwin")
    {
        # print "Cygwin Path Patch.\n" if ($verbose);
        if ($sPath =~ /\/cygdrive\/(.)/)
        {
            my $Letter = $1;
            $sPath =~ s/\/cygdrive\/${Letter}/${Letter}\:/;
            # print "Cygwin Path Patch: '$sPath'\n" if ($verbose);
        }
    }
    return $sPath;
}

# append key=value to GlobalIniFile
sub insertPath($$)
{
    my $sKey = shift;
    my $sValue = shift;

    $sValue = convertCygwinPath($sValue);
    my $sIniFile = convertCygwinPath($sGlobalIniFile);
    local *INIFILE;
    if (open(INIFILE, ">>" . $sIniFile ))
    {
        print INIFILE "$sKey=$sValue\n";
    }
    close(INIFILE);
}

sub getFastPath($)
{
    my $sKey = shift;
    my $sValue;
    local *INIFILE;
    my $sIniFile = convertCygwinPath($sGlobalIniFile);
    if (open(INIFILE, $sIniFile))
    {
        my $line;
        while ($line = <INIFILE>)
        {
            chomp($line);
            if ( $line =~ /^$sKey=(.*)$/ )
            {
                $sValue = $1;
                # print INIFILE "$sKey=$sValue\n";
            }
        }
        close(INIFILE);
    }
    return $sValue;
}

sub checkForGhostscript()
{
    print "Search for Ghostscript\n" if ($verbose);
    if ($OSNAME eq "linux" ||
        $OSNAME eq "solaris")
    {
        # search for ghostscript
        local *GHOSTSCRIPT;
        if (open(GHOSTSCRIPT, "which gs 2>&1 |"))
        {
            my $line;
            while ($line = <GHOSTSCRIPT>)
            {
                chomp($line);
                print "- $line\n" if ($verbose);
            }
            close(GHOSTSCRIPT);
        }
        my $error = errorAdaption($?);
        handleError($error, "Ghostscript");
    }
    elsif ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
    {
        my $sGSExe = "gswin32c.exe";
        # my $sGSPath = "C:/gs/gs8.64/bin";
        my $sGSPath = getFastPath("gs.path");
        if (! $sGSPath)
        {
            $sGSPath = searchForFileInPath($sGSExe, $ENV{PATH});

            if ( ! -e "$sGSPath/$sGSExe")
            {
                $nGlobalErrors ++;
                print "ERROR: search for $sGSPath/$sGSExe failed.\n";
                print "Please install ghostscript from www.adobe.com to and make it available in \$PATH variable \n";
            }
            else
            {
                insertPath("gs.path", $sGSPath);
                insertPath("gs.exe", $sGSExe);
            }
        }
        if ( -e "$sGSPath/$sGSExe" )
        {
            print "Found Ghostscript: '$sGSPath'\n" if ($verbose);
        }
    }
    else
    {
        print "ERROR: Check for Ghostscript failed, due to unsupported '$OSNAME' environment.\n";
        $nGlobalErrors ++;
    }
}


sub checkForPSDriver()
{
    # we don't need to check for unix here, due to the fact, unix is per default be able to print in postscript
    if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
    {
        print "Check for postscript driver.\n" if ($verbose);
        my $sWindowsRoot = $ENV{windir};
        if (! $sWindowsRoot)
        {
            $sWindowsRoot = $ENV{WINDIR};
        }
        my $sCrossOfficeDriver = "${sWindowsRoot}/system32/crossoffice.ppd";
        if ( ! -e "$sCrossOfficeDriver")
        {
            print "ERROR: Don't found Postscript driver $sCrossOfficeDriver file\n";
            $nGlobalErrors ++;
            print "Take a look on: http://so-gfxcmp.germany.sun.com/docs/further/convwatch/convwatch.html.\n";
        }
    }
}

sub checkForImageMagick()
{
    print "Search for Imagemagick\n" if ($verbose);
    if ($OSNAME eq "linux" ||
        $OSNAME eq "solaris")
    {
        # search for imagemagick
        local *IMAGEMAGICK;
        if (open(IMAGEMAGICK, "which convert 2>&1 |"))
        {
            my $line;
            while ($line = <IMAGEMAGICK>)
            {
                chomp($line);
                print "- $line\n" if ($verbose);
            }
            close(IMAGEMAGICK);
        }
        my $error = errorAdaption($?);
        handleError($error, "Imagemagick");
    }
    elsif ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
    {
        my $sImageMagickExe = "convert.exe";
        # my $sImageMagickPath = "C:/gs/gs8.64/bin";
        my $sImageMagickPath = getFastPath("imagemagick.path");
        if (! $sImageMagickPath)
        {
            $sImageMagickPath = searchForFileInPath($sImageMagickExe, $ENV{PATH});
            if ($sImageMagickPath)
            {
                if ( ! -e "$sImageMagickPath/$sImageMagickExe")
                {
                    $nGlobalErrors ++;
                    print "ERROR: search for $sImageMagickPath/$sImageMagickExe failed.\n";
                    print "Please install ImageMagick from www.imagemagick.org to and make it available in \$PATH variable \n";
                }
                else
                {
                    insertPath("imagemagick.path", $sImageMagickPath);
                    # insertPath("gs.exe", $sImageMagickExe);
                }
            }
            else
            {
                # next try, search image magick in $PROGRAMFILES
                my $sPrograms = unixpath($ENV{PROGRAMFILES});

                if (! $sPrograms)
                {
                    print "There exist no \$PROGRAMFILES path, wrong Windows version?\n";
                    $nGlobalErrors++;
                }
                else
                {
                    local *DIR;
                    if (opendir (DIR, $sPrograms))           # open program directory
                    {
                        my $myfile;
                        while ($myfile = readdir(DIR))       # get a filename
                        {
                            if ($myfile =~ /ImageMagick/)
                            {
                                $sImageMagickPath = $sPrograms . "/" . $myfile;
                                last;
                            }
                        }
                        closedir(DIR);
                    }
                    if (! -e $sImageMagickPath)
                    {
                        print "ImageMagick not found.\n";
                        $nGlobalErrors ++;
                    }
                    else
                    {
                        insertPath("imagemagick.path", $sImageMagickPath);
                    }
                }
            }

        }
        if ( -e "$sImageMagickPath/$sImageMagickExe" )
        {
            print "Found ImageMagick: '$sImageMagickPath'\n" if ($verbose);
        }
    }
    else
    {
        print "ERROR: not supported environment\n";
    }
}

sub checkForJava6()
{
    print "Search for Java6\n" if ($verbose);
    my $javaexe = "java";
    if ( $ENV{JAVA6} )
    {
        $javaexe = $ENV{JAVA6};
    }

    if ($OSNAME eq "linux" || $OSNAME eq "cygwin")
    {
        # search for imagemagick
        local *JAVA;
        if (open(JAVA, "$javaexe -version 2>&1 |"))
        {
            my $line;
            while ($line = <JAVA>)
            {
                chomp($line);
                print "- $line\n" if ($verbose);
                if ( $line =~ /java version "(.*)"/ )
                {
                    my $javaversion = $1;
                    my @version = split('\.', $javaversion);
                    print "Found Java version: $version[1]  the complete version: $javaversion\n" if ($verbose);
                    if ( $version[1] < 6)
                    {
                        print "Wrong Java version, at least Java version 6 is need but found $javaversion.\n";
                        $nGlobalErrors++;
                        print "It is possible to overwrite the java exe with environment variable JAVA6='path'.\n";
                    }
                    else
                    {
                        insertPath("java.exe", $javaexe);
                    }
                    last;
                }
            }
            close(JAVA);
        }
        my $error = errorAdaption($?);
        handleError($error, "Java");
    }
    elsif ($OSNAME eq "MSWin32")
    {
         my $javaexe = "java";
         if ( $ENV{JAVA6} )
         {
             $javaexe = $ENV{JAVA6};
         }

         if (! -e $javaexe)
         {
             print "Java not found.\n";
             $nGlobalErrors ++;
         }
         else
         {
             print "Found Java: '$javaexe'\n" if ($verbose);
             insertPath("java.exe", $javaexe);
         }
    }
    else
    {
        print "ERROR: Java not found.\n";
    }
}

# different checks
print "Environment '$OSNAME'\n" if ($verbose);

if ($printerdriver)
{
    checkForPSDriver();
}
if ($ghostscript)
{
    checkForGhostscript();
}
if ($imagemagick)
{
    checkForImageMagick();
}
if ($java6)
{
    checkForJava6();
}

# return with found errors
exit($nGlobalErrors);

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

    print(HANDLE <<END_OF_USAGE);

Usage: $tool_name [OPTIONS]

    -ghostscript             Try to find ghostscript in your environment
    -imagemagick             Try to find imagemagick
    -java6                   Checks for java 1.6.x
    -printerdriver           Try to find printer driver, windows only
    -verbose                 be verbose

    -h, --help               Print this help, then exit
    -v, --version            Print version number, then exit

END_OF_USAGE
;
}
