#------------------------------------------------------------
# Copyright (C) 2010 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package MediaServe::BookPub::Matcher;
use strict;
use warnings;

use lib '/app/tools/common/lib';
use Common::RSApp;
use Common::Util;
use Common::Assert;

use lib '/app/tools/rps/lib';

use lib '/app/tools/mediaserve/lib';
use MediaServe::Matcher;
use MediaServe::DB::Item::BookProductImageFile;

use base 'MediaServe::Matcher';

sub asset_db_class { 'MediaServe::DB::Item::BookProductImageFile' }
sub id_field       { 'book_product_id' }

sub get_match_criteria {
    my $self     = shift;
    my $filename = shift;
    my %args;

    assert($self);
    assert($filename);

    my ($file) = split( /[-\.]/, $filename );

    $args{isbn10} = $file;
    $args{isbn13} = $file;

    return %args;
}

sub match_files {
    my ( $self, $type ) = @_;
    my $count = 0;
    my $file;
    my ( $id, $id2 );
    my $id_field = $self->id_field();
    my $class    = $self->asset_db_class();
    my $files    = $class->GetUnmatchedFiles();

    while ( $files->hasNext ) {
        $file = $files->next;

        use Data::Dumper;
        Common::Log::Debug( Dumper($file) );

        Common::Log::Debug( "   Matching file: " . $file->{filename} );

        ( $id, $id2 ) = $class->GetMatchIDs( $self->get_match_criteria( $file->{filename} ) );

        if ($id2) {
            Log->notice( "  Failed match $file->{filename} because multiple matches found, Client: "
                  . Common::RSDB::ClientIDToDBName( Common::RSApp::GetClientID() ) );
        } elsif ($id) {
            $self->remove_duplicate_assets( $file, $id );

            $file->$id_field($id);
            $file->save();
            $count++;
        }
    }

    return $count;
}

sub remove_duplicate_assets {
    my $self            = shift;
    my $file            = shift;
    my $book_product_id = shift;

    my $filename                   = $file->{filename};
    my $file_type                  = $file->{file_type};
    my $book_product_image_file_id = $file->{book_product_image_file_id};

    assert($self);
    assert($filename);
    assert($file_type);
    assert($book_product_id);
    assert($book_product_image_file_id);

    my ($base) = split( /[\.-]/, $filename );

    Common::Log::Debug("   - Removing duplicates for '$base'") if ($base);
    return unless ($base);

    my $collection =
      MediaServe::DB::Item::BookProductImageFile->GetDuplicateAssets( $file_type, $book_product_id, $book_product_image_file_id );

    my $book_product_image_file;
    my $media_file;

    while ( $book_product_image_file = $collection->next() ) {
        $media_file = MediaServe::DB::Item::MediaFile->Lookup( media_file_id => $book_product_image_file->media_file_id );

        $media_file->delete();
        $book_product_image_file->delete();
    }
}

sub OLDremove_duplicate_assets {
    my $self            = shift;
    my $filename        = shift;
    my $book_product_id = shift;

    assert($self);
    assert($filename);
    assert($book_product_id);

    my ($base) = split( /[\.-]/, $filename );

    Common::Log::Debug("   - Removing duplicates for '$base'") if ($base);
    return unless ($base);

    my $collection = MediaServe::DB::Item::BookProductImageFile->GetDuplicateAssets( $base, $book_product_id );

    my $book_product_image_file;
    my $media_file;

    while ( $book_product_image_file = $collection->next() ) {
        $media_file = MediaServe::DB::Item::MediaFile->Lookup( media_file_id => $book_product_image_file->media_file_id );

        $media_file->delete();
        $book_product_image_file->delete();
    }
}

1;
