The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Galileo::Command::dump;
use Mojo::Base 'Mojolicious::Command';
use File::Spec;
use Mojo::Util qw/encode spurt/;
use Getopt::Long qw/GetOptionsFromArray/;

has description => "Dump all stored pages as markdown\n";
has usage => <<END;
usage: $0 dump [options]
options: 

--directory,-d
  An optional directory to dump to may be specified; the directory 
  must exist. By default it dumps to the current working directory.

--title,-t
  By default the title of the page is included as an HTML comment.
  This option accepts an sprintf format for including the title.
  As a special case, if this flag is given without argument, an h1 
  title is created.

--encoding,-e
  An encoding type. Defaults to UTF-8. Available encodings are the
  same as Encode module of Perl.
END

sub run {
  my $self = shift;

  GetOptionsFromArray( \@_,
    'directory=s' => \my $dir,
    'title:s'     => \(my $title = '<!-- %s -->'),
    'encoding:s'  => \(my $encoding = 'UTF-8'),
  );

  $title = '# %s' unless $title;
  if ( $dir and ! -d $dir ) {
    die qq{Directory "$dir" does not exist\n};
  }

  my $pages = $self->app->schema->resultset('Page')->search;
  while ( my $page = $pages->next ) {
    my $file = $page->name . '.md';
    $file = File::Spec->catfile( $dir, $file ) if $dir;

    my $content = sprintf "$title\n", $page->title;
    $content .= $page->md;
    $content = encode($encoding, $content) if $encoding;
    spurt $content, $file;
  }

  say "Export Complete";
}

1;