The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Facebook::Graph::Page::Feed;
$Facebook::Graph::Page::Feed::VERSION = '1.1202';
use strict;
use Moo;
extends 'Facebook::Graph::Publish';

has page_id => (
	is => 'rw',
	predicate => 'has_page_id',
);

sub set_page_id {
	my ($self, $page_id) = @_;
	$self->object_name(''); # not sure it's a good way here
	$self->set_published(1); # it's a default value on FB side;
	$self->page_id($page_id);
	return $self;
}

use subs qw(object_path);
sub object_path{
	my $s = shift;
	
	return $s->has_page_id ? 
		sprintf( '%s/feed', $s->page_id )
		: die "You must set_page_id first";
}

has message => (
	is          => 'rw',
	predicate   => 'has_message',
);

sub set_message {
	my ($self, $message) = @_;
	$self->message($message);
	return $self;
}

has link_uri => (
	is          => 'rw',
	predicate   => 'has_link_uri',
);

sub set_link_uri {
	my ($self, $link_uri) = @_;
	$self->link_uri($link_uri);
	return $self;
}

has backdated_time => (
	is			=> 'rw',
	predicate	=> 'has_backdated_time',
);

sub set_backdated_time
{
	my ($self, $backdated_time) = @_;
	$self->backdated_time($backdated_time);
	return $self;
}

has scheduled_publish_time => (
	is			=> 'rw',
	predicate	=> 'has_scheduled_publish_time'
);

sub set_scheduled_publish_time
{
	my ($self, $scheduled_publish_time) = @_;
	$self->scheduled_publish_time($scheduled_publish_time);
	return $self;
}

has published => (
	is			=> 'rw',
	predicate	=> 'has_published',
	reader		=> '_get_published',
	writer		=> '_set_published',
);

sub published
{
	my($self, $published) = @_;
	
	if( scalar @_ > 1 )
	{
		$self->_set_published($published);
	}
	
	return $self->_get_published && $self->_get_published ne 'false';
}

sub set_published
{
	my ($self, $published) = @_;
	$self->published($published);
	return $self;
}

around get_post_params => sub {
	my ($orig, $self) = @_;
	my $post = $orig->($self);
	if ($self->has_message) {
		push @$post, message => $self->message;
	}
	if ($self->has_link_uri) {
		push @$post, link => $self->link_uri;
	}
	if ($self->has_backdated_time) {
		push @$post, backdated_time => $self->backdated_time + 10*3600; # temporary fix for FB::Graph API
	}
	if (
		$self->has_scheduled_publish_time
		and (
			not $self->has_published or not $self->published
		)
		) {
		push @$post, scheduled_publish_time => $self->scheduled_publish_time;
	}
	if ($self->has_published) {
		push @$post, published => $self->published ? 'true': 'false';
	}
	return $post;
};

1;

=head1 NAME

Facebook::Graph::Page::Feed - Add a post to a Facebook page.

=head1 VERSION

version 1.1202

=head1 SYNOPSIS

 my $fb = Facebook::Graph->new;

 $fb->add_page_feed
	->set_page_id($page_id)
	->set_message('This is a test post')
	->set_backdated_time(time-3600)
	->set_scheduled_publish_time(time+3600)
	->set_published('false')
	->set_link_uri('http://mysite.com/testpage')
	->publish;


=head1 DESCRIPTION

This module gives you quick and easy access to publish posts on FB pages.

Implements publishing protocol available here:
L<https://developers.facebook.com/docs/graph-api/reference/v2.0/page/feed/>

B<ATTENTION:> You must have the page access token to use this module.
It's available in C<$fb->fetch('me/accounts')>, but, you must have a user 
token with C<manage_page> permission.

More information about tokens could be found here: 
L<https://developers.facebook.com/docs/facebook-login/access-tokens>

=head1 METHODS

=head2 set_page_id ( page_id )

Specify a page id to post to. This is required field and must be set before 
publishing.

=head2 set_message ( message )

Sets the description of the link.

=head3 message

A string of text.


=head2 set_link_uri ( uri )

Sets the URI to link to.

=head3 uri

A URI.

=head2 set_backdated_time ( time )

Set a date of your post, different from now. Just a backdate. Time should be a 
timestamp, no fancy formats.

=head2 set_scheduled_publish_time( time )

Set a publishing time for scheduled posts. Time should be a desired timestamp of 
post in future. Doesn't work with minutes from now, but works fine with hour+

=head2 publish ( )

Posts the data and returns a L<Facebook::Graph::Response> object. The response object should contain the id:

 {"id":"1647395831_130068550371568"}

 
=head1 LEGAL

Facebook::Graph is Copyright 2010 - 2012 Plain Black Corporation (L<http://www.plainblack.com>) and is licensed under the same terms as Perl itself.

Facebook::Graph::Page::Feed is Copyright 2014 Alexandr Evstigneev (L<http://evstigneev.com>) and is licensed under the same terms as Perl itself.

=cut