package Business::Shipping::USPS_Online::Package;

=head1 NAME

Business::Shipping::USPS_Online::Package

=head1 METHODS

=head2 container

Default 'None'. 

=head2 size

Default 'Regular'.

=head2 machinable

Default 'False'.

=head2 mail_type

Default 'Package'.

=head2 pounds

=head2 ounces

=cut

use Any::Moose;
use version; our $VERSION = qv('400');
use Business::Shipping::Logging;
use Business::Shipping::Util;

extends 'Business::Shipping::Package';

has 'container'  => (is => 'rw', default => undef);
has 'size'       => (is => 'rw', default => 'Regular');
has 'machinable' => (is => 'rw', default => undef);
has 'mail_type'  => (is => 'rw', default => 'Package');
has 'ounces'     => (is => 'rw', default => '0.00');
has 'pounds'     => (is => 'rw', default => '0.00');
has 'width'      => (is => 'rw', default => '');
has 'height'     => (is => 'rw', default => '');
has 'length'     => (is => 'rw', default => '');
has 'girth'      => (is => 'rw', default => '');

__PACKAGE__->meta()->make_immutable();

=head2 weight

Overrides the standard weight definition so that it can correctly set pounds &
ounces.

=cut

sub weight {
    my ($self, $in_weight) = @_;
    trace('()');

    if ($in_weight) {
        $self->set_lbs_oz($in_weight);
    }

    # Convert back to 'weight' (i.e. one number) when returning.
    my $out_weight = $self->lbs_oz_to_weight;

    return $out_weight;
}

=head2 set_lbs_oz

Set pounds and ounces.  Converts from fractional pounds.

=cut

sub set_lbs_oz {
    my ($self, $in_weight) = @_;

    my $pounds = 0;
    my $ounces = 0;

    $pounds = int $in_weight;
    my $remainder = $in_weight - $pounds;

    # For some weights (e.g. 2.4), this is necessary.
    $remainder = 0 if $remainder < 0;
    if ($remainder) {
        $ounces = $remainder * 16;
        $ounces = sprintf("%1.0f", $ounces);
    }
    $self->pounds($pounds);
    $self->ounces($ounces);

    return;
}

=head2 lbs_oz_to_weight

Converts pounds + ounces to fractional weight.  Returns weight.
,
=cut

sub lbs_oz_to_weight {
    my ($self) = @_;

    trace '()';

    my $pounds = $self->pounds || 0;
    my $ounces = $self->ounces || 0;
    my $fractional_pounds = $ounces ? ($ounces / 16) : 0;
    my $weight = ($pounds + $fractional_pounds);

    return $weight;
}

1;

__END__

=head1 AUTHOR

Daniel Browning, db@kavod.com, L<http://www.kavod.com/>

=head1 COPYRIGHT AND LICENCE

Copyright 2003-2011 Daniel Browning <db@kavod.com>. All rights reserved.
This program is free software; you may redistribute it and/or modify it 
under the same terms as Perl itself. See LICENSE for more info.

=cut