#!/usr/bin/env raku

use v6.d;

use Blogin;
use Blogin::Log;
use Blogin::Config;
use Blogin::Scaffold;

my %*SUB-MAIN-OPTS = :named-anywhere;

sub make-log(Bool :$verbose --> Blogin::Log) {
  my $level = $verbose ?? 'verbose' !! 'normal';

  Blogin::Log.new(:$level);
}

multi sub MAIN(
  'build',
  Str  :$src = 'content',
  Str  :$out,
  Bool :$drafts = False,
  Bool :$future = False,
  Int  :$jobs,
  Bool :$debug,
  Bool :$force = False,
  Bool :$verbose = False,
) {
  my $log    = make-log(:$verbose);
  my $config = Blogin::Config.load($src.IO.parent.add('blogin.json'));

  my %overrides;
  %overrides<out>   = $out.IO if $out.defined;
  %overrides<debug> = $debug  if $debug.defined;

  Blogin::build(
    :src($src.IO),
    :$config,
    :$drafts,
    :$future,
    :$force,
    jobs => ($jobs // ($*KERNEL.cpu-cores // 1)),
    :$log,
    |%overrides,
  );

  $log.info('build complete');
}

multi sub MAIN(
  'init',
  Str  $dir = '.',
  Str  :$framework = 'none',
  Bool :$force = False,
  Bool :$verbose = False,
) {
  my $log = make-log(:$verbose);

  Blogin::Scaffold::init($dir.IO, :$framework, :$force);

  $log.info("scaffolded a Blogin site in $dir");
}

multi sub MAIN(
  'new',
  Str  $title,
  Str  :$src = 'content',
  Str  :$section,
  Bool :$verbose = False,
) {
  my $log     = make-log(:$verbose);
  my $config  = Blogin::Config.load($src.IO.parent.add('blogin.json'));
  my $in      = $section // $config.home-section;

  my $file = Blogin::Scaffold::new-post($title, content => $src.IO, section => $in);

  $log.info("created $file");
}

multi sub MAIN(
  'serve',
  Str  :$src = 'content',
  Int  :$port = 3000,
  Bool :$verbose = False,
) {
  $*OUT.out-buffer = False;

  my $log = make-log(:$verbose);

  $log.info('Starting Blogin server');

  $log.step('Loading modules... ');
  my $started = now;
  require Blogin::Server <&serve>;
  $log.info(sprintf('%.1fs', (now - $started).Real));

  my $config = Blogin::Config.load($src.IO.parent.add('blogin.json'));

  serve(
    content => $src.IO,
    out     => $config.output-dir.IO,
    :$config,
    :$port,
    :$log,
  );
}

multi sub MAIN(
  'clean',
  Str  :$out,
  Bool :$verbose = False,
) {
  my $log    = make-log(:$verbose);
  my $config = Blogin::Config.load('blogin.json'.IO);
  my $target = ($out // $config.output-dir).IO;

  my $removed = Blogin::clean(:out($target), :$log);

  $log.info("cleaned $target ($removed files)");
}
