use strict;
use warnings;
#use Data::Dumper; $Data::Dumper::Indent = 1;
use Test::More tests => 84;

use Atompub;
use Atompub::Client;
use Atompub::DateTime qw( datetime );
use HTTP::Status;
use URI::Escape;

my $SERVICE = 'http://teahut.sakura.ne.jp:3000/service';
#my $SERVICE = 'http://localhost:3000/service';
my $USER = 'foo';
my $PASS = 'foo';


my $client = Atompub::Client->new;
isa_ok $client, 'Atompub::Client';

$client->username( $USER );
$client->password( $PASS );


# Service

ok ! $client->getService( 'http://example.com/service' ); # Not Found

like $client->errstr, qr/not found/i;

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
ok ! $client->rc;

is $client->res->code, RC_NOT_FOUND;


ok $client->getService( $SERVICE );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
isa_ok $client->rc, 'XML::Atom::Service';

ok $client->res->is_success;

my $serv = $client->rc;
my ( $entry_coll, $media_coll ) = $serv->workspace->collections;

isa_ok $client->info->get( $entry_coll->href ), 'XML::Atom::Collection';
isa_ok $client->info->get( $media_coll->href ), 'XML::Atom::Collection';


# Create Entry Resource

my $entry = XML::Atom::Entry->new;
$entry->title('Entry 1');
$entry->updated( datetime->w3c );
$entry->id('tag:teahut.sakura.ne.jp,2007:1');
$entry->content('<span>This is the 1st entry</span>');

my $category = XML::Atom::Category->new; # Forbidden category
$category->term('animal');
$category->scheme('http://example.com/dogs/big3');
$entry->category( $category );

ok ! $client->createEntry( $entry_coll->href, $entry, 'Entry 1' );

like $client->errstr, qr/forbidden category/i;

ok ! $client->req;
ok ! $client->res;
ok ! $client->rc;


$category = XML::Atom::Category->new;
$category->term('animal');
$category->scheme('http://example.com/cats/big3');
$entry->category( $category );

ok $client->createEntry( $entry_coll->href, $entry, 'Entry 1' );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
isa_ok $client->rc, 'XML::Atom::Entry';

is $client->req->slug, uri_escape('Entry 1');
is $client->res->code, RC_CREATED;
ok my $uri = $client->res->location;

$entry = $client->rc;
is $entry->title, 'Entry 1';

isa_ok $client->cache->get( $uri ), 'Atompub::Client::Cache::Resource';


# List Entry Resources (Get Feed)

ok $client->getFeed( $entry_coll->href );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
isa_ok $client->rc, 'XML::Atom::Feed';

ok $client->res->is_success;


# Get Entry Resource

ok $client->getEntry( $uri );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
isa_ok $client->rc, 'XML::Atom::Entry';

is $client->res->code, RC_NOT_MODIFIED;

$entry = $client->rc;
is $entry->title, 'Entry 1';

isa_ok $client->cache->get( $uri ), 'Atompub::Client::Cache::Resource';


# Update Entry Resource

$entry->title('Entry 2');

ok $client->updateEntry( $uri, $entry );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
isa_ok $client->rc, 'XML::Atom::Entry';

ok $client->res->is_success;

$entry = $client->rc;
is $entry->title, 'Entry 2';

isa_ok $client->cache->get( $uri ), 'Atompub::Client::Cache::Resource';


# Delete Entry Resource

ok $client->deleteEntry( $uri );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
ok ! $client->rc;

ok $client->res->is_success;


# Create Media Resource

# Unsupported media type
ok ! $client->createMedia( $media_coll->href, 't/samples/media1.gif', 'text/plain', 'Media 1' );

like $client->errstr, qr/unsupported media type/i;

ok ! $client->req;
ok ! $client->res;
ok ! $client->rc;


ok $client->createMedia( $media_coll->href, 't/samples/media1.gif', 'image/gif', 'Media 1' );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
isa_ok $client->rc, 'XML::Atom::Entry';

is $client->req->slug, uri_escape('Media 1');
is $client->res->code, RC_CREATED;
ok $uri = $client->res->location;

isa_ok $client->cache->get( $uri ), 'Atompub::Client::Cache::Resource';


# Get Media Resource

( $uri ) = map { $_->href } grep { $_->rel eq 'edit-media' } $client->rc->link;

ok $client->getMedia( $uri );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
ok $client->rc;

ok $client->res->is_success;
is $client->res->content_type, 'image/gif';

isa_ok $client->cache->get( $uri ), 'Atompub::Client::Cache::Resource';


# Update Media Resource

ok $client->updateMedia( $uri, 't/samples/media2.gif', 'image/gif' );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
ok $client->rc;

ok $client->res->is_success;
is $client->res->content_type, 'image/gif';

isa_ok $client->cache->get( $uri ), 'Atompub::Client::Cache::Resource';


# Delete Media Resource

ok $client->deleteMedia( $uri );

isa_ok $client->req, 'HTTP::Request';
isa_ok $client->res, 'HTTP::Response';
ok ! $client->rc;

ok $client->res->is_success;
