#!perl -w
#
# 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 script is intended to be called from within the docs build process.
# It gets two parameters, ${input_ext} (e.g. .xml.de) and the full path name
# of the current directory.
# It assumes, that the current working directory is the root of the manual.

# The script doesn't use an XML parser (yet?) so care should be taken with
# non-ascii characters.

# TODO:
# - rewrite in java as ant task?

# against fat fingers
use strict;

# for file operations
use FindBin;
use lib $FindBin::Bin;
use Fcntl qw(O_RDONLY O_WRONLY O_CREAT O_TRUNC O_APPEND);
use DocUtil qw(%suffix2lang $ignore_files srcinfo docpath prefix);
sub outofdate($$$); # need Prototype

# scratch stuff
my (@files, @all_files, @pfiles, %revs, $curpath, $file);

# check commandline parameters
die "missing parameter(s)\n"
    unless defined $ARGV[0] and defined $ARGV[1];
    #              suffix               srcfile

# slurp in directory
$curpath = $ARGV[1];
opendir(DIR, $curpath)
    or die "could not open directory '$curpath' ($!), stopped";

@all_files = sort grep {
    $_ ne "allmodules$ARGV[0]" and
    $_ ne "categories$ARGV[0]"
} grep !/$ignore_files/ => readdir(DIR);

closedir(DIR)
    or die "could not close directory '$curpath' ($!), stopped";

# glob the files
@files = grep {-f $_} prefix grep /\Q$ARGV[0]\E$/ => @all_files;

for $file (@files) {
    my (%current, %variants);
    my ($dirname, $basename, $relative, $metafile) = srcinfo($file);

    # first determine the reality
    @pfiles = grep /^\Q$basename.\E(?:html\.[^.]+|xml)/ => @all_files;

    # now loop over the filelist.
    # it contains all files of one language including
    # html AND xml variants.
    for (@pfiles) {
        my $suffix;
        my $lang = $suffix = /^\Q$basename.\E(?:html|xml)\.([^.]+)/ ? $1 : 'en';
        $lang = $suffix2lang{$suffix} if $suffix2lang{$suffix};

        $variants{$lang} = {};
        $variants{$lang}->{'pdf'} = "$basename.$suffix.pdf"
            if -f docpath("$dirname$basename.$suffix.pdf");

        # the following works, because the list (@pfiles) is sorted, that way
        # html is processed before xml and thus typically we set the
        # parameter first and delete it later.
        if (/^\Q$basename.xml/) {
            delete $variants{$lang}->{'htmlonly'};
        }
        else {
            $variants{$lang}->{'htmlonly'} = 'yes';
        }

        $variants{$lang}->{outdated} = 'yes'
            if $lang ne 'en' and outofdate($dirname, $basename, $lang);
    }

    # create resulting file contents
    my $content = <<"    XML";
<?xml version="1.0" encoding="UTF-8" ?>
<!-- GENERATED FROM XML: DO NOT EDIT -->

<metafile>
  <basename>$basename</basename>
  <path>$dirname</path>
  <relpath>$relative</relpath>

  <variants>
    @{[
        join "\n    "
        => map
            qq{<variant@{[do{ my $lang = $_;
                map qq( $_="$variants{$lang}->{$_}")
                => keys %{$variants{$lang}};
            }]}>$_</variant>}
        => sort keys %variants
    ]}
  </variants>
</metafile>
    XML

    # read current variant file if exists
    my $existing = '';
    $curpath = docpath($metafile);
    if (-f $curpath) {
        local $/; # slurp mode /

        sysopen(FILE, $curpath, O_RDONLY)
            or die "could not open file '$curpath' ($!), stopped";

        $existing = <FILE>;

        close(FILE)
            or die "could not close file '$curpath' ($!), stopped";
    }

    # compare and possibly write new result to disk
    unless ($content eq $existing) {
        my $ppath = $metafile;
        $ppath =~ s,^/,,;

        sysopen(FILE, $curpath, O_WRONLY | O_CREAT | O_TRUNC)
            or die "could not open file '$curpath' ($!), stopped";

        print FILE $content
            or die "could not write into file '$curpath' ($!), stopped";

        close(FILE)
            or die "could not close file '$curpath' ($!), stopped";

        # report success
        print "'$ppath' written.\n";
    }
} # for (@files)

# get revision of the english original
sub reven($$) {
    my $dirname = shift;
    my $basename = shift;
    my $rev = $revs{"$dirname$basename"};

    unless ($rev) {
        my $curpath = docpath("$dirname$basename.xml");

        sysopen(FILE, $curpath, O_RDONLY)
            or die "could not open file '$curpath' ($!), stopped";

        {
            local $_;
            while (<FILE>) {
                $rev = $1, last if /<!-- \044LastChangedRevision:\s*(\S+)\s*\$ -->/;
            }
        }

        close(FILE)
            or die "could not close file '$curpath' ($!), stopped";

        $revs{"$dirname$basename"} = $rev;
    }

    return $rev;
}

# check out-of-dateness of a file
sub outofdate($$$) {
    my $dirname = shift;
    my $basename = shift;
    my $lang = shift;

    if (/^\Q$basename.xml/) {
        my $ood = 0;
        my $reven = reven($dirname, $basename);

        if ($reven) {
            my $curpath = docpath("$dirname$_");
            my ($rev, $orev);

            # grab the revision info from the source file
            sysopen(FILE, $curpath, O_RDONLY)
                or die "could not open file '$curpath' ($!), stopped";
            {
                local $_;
                while (<FILE>) {
                    $rev = $1, $orev=$2, last
                        if /<!--\s*English\s+Revision:\s*([^\s:]+)
                            (?::(\S+)\s+\(outdated\))?\s+-->/xi
                                             or
                           /<!--\s*English\s+Revision:\s*(\S+)\s+
                            (?:\(outdated:\s*(\S+)\s*\)\s+)?-->/xi;
                }
            }
            close(FILE)
                or die "could not close file '$curpath' ($!), stopped";

            # if outdated, take some action
            if ($rev and $rev ne $reven) {
                # note the actual revision in the source file
                unless ($orev and $orev eq $reven) {
                    my $cont;
                    sysopen(FILE, $curpath, O_RDONLY)
                        or die "could not open file '$curpath' ($!), stopped";
                    {
                        local $/; # slurp mode
                        $cont = <FILE>;
                    }
                    close(FILE)
                        or die "could not close file '$curpath' ($!), stopped";

                    unless (
                        $cont =~ s{<!--\s*English\s+Revision:\s*([^\s:]+)
                                   (?::\S+\s+\(outdated\))?\s+-->}
                            {<!-- English Revision: $1:$reven (outdated) -->}ix
                    ) {
                        $cont =~ s{<!--\s*English\s+Revision:\s*(\S+)\s+
                                   (?:\(outdated[^)]*\)\s+)?-->}
                            {<!-- English Revision: $1:$reven (outdated) -->}ix
                    }

                    sysopen(FILE, "$curpath.tmp", O_WRONLY | O_CREAT | O_TRUNC)
                        or die "could not open file '$curpath.tmp' ($!), stopped";
                    print FILE $cont
                        or die "could write file '$curpath.tmp' ($!), stopped";
                    close(FILE)
                        or die "could not close file '$curpath.tmp' ($!), stopped";

                    rename "$curpath.tmp", $curpath
                        or die "could not rename $curpath.tmp -> $curpath ".
                               "($!), stopped";

                    print substr($dirname, 1), $_, " adjusted (refers to: ",
                          $rev, ", current is: $reven)\n";
                }

                # record the filename for later output on the terminal
                $curpath = docpath(".outdated.$lang");
                sysopen(FILE, $curpath, O_WRONLY | O_CREAT | O_APPEND)
                    or die "could not open file '$curpath' ($!), stopped";

                print FILE substr("$dirname$_\n", 1);

                close(FILE)
                    or die "could not close file '$curpath' ($!), stopped";

                return 23; # true, soo true.
            }
        }
    }

    return;
}

__END__
sample file:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- GENERATED FROM XML: DO NOT EDIT -->

<metafile>
  <basename>quickreference</basename>
  <path>/mod/</path>
  <relpath>..</relpath>

  <variants>
    <variant pdf="quickreference.en.pdf">en</variant>
    <variant outdated="yes">ja</variant>
  </variants>
</metafile>
