#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2011 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------
package BookPub::Catalog::ISBN;
use strict;
use warnings;

use lib '/app/tools/common/lib';
use lib '/app/tools/bookpub/lib';
use lib '/app/tools/mediaserve/lib';
use Common::Assert;

use Business::ISBN;

use base 'Common::FormObject';

sub new {
    my $class = shift;
    my $self = bless {}, $class;

    return $self->_init(@_);
}

sub _init {
    my $self = shift;
    my %args;
    my $isbn;

    if ( @_ == 1 ) {
        $isbn = shift;
    } else {
        %args = @_;
    }

    if ($isbn) {
        $self->_initISBN($isbn);
    } elsif ( $args{isbn10} ) {
        $self->_initISBN10( $args{isbn10} );
    } elsif ( $args{isbn13} ) {
        $self->_initISBN13( $args{isbn13} );
    }

    return $self;
}

sub _initISBN {
    my $self = shift;
    my $isbn = shift;

    assert($isbn);

    if ( length($isbn) == 10 ) {
        return $self->_initISBN10($isbn);
    } else {
        return $self->_initISBN13($isbn);
    }
}

sub _initISBN10 {
    my $self = shift;
    my $isbn = shift;

    assert($isbn);

    $self->{ISBN10} = $isbn if ( IsValidISBN10($isbn) );
}

sub _initISBN13 {
    my $self = shift;
    my $isbn = shift;

    assert($isbn);

    $self->{ISBN13} = $isbn if ( IsValidISBN13($isbn) );
}

sub ISBN10 {
    my $self = shift;
    return $self->{ISBN10} ? $self->{ISBN10} : ConvertToISBN10( $self->{ISBN13} );
}

sub ISBN13 {
    my $self = shift;
    return $self->{ISBN13} ? $self->{ISBN13} : ConvertToISBN13( $self->{ISBN10} );
}

sub IsValid {
    my $isbn = shift || return;

    my $obj = Business::ISBN->new($isbn);
    return $obj && $obj->is_valid();
}

sub IsValidISBN10 {
    my $isbn = shift || return;

    my $obj = Business::ISBN->new($isbn);
    return length($isbn) == 10 && $obj && $obj->is_valid();
}

sub IsValidISBN13 {
    my $isbn = shift || return;

    my $obj = Business::ISBN->new($isbn);
    return length($isbn) == 13 && $obj && $obj->is_valid();
}

sub ConvertToISBN10 {
    my $isbn = shift || return;

    return unless ( IsValidISBN13($isbn) );

    my $obj = Business::ISBN->new($isbn);
    my $converted = $obj->as_isbn10() if ($obj);
    return $converted ? $obj->as_isbn10()->as_string( [] ) : undef;
}

sub ConvertToISBN13 {
    my $isbn = shift || return;

    my $obj = Business::ISBN->new($isbn);
    my $converted = $obj->as_isbn13() if ($obj);
    return $converted ? $obj->as_isbn13()->as_string( [] ) : undef;
}

###
1;    #
###
