package Pod::Readme::Plugin::version;

use Moo::Role;

our $VERSION = 'v1.2.3';

use ExtUtils::MakeMaker;
use Types::Standard qw/ Bool Str /;

use Pod::Readme::Types qw/ File HeadingLevel /;

=head1 NAME

Pod::Readme::Plugin::version - Include version in README

=head1 SYNOPSIS

  =for readme plugin version

=head1 DESCRIPTION

This is a plugin for L<Pod::Readme> that includes the release version.

=head1 ARGUMENTS

=head2 C<file>

  =for readme plugin version file='lib/My/App.pm'

By default, it will extract the version from the same file that the
F<README> is being extracted from.  If this is a different file, then
it should be specified.

=head2 C<title>

  =for readme plugin version title='VERSION'

This argument allows you to change the title of the heading.

=cut

requires 'parse_cmd_args';

has 'version_file' => (
    is       => 'rw',
    isa      => File,
    required => 0,
    coerce   => sub { File->coerce(@_) },
    lazy     => 1,
    default  => sub {
        my ($self) = @_;
        $self->input_file;
    },
);

has 'version_title' => (
    is      => 'rw',
    isa     => Str,
    default => 'VERSION',
    lazy    => 1,
);

has 'version_heading_level' => (
    is      => 'rw',
    isa     => HeadingLevel,
    default => 1,
    lazy    => 1,
);

has 'version_run' => (
    is      => 'rw',
    isa     => Bool,
    default => 0,
    lazy    => 1,
);

around 'depends_on' => sub {
    my ($orig, $self) = @_;
    return ($self->version_file, $self->$orig);
};

sub cmd_version {
    my ( $self, @args ) = @_;

    die "The version plugin can only be used once" if $self->version_run;

    my $res = $self->parse_cmd_args( [qw/ file title heading-level /], @args );
    foreach my $key ( keys %{$res} ) {
        ( my $name = "version_${key}" ) =~ s/-/_/g;
        if ( my $method = $self->can($name) ) {
            $self->$method( $res->{$key} );
        }
        else {
            die "Invalid key: '${key}'";
        }
    }

    if ( my $file = $self->version_file ) {

        my $heading = $self->can( "write_head" . $self->version_heading_level )
          or die "Invalid heading level: " . $self->version_heading_level;

        $self->$heading( $self->version_title );
        $self->write_para( MM->parse_version($file) );

        $self->version_run(1);

    }
    else {

        die "Don't know what file to determine the version from";

    }
}

use namespace::autoclean;

1;
