#!/usr/bin/perl -w
# script to generate OOo bash_completion file for the main applications
# written by Rene Engelhard <rene@debian.org>, Public Domain
# updated for ooo-build by Petr Mladek <pmladek@suse.cz>, Public Domain
# yes, this script probably is not real good code :) but still easier
# to maintain than adding those entries statically many times in
# a file...

use strict;

my @DRAWDOCS=("sxd", "std", "dxf", "emf", "eps", "met", "pct", "sgf", "sgv", "sda",
	   "sdd", "vor", "svm", "wmf", "bmp", "gif", "jpg", "jpeg", "jfif", "fif",
	   "jpe", "pcd", "pcx", "pgm", "png", "ppm", "psd", "ras", "tga", "tif",
	   "tiff", "xbm", "xpm", "odg", "otg", "odc", "odi", "sds");

my @IMPRESSDOCS=("sxi", "sti", "ppt", "pps", "pot", "sxd", "sda", "sdd", "sdp",
	      "vor", "cgm", "odp", "otp");

my @TEMPLATES=("stw", "dot", "vor", "stc", "xlt", "sti", "pot", "std", "stw");

my @MATHDOCS=("sxm", "smf", "mml", "odf");

my @MASTERDOCS=("sxg", "xgl", "txt", "odm", "sgl");

my @WRITERDOCS=("doc", "dot", "rtf", "sxw", "stw", "sdw", "vor", "txt", "htm?",
	     "xml", "wp", "wpd", "odt", "ott");

my @WEBDOCS=("htm", "html", "stw", "txt", "vor", "oth");

my @BASEDOCS=("odb");

my @CALCDOCS=("sxc", "stc", "dif", "dbf", "xls", "xlw", "xlt", "rtf", "sdc", "vor",
	   "slk", "txt", "htm", "html", "wk1", "wks", "123", "xml", "ods", "ots",
	   "csv");

# default names of oowrappers
# use "" if you want to disable any wrapper
my %APPS = (
	office		=> "ooffice",
	master		=> "",
	base		=> "oobase",
	calc		=> "oocalc",
	draw		=> "oodraw",
	impress		=> "ooimpress",
	math		=> "oomath",
	template	=> "oofromtemplate",
	web		=> "ooweb",
	writer		=> "oowriter",
);

sub usage()
{
    print "Script to Generate bash completion for OOo wrappers\n\n";

    print "Usage: $0 --help\n";
    print "       $0 [--binsuffix=suffix]\n";
    print "\t\t[--office=wrapper_name]\n";
    print "\t\t[--master=wrapper_name]\n";
    print "\t\t[--base=wrapper_name]\n";
    print "\t\t[--calc=wrapper_name]\n";
    print "\t\t[--draw=wrapper_name]\n";
    print "\t\t[--impress=wrapper_name]\n";
    print "\t\t[--math=wrapper_name]\n";
    print "\t\t[--template=wrapper_name]\n";
    print "\t\t[--web=wrapper_name]\n";
    print "\t\t[--writer=wrapper_name]\n";
    print "\t\tinput_file\n";
    print "\t\toutput_file\n\n";

    print "Options:\n";
    print "\t--help\t\tprint this help\n";
    print "\t--binsuffix\tdefines a suffix that is added after each wrapper\n";

    print "The other options allows to redefine the wrapper names.\n";
    print "The value \"\" can be used to disable any wrapper.\n\n";
}

my $infilename;
my $outfilename;
my $binsuffix = '';

my $opt;
foreach my $arg (@ARGV) {
	if ( $arg =~ /--help/ ) {
		usage();
		exit 0;
	} elsif ( $arg =~ /--binsuffix=(.*)/ ) {
		$binsuffix="$1";
	} elsif ( $arg =~ /--office=(.*)/ ) {
		$APPS{'office'} = "$1";
	} elsif ( $arg =~ /--master=(.*)/ ) {
		$APPS{'master'} = "$1";
	} elsif ( $arg =~ /--base=(.*)/ ) {
		$APPS{'base'} = "$1";
	} elsif ( $arg =~ /--calc=(.*)/ ) {
		$APPS{'calc'} = "$1";
	} elsif ( $arg =~ /--draw=(.*)/ ) {
		$APPS{'draw'} = "$1";
	} elsif ( $arg =~ /--impress=(.*)/ ) {
		$APPS{'impress'} = "$1"
	} elsif ( $arg =~ /--math=(.*)/ ) {
		$APPS{'math'} = "$1";
	} elsif ( $arg =~ /--template=(.*)/ ) {
		$APPS{'template'} = "$1";
	} elsif ( $arg =~ /--web=(.*)/ ) {
		$APPS{'web'} = "$1";
	} elsif ( $arg =~ /--writer=(.*)/ ) {
		$APPS{'writer'} = "$1"
	} elsif ( $arg =~ /^-.*/ ) {
		printf STDERR "Error: invalid option \"$arg\", try --help\n";
		exit 1;
	} elsif ( $outfilename ) {
		printf STDERR "Error: too much arguments, try --help\n";
		exit 1;
	} else {
		if ($infilename) {
		    $outfilename = "$arg";
		} else {
		    $infilename = "$arg";
		}
	}
}

unless ( $infilename ) {
	printf STDERR "Error: undefined input file, try --help\n";
	exit 1;
}
	
unless ( $outfilename ) {
	printf STDERR "Error: undefined output file, try --help\n";
	exit 1;
}
    
#add binsuffix
foreach my $app (keys %APPS) {
    $APPS{$app} .= "$binsuffix" unless ( "$APPS{$app}" eq "" );
}

sub print_suffixes_check {
    my $app = shift(@_);
    my $first_suffix = shift(@_);
    
    ($first_suffix) || die "Error: No suffix defined for $app\n";
    
    print BCOUTFILE "    $app)\t\te=\'!*.+($first_suffix";
    foreach my $suffix (@_) {
	print BCOUTFILE "|$suffix";
    }
    print BCOUTFILE ")\' ;;\n";
}

sub print_suffixes_checks {
    foreach my $app (keys %APPS) {
	# skip the disabled wrapper
	next if ( $APPS{$app} eq "" );

	if ($app eq "draw" ) { print_suffixes_check ($APPS{$app}, @DRAWDOCS); }
	if ($app eq "writer") { print_suffixes_check ($APPS{$app}, @WRITERDOCS); }
	if ($app eq "web") { print_suffixes_check ($APPS{$app}, @WEBDOCS); }
	if ($app eq "math") { print_suffixes_check ($APPS{$app}, @MATHDOCS); }
	if ($app eq "impress") { print_suffixes_check ($APPS{$app}, @IMPRESSDOCS); }
	if ($app eq "base") { print_suffixes_check ($APPS{$app}, @BASEDOCS); }
	if ($app eq "calc") { print_suffixes_check ($APPS{$app}, @CALCDOCS); }
	if ($app eq "master") { print_suffixes_check ($APPS{$app}, @MASTERDOCS); }
	if ($app eq "template") { print_suffixes_check ($APPS{$app}, @TEMPLATES); }
	# ooffice should contain all...
	if ($app eq "office") { print_suffixes_check ($APPS{$app}, @DRAWDOCS, @WRITERDOCS, @MATHDOCS, @IMPRESSDOCS, @BASEDOCS, @CALCDOCS, @MASTERDOCS, @TEMPLATES, @WEBDOCS); }
    }
}    

sub print_apps {
    my $app_to_print;
    foreach my $app (keys %APPS) {
	# skip the disabled wrapper
	next if ( $APPS{$app} eq "" );
	
	print BCOUTFILE "\t\t\t\t\t$app_to_print \\\n" if ($app_to_print);
	$app_to_print = $APPS{$app};
    }
    # the last app will be printed without the final backslash
    ($app_to_print) || die "Error: No OOo wrapper was selected\n";
    print BCOUTFILE "\t\t\t\t\t$app_to_print\n";
}


open (BCINFILE, "$infilename") || die "Error: can't open $infilename for reading: $!\n";
open (BCOUTFILE, "> $outfilename") || die "Error: can't open $outfilename for writing: $!\n";

while (my $line = <BCINFILE>) {
    chomp $line;

    if ($line =~ m/\@BASH_COMPLETION_SUFFIXES_CHECKS\@/) {
	print_suffixes_checks();
    } elsif ($line =~ m/\@BASH_COMPLETION_OOO_APPS\@/) {
	print_apps();
    } else {
	print BCOUTFILE "$line\n";
    }
}

close (BCINFILE);
close (BCOUTFILE);
