#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2012 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
# $Id$
#---------------------------------------------------------------
package BookPub::Import::Sale;
use strict;

use lib '/app/tools/common/lib';
use lib '/app/tools/bookpub/lib';
use Common::Assert;
use Common::RSApp;
use BookPub::DB::Item::Sale;
use BookPub::Sale::Match;

sub CreateFromSaleRec {
    my ( $class, %args ) = @_;
    my $saleRec           = $args{saleRec};
    my $file              = $args{file};
    my $book_product_isbn = $args{book_product_isbn};
    assert($saleRec);
    assert($file);

    my $sale = BookPub::DB::Item::Sale->Create();

    $class->_FillInFields( $sale, $saleRec, $file );

    $class->_FindMatch( $sale, $book_product_isbn );

    $sale->save();

    # Return the sale so that we can associate other records to it.
    return $sale;
}

sub _FillInFields {
    my ( $class, $saleDB, $saleRec, $file ) = @_;

    # Default to the file's service id unless the importer specified one.
    my $serviceID = $saleRec->serviceID;
    $serviceID = $file->ServiceID() unless $serviceID;
    $saleDB->service_id($serviceID);

    $saleDB->file_id( $file->FileID() );

    $saleDB->product_type( $saleRec->productType );
    $saleDB->format_type( $saleRec->formatType );
    $saleDB->purchase_type( $saleRec->purchaseType );
    $saleDB->service_product_id( $saleRec->serviceProductID );
    $saleDB->is_agency( $saleRec->isAgency );
    $saleDB->is_free( $saleRec->isFree );
    $saleDB->is_pre_order( $saleRec->isPreOrder );
    $saleDB->price_type_id( $saleRec->priceTypeID );
    $saleDB->price_type_qualifier_id( $saleRec->priceTypeQualifierID );
    $saleDB->units( $saleRec->units );
    $saleDB->list_price( $saleRec->listPrice );
    $saleDB->discount( $saleRec->discount );
    $saleDB->unit_price( $saleRec->unitPrice );
    $saleDB->revenue( $saleRec->revenue );
    $saleDB->tax_amount( $saleRec->taxAmount );
    $saleDB->conversion_rate( $saleRec->conversionRate );
    $saleDB->currency_code( $saleRec->currencyCode );
    $saleDB->country_code( $saleRec->countryCode );
    $saleDB->state( $saleRec->state );
    $saleDB->postal_code( $saleRec->postalCode );
    $saleDB->incentive_amount( $saleRec->incentiveAmount );
    $saleDB->line_num( $saleRec->lineNum );
    $saleDB->date_begin( $saleRec->dateBegin );
    $saleDB->date_end( $saleRec->dateEnd );

    # the rest we'll store in "r_" fields
    $saleDB->r_format( $saleRec->rFormat );
    $saleDB->r_price_type( $saleRec->rPriceType );
    $saleDB->r_purchase_type( $saleRec->rPurchaseType );
    $saleDB->r_service_name( $saleRec->rServiceName );
    $saleDB->r_distributor( $saleRec->rDistributor );
    $saleDB->r_product_type( $saleRec->rProductType );
    $saleDB->r_client_product_id( $saleRec->rClientProductID );
    $saleDB->r_isbn10( $saleRec->rIsbn10 );
    $saleDB->r_isbn13( $saleRec->rIsbn13 );
    $saleDB->r_title( $saleRec->rTitle );
    $saleDB->r_subtitle( $saleRec->rSubtitle );
    $saleDB->r_author( $saleRec->rAuthor );
    $saleDB->r_chapter_title( $saleRec->rChapterTitle );
    $saleDB->r_chapter_ordinal( $saleRec->rChapterOrdinal );
    $saleDB->r_imprint( $saleRec->rImprint );
    $saleDB->r_narrator( $saleRec->rNarrator );
    $saleDB->r_comments( $saleRec->rComments );
    $saleDB->r_channel( $saleRec->rChannel );
    $saleDB->r_units( $saleRec->rUnits );
    $saleDB->r_sales( $saleRec->rSales );
    $saleDB->r_returns( $saleRec->rReturns );
    $saleDB->r_adjustments( $saleRec->rAdjustments );
    $saleDB->r_fee( $saleRec->rFee );
    $saleDB->r_tax_unit_price( $saleRec->rTaxUnitPrice );
    $saleDB->r_tax_amount( $saleRec->rTaxAmount );
    $saleDB->r_purchase_price( $saleRec->rPurchasePrice );
    $saleDB->r_purchase_price_currency( $saleRec->rPurchasePriceCurrency );
    $saleDB->r_list_price( $saleRec->rListPrice );
    $saleDB->r_list_price_currency( $saleRec->rListPriceCurrency );
    $saleDB->r_cogs( $saleRec->rCOGS );
    $saleDB->r_unit_price( $saleRec->rUnitPrice );
    $saleDB->r_revenue( $saleRec->rRevenue );
    $saleDB->r_discount( $saleRec->rDiscount );
    $saleDB->r_promo_code( $saleRec->rPromoCode );
    $saleDB->r_state( $saleRec->rState );
    $saleDB->r_postal_code( $saleRec->rPostalCode );
    $saleDB->r_duration( $saleRec->rDuration );
    $saleDB->r_previous_duration( $saleRec->rPreviousDuration );
    $saleDB->r_institution( $saleRec->rInstitution );
    $saleDB->r_incentive_amount( $saleRec->rIncentiveAmount );
    $saleDB->r_model( $saleRec->rModel );
    $saleDB->r_delivery_method( $saleRec->rDeliveryMethod );
    $saleDB->r_transaction_category( $saleRec->rTransactionCategory );
}

sub _FindMatch {
    my ( $class, $saleDB, $book_product_isbn ) = @_;

    my $match = BookPub::Sale::Match->new( client_id => Common::RSApp::GetClientID(), book_product_isbn => $book_product_isbn );
    my $result = $match->FindBestMatch( data => $saleDB, skip_rec => 1 );
    my $matches = scalar @{ $result->ProductIDs };

    if ( $matches == 1 ) {
        $result->matchToSale($saleDB);
    } else {
        $saleDB->import_status(BookPub::DB::Item::Sale::STATUS_NOMATCH);
    }

}

1;
