#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

our $VERSION = '0.39'; # VERSION

use Perinci::Sub::Util qw(err);

eval { require Perinci::CmdLine };
if ($@) {
    die "This script requires Perinci::CmdLine, please install it first.\n";
}

our %SPEC;

$SPEC{gen_doc} = {
    v => 1.1,
    args => {
        url => {
            summary => 'URL',
            req => 1,
            pos => 0,
            schema => 'str*',
        },
        format => {
            summary => 'Format',
            schema => 'str',
        },
    },
};
sub gen_doc {
    require Perinci::Access;
    require File::Which;

    state $pa = Perinci::Access->new;

    my %args = @_;
    # XXX schema
    my $url = $args{url} or return err(400, "Please specify url");
    $url = "pl:$url" if $url =~ m!^/!;

    my $res;

    $res = $pa->request(meta => $url);
    return err(500, "Can't meta $url", $res) unless $res->[0] == 200;
    my $meta = $res->[2];

    $res = $pa->request(child_metas => $url);
    return err(500, "Can't child_metas $url", $res) unless $res->[0] == 200;
    my $cmetas = $res->[2];
    my $ometas = $res->[3]{orig_metas} // {};
    # we want to document the original args_as & result_naked, not the
    # wrapped-over-riap one
    for my $uri (keys %$cmetas) {
        for (qw/args_as result_naked/) {
            $cmetas->{$uri}{$_} = $ometas->{$uri}{$_}
                if defined $ometas->{$uri}{$_};
        }
    }

    my $format = $args{format} // "man";
    $format = "text" unless
        File::Which::which("pod2man") && File::Which::which("man");

    # XXX check if url is a module or function or ...

    my $doc;
    if ($format eq 'man') {
        require Perinci::To::POD;
        $doc = Perinci::To::POD->new(
            name=>$url, meta=>$meta, child_metas=>$cmetas);
        $res = $doc->gen_doc;
        [200, "OK", $res, {
            "cmdline.page_result"=>1,
            "cmdline.pager"=>"pod2man | man -l -"}];
    } else {
        require Perinci::To::Text;
        $doc = Perinci::To::Text->new(
            name=>$url, meta=>$meta, child_metas=>$cmetas);
        $res = $doc->gen_doc;
        [200, "OK", $res, {"cmdline.page_result"=>1}];
    }

}

$ENV{LOG} //= 0; # speed up startup, but allow overriding
my $cmd = Perinci::CmdLine->new(
    url => '/main/gen_doc',
);
delete $cmd->common_opts->{format};
delete $cmd->common_opts->{format_options};
$cmd->run;

# ABSTRACT: Display text/POD documentation of Riap package
# PODNAME: peri-pkg-doc

__END__

=pod

=encoding UTF-8

=head1 NAME

peri-pkg-doc - Display text/POD documentation of Riap package

=head1 VERSION

version 0.39

=head1 SYNOPSIS

From command-line:

 % peri-pkg-doc /Some/Module/
 % peri-pkg-doc --format=text https://example.com/api/
 % peri-pkg-doc --help

=head1 DESCRIPTION

This script will generate text/POD documentation for a Riap package. All
information about entities like functions and variables in the package will be
retrieved and displayed as well. The end result looks similar to a POD
documentation for a Perl module.

=head1 HOMEPAGE

Please visit the project's homepage at L<https://metacpan.org/release/Perinci-To-Doc>.

=head1 SOURCE

Source repository is at L<https://github.com/sharyanto/perl-Perinci-To-Doc>.

=head1 BUGS

Please report any bugs or feature requests on the bugtracker website L<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-To-Doc>

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.

=head1 AUTHOR

Steven Haryanto <stevenharyanto@gmail.com>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2013 by Steven Haryanto.

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

=cut
