package Spork::Command;
use Spork -Base;

sub boolean_arguments { qw( -new -make -start -compress -showconf) }
sub process {
    $self->call_handler(@_);
    $self->hub->remove_hooks;
}

sub call_handler {
    my ($args,@others) = $self->parse_arguments(@_);
    return $self->new_spork if $args->{-new};
    return $self->make_spork if $args->{-make};
    return $self->start_spork if $args->{-start};
    return $self->show_config if $args->{-showconf};
    return $self->handle_compress(@others) if $args->{-compress};
    return $self->usage;
}

sub handle_compress {
    eval q{use mixin 'Spoon::Installer'};
    $self->compress_lib(@_);
}

sub new_spork {
    my @files = io('.')->all;
    die "Can't make new spork in a non-empty directory\n"
      if @files;
    warn "Extracting sample slideshow: Spork.slides...\n";
    $self->hub->slides->extract_files;
    warn "Extracting sample configuration file: config.yaml...\n";
    $self->hub->config->extract_files;
    warn "Done. Now edit these files and run 'spork -make'.\n\n"
}

sub make_spork {
    $self->assert_registry;
    unless (-e $self->hub->template->extract_to) {
        warn "Extracting template files...\n";
        $self->hub->template->extract_files;
    }
    {
        use Cwd;
        my $home = cwd;
        chdir io->dir($self->hub->config->slides_directory)->assert->open->name;
        my $kwiki_command = $self->hub->kwiki_command;
        for my $class (@{$self->hub->config->plugin_classes}) {
            eval "use $class; 1" or die $@;
            my $class_id = $class->new->class_id;
            $self->hub->config->add_config({"${class_id}_class" => $class});
            $kwiki_command->install($class_id);
        }
        chdir $home;
    }
    warn "Creating slides...\n";
    $self->hub->slides->make_slides;
    warn "Slideshow created! Now run try running 'spork -start'.\n\n";
}

sub start_spork {
    my $command = $self->hub->config->start_command
      or die "No start_command in configuration";
    warn $command, "\n";
    exec $command;
}

sub show_config {
    my $conf = $self->hub->config;
    delete $conf->{script_name};
    delete $conf->{site_title};
    delete $conf->{logo_image};
    delete $conf->{main_page};
    /_class$/ && delete $conf->{$_} for keys %$conf;
    print YAML::Dump($conf);
}

sub usage {
    warn <<END;
usage:
  spork -new                  # Generate a new slideshow in an empty directory
  spork -make                 # Turn the text into html slides
  spork -start                # Start the show in a browser
  spork -showconf             # Dump a YAML of the effective configuration data
END
}

sub assert_registry {
    use Kwiki::Plugin;
    {
        no warnings;
        *Kwiki::Plugin::init = sub {};
    }
    $self->hub->registry->load;
}

__END__

=head1 NAME

Spork::Command - Slide Presentations (Only Really Kwiki)

=head1 SYNOPSIS

=head1 DESCRIPTION

=head1 AUTHOR

Ingy döt Net <ingy@cpan.org>

=head1 COPYRIGHT

Copyright (c) 2004, 2005. Brian Ingerson. All rights reserved.
Copyright (c) 2007. Ingy döt Net. All rights reserved.

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

See http://www.perl.com/perl/misc/Artistic.html

=cut
