#!/usr/bin/env perl

=pod

=head1 NAME

wrt-feed - print an Atom or JSON feed from given wrt entries

=head1 USAGE

    # Print most recent entries:
    wrt feed
    wrt feed --json

    # Print entries for a specific month:
    wrt feed 2019/11
    wrt feed --json 2019/11

=head1 DESCRIPTION

Detailed documentation can be found in the L<App::WRT> man page or at
L<https://code.p1k3.com/gitea/brennen/wrt>.

=head1 LICENSE

    wrt is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

=head1 AUTHOR

Brennen Bearnes <code@p1k3.com>

=cut

use 5.14.0;

use strict;
use warnings;
no  warnings 'uninitialized';
use utf8;
use open qw(:std :utf8);

# use Data::Dumper;
use App::WRT;

use Carp;
use Getopt::Long qw(GetOptionsFromArray);
use Pod::Usage;

# If invoked directly from the command-line, caller() will return undef.
# Execute main() with a callback to print output directly, and a copy of
# our real @ARGV:
if (not caller()) {
  my $output = sub { say @_; };
  my $retval = main($output, @ARGV);
  exit($retval);
}

sub main {
  my ($output, @local_argv) = @_;
  # Handle options, including help generated from the POD above.  See:
  # - http://perldoc.perl.org/Getopt/Long.html#User-defined-subroutines-to-handle-options
  # - https://metacpan.org/pod/Pod::Usage
  # - http://michael.thegrebs.com/2014/06/08/Pod-Usage/
  my $from_stdin  = 0;
  my $print_json  = 0;
  my $config_file = 'wrt.json';
  GetOptionsFromArray(
    \@local_argv,

    stdin      => \$from_stdin,
    json       => \$print_json,
    'config=s' => \$config_file,
    help       => sub { pod2usage(0) },

  ) or pod2usage(2);

  unless (-e $config_file) {
    croak "No wrt config file found.  Tried: $config_file";
  }

  my $w = App::WRT::new_from_file($config_file);

  # With --stdin, take names of entries to display from standard input, one line
  # per name.  Otherwise, take names from arguments if any are given, or fall
  # back to most recent entries.
  my @to_display = ();
  if ($from_stdin) {
    while (my $entry = <>) {
      chomp($entry);
      push @to_display, $entry;
    }
  } elsif (@local_argv) {
    (@to_display) = @local_argv;
  }

  my (@expanded_to_display) = map { $w->expand_alias($_) } @to_display;

  foreach my $entry (@expanded_to_display) {
    unless ($w->{entries}->is_extant($entry)) {
      # TODO: Better error reporting strategy, print this on stderr:
      say("No such entry: $entry");
      return 1;
    }
  }

  if (@expanded_to_display) {
    if ($print_json) {
      $output->( $w->feed_print_json(@expanded_to_display) );
    } else {
      $output->( $w->feed_print(@expanded_to_display) );
    }
  } else {
    if ($print_json) {
      $output->( $w->feed_print_json_recent() );
    } else {
      $output->( $w->feed_print_recent() );
    }
  }

  return 0;
}

1;