#!/usr/bin/perl -w
use strict;
use Getopt::Long;

my ($dbtype, $dbname, $dbuser, $dbpass, $dbhost, $dbport, $help, $id, $node_name, $version);
GetOptions( "type=s"         => \$dbtype,
            "name=s"         => \$dbname,
            "user=s"         => \$dbuser,
            "pass=s"         => \$dbpass,
            "host=s"         => \$dbhost,
            "port=s"         => \$dbport,
            "help"           => \$help,
            "id=s"           => \$id,
            "nodename=s"     => \$node_name,
            "version=s"      => \$version,
          );

unless (defined($dbtype)) {
    print "You must supply a database type with the --type option.\n";
    print "Further help can be found by typing 'perldoc $0'\n";
    exit 1;
}

unless (defined($dbname)) {
    print "You must supply a database name with the --name option.\n";
    print "Further help can be found by typing 'perldoc $0'\n";
    exit 1;
}

if(defined($id) and defined($node_name)) {
    print "You should supply either a node name, or an id, but not both.\n";
    print "Further help can be found by typing 'perldoc $0'\n";
    exit 1;
}

if(not defined($id) and not defined($node_name)) {
    print "You must supply the id of the node with the --id option,\n";
    print " or the node name of the node with the --nodename option.\n";
    print "Further help can be found by typing 'perldoc $0'\n";
    exit 1;
}

if ($help) {
    print "Help can be found by typing 'perldoc $0'\n";
    exit 0;
}

my %setup_modules = ( postgres => "Wiki::Toolkit::Store::Pg",
                      mysql    => "Wiki::Toolkit::Store::MySQL",
                      sqlite  => "Wiki::Toolkit::Store::SQLite"
);

unless ( defined($setup_modules{$dbtype}) ) {
    print "dbtype must be one of 'postgres', 'mysql', and 'sqlite'\n";
    print "further help can be found by typing 'perldoc $0'\n";
    exit 1;
}

# Load classes
require Wiki::Toolkit;
my $class = $setup_modules{$dbtype};
eval "require $class";
if ( $@ ) {
    print "Couldn't 'use' $class: $@\n";
    exit 1;
}

# Create a store instance
my $store;
my $args = "dbname=>'$dbname', dbuser=>'$dbuser'";
if($dbpass) {
    $args .= ", dbpass=>'$dbpass'";
}
if($dbhost) {
    $args .= ", dbhost=>'$dbhost'";
}
if($dbport) {
    $args .= ", dbport=>'$dbport'";
}
eval "\$store = $class->new($args);";

# Create a Wiki instance
my $wiki = Wiki::Toolkit->new(store=>$store);

# If they gave the ID, get the name
if($id) {
    $node_name = $wiki->store->node_name_for_id($id);
    unless($node_name) {
        die("No node found with id '$id'\n");
    }
}

# Report what we're going to do
print "Deleting node with name '$node_name'";
if($id) {
    print " (id $id)";
}
if($version) {
    print " at version $version";
}
print "\n";

# Do the delete
$wiki->delete_node(name => $node_name, version => $version);

# All done
print "done.\n";

=head1 NAME

wiki-toolkit-delete-node - Delete a node stored in a Wiki::Toolkit instance.

=head1 SYNOPSIS

  # Delete a node in a Wiki::Toolkit instance

  wiki-toolkit-delete-node --type postgres
           --name mywiki \
           --user wiki  \
           --pass wiki \
           --host 'db.example.com' \
           --port 1234 \
           --nodename MyNodeName 

  wiki-toolkit-delete-node --type postgres
           --name mywiki \
           --user wiki  \
           --pass wiki \
           --host 'db.example.com' \
           --port 1234 \
           --id 2 \
           --version 7

=head1 DESCRIPTION

Takes four mandatory arguments:

=over 4

=item type

The database type.  Should be one of 'postgres', 'mysql' and 'sqlite'.

=item name

The database name.

=item nodename

The name of the node to be deleted.

=item id

The id of the node to be deleted

=back

four optional arguments:

=over 4

=item user

The user that connects to the database. It must have permission
to create and drop tables in the database.

=item pass

The user's database password.

=item host

The hostname of the machine the database server is running on (omit
for local databases).

=item port

The port number that the database server is expecting connections to.

=item version

The version number of the node to delete

=back

=head1 AUTHOR

Nick Burch

=head1 COPYRIGHT

     Copyright (C) 2006 Nick Burch.  All Rights Reserved.

This code is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=head1 SEE ALSO

L<Wiki::Toolkit>

=cut

1;