package Net::GitHub::V3::Gists;

use Moo;

our $VERSION = '1.05';
our $AUTHORITY = 'cpan:FAYLAND';

use URI::Escape;

with 'Net::GitHub::V3::Query';

sub gists {
    my ( $self, $user ) = @_;

    my $u = $user ? "/users/" . uri_escape($user) . '/gists' : '/gists';
    return $self->query($u);
}

sub next_gist {
    my ( $self, $user ) = @_;

    my $u = $user ? "/users/" . uri_escape($user) . '/gists' : '/gists';
    return $self->next($u);
}

sub close_gist {
    my ( $self, $user ) = @_;

    my $u = $user ? "/users/" . uri_escape($user) . '/gists' : '/gists';
    return $self->close($u);
}

## build methods on fly
my %__methods = (
    public_gists  => { url => "/gists/public", paginate => 1 },
    starred_gists => { url => "/gists/starred", paginate => 1 },
    gist => { url => "/gists/%s" },
    create => { url => "/gists", method => "POST", args => 1 },
    update => { url => "/gists/%s", method => "PATCH", args => 1 },
    star   => { url => "/gists/%s/star", method => "PUT", check_status => 204 },
    unstar => { url => "/gists/%s/star", method => "DELETE", check_status => 204 },
    is_starred => { url => "/gists/%s/star", method => "GET", check_status => 204 },
    fork => { url => "/gists/%s/fork", method => "POST" },
    delete => { url => "/gists/%s", method => "DELETE", check_status => 204 },

    # http://developer.github.com/v3/gists/comments/
    comments => { url => "/gists/%s/comments", paginate => 1 },
    comment  => { url => "/gists/%s/comments/%s" },
    create_comment => { url => "/gists/%s/comments", method => 'POST',  args => 1 },
    update_comment => { url => "/gists/%s/comments/%s", method => 'PATCH', args => 1 },
    delete_comment => { url => "/gists/%s/comments/%s", method => 'DELETE', check_status => 204 },
);
__build_methods(__PACKAGE__, %__methods);

no Moo;

1;
__END__

=head1 NAME

Net::GitHub::V3::Gists - GitHub Gists API

=head1 SYNOPSIS

    use Net::GitHub::V3;

    my $gh = Net::GitHub::V3->new; # read L<Net::GitHub::V3> to set right authentication info
    my $gist = $gh->gist;

=head1 DESCRIPTION

=head2 METHODS

=head3 Git Data

L<http://developer.github.com/v3/gists/>

=over 4

=item gists

    my @gists = $gist->gists;
    my @gists = $gist->gists('nothingmuch');
    while (my $g = $gist->next_gist) { ...; }

=item public_gists

=item starred_gists

    my @gists = $gist->public_gists;
    my @gists = $gist->starred_gists;
    while (my $g = $gist->next_public_gist) { ...; }
    while (my $g = $gist->next_starred_gist) { ...; }

=item gist

    my $gist = $gist->gist($gist_id);

=item create

    my $gist = $gist->create( {
      "description" => "the description for this gist",
      "public" => 'true',
      "files"  =>  {
        "file1.txt" => {
            "content" => "String file contents"
        }
      }
    } );

=item update

    my $g = $gist->update( $gist_id, {
        description => "edited desc"
    } );

=item star

=item unstar

=item is_starred

    my $st = $gist->star($gist_id);
    my $st = $gist->unstar($gist_id);
    my $st = $gist->is_starred($gist_id);

=item fork

=item delete

    my $g  = $gist->fork($gist_id);
    my $st = $gist->delete($gist_id);

=back

=head3 Gist Comments API

L<http://developer.github.com/v3/gists/comments/>

=over 4

=item comments

=item comment

=item create_comment

=item update_comment

=item delete_comment

    my @comments = $gist->comments();
    while (my $c = $gist->next_comment) { ...; }
    my $comment  = $gist->comment($comment_id);
    my $comment  = $gist->create_comment($gist_id, {
        "body" => "a new comment"
    });
    my $comment = $gist->update_comment($gist_id, $comment_id, {
        "body" => "Nice change"
    });
    my $st = $gist->delete_comment($gist_id, $comment_id);

=back

=head1 AUTHOR & COPYRIGHT & LICENSE

Refer L<Net::GitHub>
