#!/usr/bin/perl -w

use strict;
use DBI;
use File::Basename;

my $dbh;
my $sth_insert_files;
my $sth_insert_category;
my $sth_insert_mimetype;
my $sth_max;

my $pkgkey=$ENV{'REPOCOP_PKG_KEY'};

my @findpath;
foreach (qw!/usr/share/applications /usr/share/applnk /usr/share/servicetypes /usr/share/services /usr/share/apps!) {
    push @findpath,$ENV{'REPOCOP_PKG_ROOT'}.$_ if -d $ENV{'REPOCOP_PKG_ROOT'}.$_;
}
exit 0 unless @findpath;

&connect();

open my $dh, "find @findpath -name '*.desktop' |"  or die $!;
#foreach my $filename(glob $ENV{'REPOCOP_PKG_ROOT'}."/usr/share/applications/*.desktop") {
while (my $filename=<$dh>) {
    my $rawfile='';
    open my $fh, $filename or die $!;
    my %key;
    while (<$fh>) {
	$rawfile.=$_;
	chomp;
	s/\s+$//;
	$key{$1}=$2 if /^(\w+)=(.*)/;
    }
    close $fh;
    $filename=~s/^$ENV{'REPOCOP_PKG_ROOT'}//;
    if ($filename=~m!^/usr/share/applications/!) {
	my $retval=`desktop-file-validate $ENV{'REPOCOP_PKG_ROOT'}$filename`;
	chomp $retval;
	if ($retval) {
	    $retval=~s/$ENV{'REPOCOP_PKG_ROOT'}//g;
	    if ($retval=~/error:/) {
		system('repocop-test-warn', "desktop-file-validate utility exited abnormally with the following message(s):",$retval);
	    } else {
		system('repocop-test-info', "desktop-file-validate utility printed the following message(s):",$retval);
	    }
	}
    }
    $sth_max->execute();
    my ($desktopid)=$sth_max->fetchrow_array();
#       DESKTOPTYPE TEXT DEFAULT '',
#       ICON TEXT DEFAULT '',
#       APPEXEC TEXT DEFAULT '',
#       IS_HIDDEN INTEGER,
#       IS_ONLYSHOWIN INTEGER,
#       IS_NOTSHOWIN INTEGER,
#       IS_NODISPLAY INTEGER,
#       IS_TERMINAL INTEGER,
    sub bool {
	my $val=$key{$_[0]};
	return 0 if (not $val);
	return 0 if $val eq 'false';
	return 1;
    } 
    $sth_insert_files->execute($desktopid,$pkgkey,dirname($filename),basename($filename),
			       $key{'Type'},$key{'Icon'},$key{'Exec'},$rawfile,
			       bool('Hidden'),bool('OnlyShowIn'),bool('NotShowIn'),bool('NoDisplay'),
			       bool('Terminal'));
    if ($key{'Categories'}) {
	foreach (split (';',$key{'Categories'})) {
	    $sth_insert_category->execute($desktopid,$_) if $_;
	}
    }

    if ($key{'MimeType'}) {
	foreach (split (';',$key{'MimeType'})) {
	    $sth_insert_mimetype->execute($desktopid,$_) if $_;
	}
    }
}

&disconnect();

sub connect {
    my $dbfile=$ENV{'REPOCOP_TEST_DB'};
    die "database is not initialized properly!" unless $dbfile;
    $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","", {
	PrintError => 1,
	AutoCommit => 0,
			}) or die $dbh->errstr;
    $sth_max=$dbh->prepare('SELECT MAX(DESKTOPID)+1 FROM freedesktop_desktop');
    $sth_insert_files=$dbh->prepare('INSERT INTO freedesktop_desktop VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)') or die $dbh->errstr;
    $sth_insert_category=$dbh->prepare('INSERT INTO freedesktop_desktop_categories VALUES(?,?)') or die $dbh->errstr;
    $sth_insert_mimetype=$dbh->prepare('INSERT INTO freedesktop_desktop_mimetypes VALUES(?,?)') or die $dbh->errstr;
}

sub disconnect {
    $dbh->commit;
    $sth_insert_files->finish;
    # hack around closing dbh with active statement handles bug
    local $SIG{'__WARN__'} = sub {};
    $dbh->disconnect;
}

