The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package WWW::SourceForge::Wiki;
use strict;
use warnings;
use WWW::SourceForge;
use WWW::SourceForge::Project;
use LWP::Simple qw();
use Data::Dumper;
use JSON::Parse;
use LWP::UserAgent;
use LWP::Authen::OAuth;
use HTTP::Request::Common;

our $VERSION = '0.02';
our $baseurl = 'https://sourceforge.net/rest/p/';

=head1 new

my $wiki = WWW::SourceForge::Wiki->new( project => 'newsgrowler' );
my $content = $wiki->get_page( page => 'Home' ); 

=cut

sub new {
    my ( $class, %parameters ) = @_;
    my $self = bless( {}, ref($class) || $class );

    my $proj_name = $parameters{project};

    my $proj_obj = WWW::SourceForge::Project->new( name => $proj_name );
    
    # Must be an Allura project for this to work
    if ( $proj_obj->type && ( $proj_obj->type == 10 ) ) {

        # API URL
        $self->{url_prefix} = $baseurl . $proj_obj->shortdesc() . '/wiki/';
        return $self;

    } else {
        die("This doesn't work on Classic SF projects");
    }

}

=head1 list_pages

my $ref = $self->list_pages();

=cut
sub list_pages {
    my ( $self, %parameters ) = @_;
    my $url = $self->{url_prefix};
    return $self->get( url => $url );
}

=head1 get_page

my $ref = $self->get_page( page => 'Home' );

=cut
sub get_page {
    my ( $self, %parameters ) = @_;
    my $url = $self->{url_prefix} . $parameters{page};

   return $self->get( url => $url );
}

=head1 get

Fetch the JSON and parse it. Die on bad JSON;

=cut
sub get {
    my ( $self, %parameters ) = @_;
    my $r = {};

    my $json = LWP::Simple::get( $parameters{url} );
    eval { $r = JSON::Parse::json_to_perl( $json ); };
    if ( $@ ) {
        warn $@;
        return {};
    } else {
        return $r;
    }

}

=head1 post_page

$self->post_page(
    page   => 'NewPage',
    text   => 'Wiki page body goes here',
    labels => 'new,page,cool',
);

Must have ConsumerKey and ConsumerSecret set in ~/.sourceforge  See
https://sourceforge.net/auth/oauth/ to get one.

=cut
sub post_page {
    my ( $self, %parameters ) = @_;
    my $url = $self->{url_prefix} . $parameters{page};

    my %config = WWW::SourceForge::get_config();

    my $ua = LWP::Authen::OAuth->new(
        oauth_consumer_key    => $config{consumer_key},
        oauth_consumer_secret => $config{consumer_secret},
        oauth_token           => $config{oauth_token},
        oauth_token_secret    => $config{oauth_token_secret},
    );

    my $response = $ua->post(
        $url,
        [
            text   => $parameters{text},
            labels => $parameters{labels},
        ]
    );


    # I don't know why this isn't working, and could use help from
    # anyone with OAuth fu that can help me get it working.


    # TODO: Error Handling

    return ($response);

}