package Catalyst::Authentication::Credential::FBConnect;
use strict;
use warnings;

use Moose;

has _config => ( is => 'rw' );
has debug => ( is => 'rw' );
has key => ( is => 'rw' );
has secret => ( is => 'rw' );
has app_name => ( is => 'rw' );
has fbconnect => ( is => 'rw' );

use WWW::Facebook::API;
use Catalyst::Exception ();

sub new {
	my ($class, $config, $c, $realm) = @_;

	my $self = { _config => {
		%{ $config },
		%{ $realm->{config} }
	} };

	bless $self, $class;

	$self->debug( $self->_config->{debug} );

	$self->key( $self->_config->{key} );
	$self->secret( $self->_config->{secret} );
	$self->app_name( $self->_config->{app_name} );

	$self->fbconnect( WWW::Facebook::API->new(
		desktop => 0,
		app_name => $self->app_name,
		api_key => $self->key,
		secret => $self->secret
	) );

	return $self;
}

sub authenticate {
	my ($self, $c, $realm, $auth_info) = @_;

	my $token = $c->req->method eq 'GET'
		? $c->req->query_params->{'auth_token'}
		: $c->req->body_params->{'auth_token'};

	if( defined $token ) {

		$self->fbconnect->auth->get_session( $token );

		my $user = +{
			session_uid => $self->fbconnect->session_uid,
			session_key => $self->fbconnect->session_key,
			session_expires => $self->fbconnect->session_expires
		};

		my $user_obj = $realm->find_user( $user, $c );

		return $user_obj if ref $user_obj;

		$c->log->debug( 'Verified FBConnect itentity failed' ) if $self->debug;

		return;
	}
	else {

		$c->res->redirect( $self->fbconnect->get_login_url( next => $c->uri_for( $c->action ) ) );
	}

}

1;

__END__

=head1 NAME

Catalyst::Authentication::Credential::FBConnect - Facebook credential for Catalyst::Plugin::Authentication framework.

=head1 VERSION

0.01

=head1 SYNOPSIS

In MyApp.pm

 use Catalyst qw/
      Authentication
      Session
      Session::Store::FastMmap
      Session::State::Cookie
 /;


In myapp.conf

 <Plugin::Authentication>
      default_realm	facebook
      <realms>
           <facebook>
                <credential>
                     class	FBConnect
		</credential>
		key my_app_key
                secret my_app_secret
                app_name my_app_name
           </facebook>
      </realms>
</Plugin::Authentication>


In controller code,

  sub facebook : Local {
       my ($self, $c) = @_;

       if( $c->authenticate() ) {
             #do something with $c->user
       }
  }



=head1 USER METHODS

=over 4

=item $c->user->session_uid

=item $c->user->session_key

=item $c->user->session_expires

=back

=head1 AUTHOR

Cosmin Budrica E<lt>cosmin@sinapticode.comE<gt>

Bogdan Lucaciu E<lt>bogdan@sinapticode.comE<gt>

=head1 COPYRIGHT

Copyright (c) 2009 Sinapticode. All rights reserved

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

=cut
