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



my $completelangiso_var = $ENV{COMPLETELANGISO_VAR};
my $lastcompletelangiso_var;;
my $outfile = "";

if ( !defined $completelangiso_var) {
	print STDERR "ERROR: No language defined!\n";
	exit 1;
}

my $poorhelplocalizations_var = $ENV{WITH_POOR_HELP_LOCALIZATIONS};
my %poorhelplocalizations;
foreach $lang (split (/ /, $poorhelplocalizations_var)) {
  $poorhelplocalizations{$lang}++;
}

startup_check();
if ( "$completelangiso_var" eq "$lastcompletelangiso_var" ) {
    print STDERR "No new languages. Keeping old file\n";
    exit 0;
}

my @completelangiso = split " +", $completelangiso_var;

open OUTFILE, ">$outfile" or die "$0 ERROR: cannot open $outfile for writing!\n";

print OUTFILE "// generated file, do not edit\n\n";
print OUTFILE "// languages used for last time generation\n";
print OUTFILE "// completelangiso: $completelangiso_var\n\n";
write_ALL_LANG();
write_OTHER_LANGS();
write_DIR_ISOLANGUAGE_ALL_LANG_2();
write_DIR_ISOLANGUAGE_ALL_LANG();
write_DIR_ISOLANGUAGE_ALL_LANG_LPROJ();
write_DIR_IDENT_ALL_LANG();
write_EXTRA_ALL_LANG();
write_EXTRA_ALL_LANG_BUT_EN_US();
write_EXTRA_ALL_GOOD_HELP_LOCALIZATIONS_LANG();
write_EXTRA_IDENT_ALL_LANG();
write_RESFILE_ALL_LANG();
write_SHORT_RESFILE_ALL_LANG();
write_README_ALL_LANG();
write_README_TXT_ALL_LANG();
write_VALUE_ALL_LANG_LETTER_DIR();
write_KEY_ALL_LANG_LETTER();
write_FILE_ALL_LANG_LETTER();

close OUTFILE;


sub write_ALL_LANG
{
	print OUTFILE "#define ALL_LANG(ident, resid) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tident ($lang) = resid";
		print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_OTHER_LANGS
{
	print OUTFILE "#define OTHER_LANGS ";
	foreach $lang (@completelangiso) {
        next if ( $lang eq "en-US");
		print OUTFILE "\\\n\tDosName ($lang) = \"$lang\"";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
        print OUTFILE "\n\n";
}

sub write_DIR_ISOLANGUAGE_ALL_LANG_2
{
	print OUTFILE "#define DIR_ISOLANGUAGE_ALL_LANG_2 ";
	print OUTFILE "\\\n\tDosName (en-US) = \"en-US\"; \\\n\t";
	print OUTFILE "OTHER_LANGS";
        print OUTFILE "\n\n";
}

sub write_DIR_ISOLANGUAGE_ALL_LANG
{
	print OUTFILE "#define DIR_ISOLANGUAGE_ALL_LANG ";
	print OUTFILE "\\\n\tDosName (en-US) = \"en\"; \\\n\t";
	print OUTFILE "OTHER_LANGS";
        print OUTFILE "\n\n";
}

sub write_DIR_ISOLANGUAGE_ALL_LANG_LPROJ
{
    print OUTFILE "#define DIR_ISOLANGUAGE_ALL_LANG_LPROJ ";
    foreach $lang (@completelangiso) {
    	my $speciallang = $lang;
    	if ( $speciallang eq "en-US" ) { $speciallang = "en"; }
        print OUTFILE "\\\n\tDosName ($lang) = \"$speciallang.lproj\"";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
    }
    print OUTFILE "\n\n";
}

sub write_DIR_IDENT_ALL_LANG
{
	print OUTFILE "#define DIR_IDENT_ALL_LANG(name) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tDosName ($lang) = STRING(name)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_EXTRA_ALL_LANG
{
	print OUTFILE "#define EXTRA_ALL_LANG(name,ext) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tName ($lang) = CONFIGLANGFILENAME(name,_$lang,ext)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_EXTRA_ALL_LANG_BUT_EN_US
{
    print OUTFILE "#define EXTRA_ALL_LANG_BUT_EN_US(name,ext) ";
    my $first = 1;
    foreach $lang (@completelangiso) {
        if ($lang ne "en-US") {
            print OUTFILE "; " unless $first;
            $first = 0;
            print OUTFILE
                "\\\n\tName ($lang) = CONFIGLANGFILENAME(name,_$lang,ext)";
        }
    }
    print OUTFILE "\n\n";
}

sub write_EXTRA_ALL_GOOD_HELP_LOCALIZATIONS_LANG
{
    my $first = 1;
	print OUTFILE "#define EXTRA_ALL_GOOD_HELP_LOCALIZATIONS_LANG(name) ";
	foreach $lang (@completelangiso) {
		next if ( $poorhelplocalizations{$lang} );
		print OUTFILE ";" unless $first;
		$first = 0;
		print OUTFILE "\\\n\tName ($lang) = EXTRAFILENAME(name,_$lang)";
	}
	print OUTFILE "\n\n";
}

sub write_EXTRA_IDENT_ALL_LANG
{
	print OUTFILE "#define EXTRA_IDENT_ALL_LANG(name) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tName ($lang) = STRING(name)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_RESFILE_ALL_LANG
{
	print OUTFILE "#define RESFILE_ALL_LANG(name) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tName ($lang) = RESFILENAME(name,$lang)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_SHORT_RESFILE_ALL_LANG
{
	print OUTFILE "#define SHORT_RESFILE_ALL_LANG(name) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tName ($lang) = SHORTRESFILENAME(name,$lang)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_README_ALL_LANG
{
	print OUTFILE "#define README_ALL_LANG(key, name) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tkey ($lang) = READMEFILENAME(name,_$lang)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_README_TXT_ALL_LANG
{
	print OUTFILE "#define README_TXT_ALL_LANG(key, name, ext) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tkey ($lang) = READMETXTFILENAME(name,_$lang,ext)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

# FIXME: Not used at all in OOo?, #i38597#
sub write_VALUE_ALL_LANG_LETTER_DIR
{
	print OUTFILE "#define VALUE_ALL_LANG_LETTER_DIR ";
	print OUTFILE "\\\n\tValue (en-US) = STRING(en);";
	foreach $lang (@completelangiso) {
        next if ( $lang eq "en-US");
		print OUTFILE "\\\n\tValue ($lang) = STRING($lang)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_KEY_ALL_LANG_LETTER
{
	print OUTFILE "#define KEY_ALL_LANG_LETTER ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tKey ($lang) = STRING($lang)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub write_FILE_ALL_LANG_LETTER
{
	print OUTFILE "#define FILE_ALL_LANG_LETTER(name, ext) ";
	foreach $lang (@completelangiso) {
		print OUTFILE "\\\n\tName ($lang) = CONFIGLANGFILENAME(name,$lang,ext)";
        print OUTFILE "; " if ( $lang ne $completelangiso[$#completelangiso]);
	}
	print OUTFILE "\n\n";
}

sub startup_check
{
    my $i;
    for ( $i=0; $i <= $#ARGV; $i++) {
        if ( "$ARGV[$i]" eq "-o" ) {
            if ( defined $ARGV[ $i + 1] ) {
                $outfile = $ARGV[ $i + 1];
            } else {
                usage();
            }
        }
    }
    usage() if $i<2;
    usage() if "$outfile" eq "";
    if ( -f "$outfile" ) {
		# changed script - run allways
		return if (stat($0))[9] > (stat("$outfile"))[9] ;

        open OLDFILE, "$outfile" or die "$0 - ERROR: $outfile exists but isn't readable.\n";
        while ( $line = <OLDFILE> ) {
            if ( $line =~ /^\/\/.*completelangiso:/ ) {
                $lastcompletelangiso_var = $line;
                chomp $lastcompletelangiso_var;
                $lastcompletelangiso_var =~ s/^\/\/.*completelangiso:\s*//;
                last;
            }
                
        }
        close OLDFILE;
    }
}

sub usage
{
    print STDERR "Generate language dependend macros use in *.scp files\n";
    print STDERR "perl $0 -o outputfile\n";
    exit  1;
}
