The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Imgur::API;

use strict;
our $VERSION = "0.1.3";
our $ABSTRACT = "Perl Interface to Imgur API";
use feature qw(say);

use Imgur::API::Endpoint;
use Imgur::API::Exception;
use Imgur::API::Content;
use Imgur::API::Response;
use Imgur::API::Stats;
use Data::Dumper;
use LWP::UserAgent;
use HTTP::Message;
use HTTP::Request;
use JSON::XS;
use URI::Escape;

use Moo;

has client_secret=>(is=>'ro');
has client_id=>(is=>'ro',required=>1);
has access_token=>(is=>'rw');
has ua=>(is=>'ro',default=>sub { LWP::UserAgent->new(); });
has stats=>(is=>'rw',default=>sub { Imgur::API::Stats->new();});

sub request {
	my ($this,$path,$method,$params) = @_;

	$params->{_format}="json";

	$this->ua->agent("Imgur::API/0.0,1");

	my $auth;
	if ($this->access_token) {
		$auth="Bearer ".$this->access_token;
	} else {	
		$auth="Client-ID ".$this->client_id;
	}

	say STDERR $auth;

	my $response;
	if ($method=~/(?:post|put)/) {	
		$response = $this->ua->$method($path,$params,'Authorization'=>$auth);
	} else {
		$response = $this->ua->$method($path,'Authorization'=>$auth);
	}
	say Dumper($response);
	if ($response->content_type eq "application/json") {
		$this->stats->update($response);
		my $json = JSON::XS::decode_json($response->decoded_content);
		if  (!$json->{success}) {
			my $e =  Imgur::API::Exception->new(code=>$json->{status},message=>$json->{data}->{error});
			say Dumper($json);
		}
		
		return Imgur::API::Response->new($json);
	} else {
		return Imgur::API::Exception->new(code=>$response->code,message=>$response->status_line);
	}
}

sub content {
	my ($this,$what) = @_;

	if ($what=~/^http/i) {
		return $what;
	} elsif (-f $what) {
		return Imgur::API::Content->encode($what);
	}
}

sub account {
	my ($this) = shift;

	return Imgur::API::Endpoint::Account->new(dispatcher=>$this);
}
sub album {
	my ($this) = shift;

	return Imgur::API::Endpoint::Album->new(dispatcher=>$this);
}
sub comment {
	my ($this) = shift;

	return Imgur::API::Endpoint::Comment->new(dispatcher=>$this);
}
sub conversation {
	my ($this) = shift;

	return Imgur::API::Endpoint::Conversation->new(dispatcher=>$this);
}
sub custom_gallery {
	my ($this) = shift;

	return Imgur::API::Endpoint::Custom_gallery->new(dispatcher=>$this);
}
sub gallery {
	my ($this) = shift;

	return Imgur::API::Endpoint::Gallery->new(dispatcher=>$this);
}
sub image {
	my ($this) = shift;

	return Imgur::API::Endpoint::Image->new(dispatcher=>$this);
}
sub memegen {
	my ($this) = shift;

	return Imgur::API::Endpoint::Memegen->new(dispatcher=>$this);
}
sub notification {
	my ($this) = shift;

	return Imgur::API::Endpoint::Notification->new(dispatcher=>$this);
}
sub topic {
	my ($this) = shift;

	return Imgur::API::Endpoint::Topic->new(dispatcher=>$this);
}
sub misc {
    my ($this) = shift;

    return Imgur::API::Endpoint::Misc->new(dispatcher=>$this);
}
sub oauth {
	my ($this) = shift;

	return Imgur::API::Endpoint::OAuth->new(dispatcher=>$this);
}



1;