#!/usr/bin/env perl
# The above is a portable way to invoke Perl, according to the GNU Autotools
# book. It is useful since we don't know where perl is installed.
#
# evolution-move-tasks: a Perl script to move tasks from the Calendar folder
#	to the new Tasks folder.
#

use diagnostics;

# You may have to change this if your Evolution files are somewhere else.
$EVOLUTION_DIR = "$ENV{'HOME'}/evolution";

$CALENDAR_DIR = "$EVOLUTION_DIR/local/Calendar";
$TASKS_DIR = "$EVOLUTION_DIR/local/Tasks";

# Create the Tasks folder if needed.
&EnsureTasksFolderExists ($TASKS_DIR);

# Get any tasks from the calendar .ics file.
$tasks = &LoadTasks ("$CALENDAR_DIR/calendar.ics");

# Get any tasks already in the tasks .ics file.
$tasks .= &LoadTasks ("$TASKS_DIR/tasks.ics");

# Create a new Tasks .ics file containing all the tasks.
&OutputTasks ("$TASKS_DIR/tasks.new", $tasks);

# Move the existing tasks file to a backup.
if (-e "$TASKS_DIR/tasks.ics") {
    rename "$TASKS_DIR/tasks.ics", "$TASKS_DIR/tasks.bak"
	|| die "Can't rename $TASKS_DIR/tasks.ics to $TASKS_DIR/tasks.bak";
}

# Move the new file into position.
rename "$TASKS_DIR/tasks.new", "$TASKS_DIR/tasks.ics"
    || die "Can't rename $TASKS_DIR/tasks.new to $TASKS_DIR/tasks.ics";

# Move the new Calendar file (without the Tasks) into position.
rename "$CALENDAR_DIR/calendar.ics.new", "$CALENDAR_DIR/calendar.ics"
    || die "Can't rename $TASKS_DIR/tasks.new to $TASKS_DIR/tasks.ics";

0;


# If the evolution/local/Tasks folder does not exist, this creates it and
# creates the metadata XML file.
sub EnsureTasksFolderExists {
    my ($tasks_dir) = @_;

    return if (-e $tasks_dir);

    print "Creating Tasks folder in: $tasks_dir\n";

    mkdir ($tasks_dir, 0777)
	|| die "Can't create Tasks folder directory: $tasks_dir";

    $metadata = "$tasks_dir/folder-metadata.xml";
    open (METADATA, ">$metadata")
	|| die "Can't create metadata file: $metadata";

    print METADATA <<EOF;
<?xml version="1.0"?>
<efolder>
	<type>tasks</type>
	<description>Tasks</description>
</efolder>
EOF

    close (METADATA);
}


sub LoadTasks {
    my ($icalendar_file) = @_;

    return "" if (! -e $icalendar_file);

    open (ICSFILE, $icalendar_file)
	|| die "Can't open iCalendar file: $icalendar_file";

    open (NEWICSFILE, ">$icalendar_file.new")
	|| die "Can't open iCalendar file: $icalendar_file.new";

    $tasks = "";
    $in_task = 0;
    while (<ICSFILE>) {
	if ($in_task) {
	    $tasks .= $_;

	    if (m/^END:VTODO/) {
		$in_task = 0;
	    }

	} else {
	    if (m/^BEGIN:VTODO/) {
		print "Found task\n";

		$tasks .= $_;
		$in_task = 1;
	    } else {
		print NEWICSFILE $_;
	    }
	}
    }

    close (NEWICSFILE);
    close (ICSFILE);

    return $tasks;
}


sub OutputTasks {
    my ($icalendar_file, $tasks) = @_;

    open (ICSFILE, ">$icalendar_file")
	|| die "Can't create iCalendar file: $icalendar_file";

    print ICSFILE <<EOF;
BEGIN:VCALENDAR
CALSCALE
 :GREGORIAN
PRODID
 :-//Helix Code//NONSGML Evolution Calendar//EN
VERSION
 :2.0
$tasks
END:VCALENDAR
EOF

    close (ICSFILE);
}


