package Cross::CouchDB;

use strict;
use warnings;

use JSON::Any;
use LWP::UserAgent;

sub new {
  my ($class, $host, $port, $options) = @_;

  my $ua = LWP::UserAgent->new;
  $ua->timeout(10);
  $ua->env_proxy;

  return bless {
                ua       => $ua,
                host     => $host,
                port     => $port,
                base_uri => "http://$host:$port/",
               }, $class;
}

sub ua {
	shift->{ua}
}

sub base {
	shift->{base_uri}
}

sub request {
  my ($self, $method, $uri, $content) = @_;

  my $full_uri = $self->base . $uri;
  my $req;

  if (defined $content) {
    #Content-Type: application/json

    $req = HTTP::Request->new( $method, $full_uri, undef, $content );
    $req->header('Content-Type' => 'application/json');
  } else {
    $req = HTTP::Request->new( $method, $full_uri );
  }

  my $response = $self->ua->request($req);

  if ($response->is_success) {
    $method eq 'HEAD' ? return 'found' : return $response->content;
  } else {
    #$method eq 'HEAD' ? return (undef) : die($response->status_line . ":" . $response->content);
    #$method eq 'HEAD' ? return (undef) : return;
		return undef;
  }
}

sub del {
  my ($self, $url) = @_;

  my $j = JSON::Any->new;
  my $data = $j->decode($self->get($url));

  $self->request(DELETE => $url."?rev=".$data->{_rev});
}

sub has {
  my ($self, $url) = @_;

  $self->request(HEAD => $url);
}

sub get {
  my ($self, $url) = @_;

  $self->request(GET => $url);
}

sub put {
  my ($self, $url, $json) = @_;

  $self->request(PUT => $url, $json);
}

sub post {
  my ($self, $url, $json) = @_;

  $self->request(POST => $url, $json);
}

1;
