package WebService::Snapcard;
use Moose;
with 'WebService::Client';

use Crypt::Mac::HMAC qw(hmac hmac_hex);
use Function::Parameters;
use Time::HiRes qw(time);

has api_key => (
    is       => 'ro',
    required => 1,
);

has api_secret => (
    is       => 'ro',
    required => 1,
);

has '+base_url' => (
    is      => 'ro',
    default => 'https://www.snapcard.io/api/v1',
);

sub BUILD {
    my ($self) = @_;
    $self->ua->default_header(':AUTH_API_KEY' => $self->api_key);
    $self->ua->agent(__PACKAGE__);
}

sub _nonce { time * 1e5 }

around req => fun($orig, $self, $req, @rest) {
    my $nonce = time * 1e5;
    my $signature =
        hmac_hex 'SHA256', $self->api_secret, $req->uri, $req->content;
    $req->header(':AUTH_SIG' => $signature);
    return $self->$orig($req, @rest);
};

around get => fun($orig, $self, $path, $params, @rest) {
    $params ||= {};
    $params->{NONCE} = $self->_nonce();
    return $self->$orig($path, $params, @rest);
};

method get_merchant_balance { $self->get('/merchant/balance') }

method get_invoices { $self->get('/invoices') }

# ABSTRACT: Snapcard (http://www.snapcard.io) API bindings


1;

__END__

=pod

=encoding UTF-8

=head1 NAME

WebService::Snapcard - Snapcard (http://www.snapcard.io) API bindings

=head1 VERSION

version 0.0001

=head1 SYNOPSIS

    use WebService::Snapcard;

    my $snap = WebService::Snapcard->new(
        api_key    => 'API_KEY',
        api_secret => 'API_SECRET',
        logger     => Log::Tiny->new('/tmp/snap.log'), # optional
    );
    my $balance = $snap->get_merchant_balance()->{balances}{usd};

=head1 METHODS

=head2 get_merchant_balance

    get_merchant_balance()

Get merchant account balance.

=head2 get_invoices

    get_invoices()

Get a list of all invoices on account.

=head1 AUTHOR

Naveed Massjouni <naveed@vt.edu>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by Naveed Massjouni.

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

=cut