#!/usr/bin/perl 

use strict;
Converter->start();

#                                                                              #
################################################################################
#                                                                              #

#
# This script will iterate over all 'original' images files and copy them into
# the image upload directory for the correct client.  They can then be
# reingested (and reconverted) using the process_books script.
#

package Converter;

use lib '/app/tools/bookpub/lib';
use BookPub::DB::Item::BookProduct;

use lib '/app/tools/mediaserve/lib';

use MediaServe::DB::Item::BookProductImageFile;
use MediaServe::DB::Item::MediaFile;
use MediaServe::BookPub::ImageFile;

use File::Copy;

use base 'BookPub::CronScript';

sub _process {
    my $self = shift;

    my $collection = MediaServe::DB::Item::BookProductImageFile->GetAll();

    while ( my $image = $collection->next() ) {
        $self->_saveImage($image)
          if ( $image->file_type eq MediaServe::DB::Item::BookProductImageFile::kFileTypeOriginal );
    }
}

sub _saveImage {
    my $self     = shift;
    my $image    = shift || die;
    my $clientID = Common::RSApp::GetClientID();

    my $destinationFile = $self->_getDestinationFilename($image) || die;

    my $file = MediaServe::BookPub::ImageFile->new( id => $image->media_file_id, clientID => $clientID );
    my $source = $file->logicalVolume() . '/' . $file->relativePath() . '/' . $file->filename();

    $self->_copyFile( $source, $destinationFile );
}

sub _getDestinationFilename {
    my $self = shift;
    my $image = shift || die;

    my $fileType         = $self->_getFileType($image);
    my $isbn             = $self->_getISBN($image);
    my $originalFilename = $self->_getOriginalFilename($image) unless ( $fileType && $isbn );

    return $fileType && $isbn ? "$isbn.$fileType" : $originalFilename;
}

sub _getOriginalFilename {
    my $self = shift;
    my $image = shift || die;

    my $mediaFile = MediaServe::DB::Item::MediaFile->Lookup( media_file_id => $image->media_file_id );
    my $originalFilename = $mediaFile->filename;

    $originalFilename =~ s/.*\.//g;

    return lc($originalFilename);
}

sub _getFileType {
    my $self = shift;
    my $image = shift || die;

    my $originalFilename = $self->_getOriginalFilename($image);
    $originalFilename =~ s/.*\.//g;

    return lc($originalFilename);
}

sub _getISBN {
    my $self = shift;
    my $image = shift || die;

    my $product = BookPub::DB::Item::BookProduct->Lookup( product_id => $image->book_product_id );

    return unless ($product);

    return $product->isbn13 ? $product->isbn13 : $product->isbn10;
}

sub _copyFile {
    my $self     = shift;
    my $source   = shift;
    my $destFile = shift || die;
    my $clientID = Common::RSApp::GetClientID;

    my $destDir = "/app/data/images/$clientID/upload";
    system("mkdir -p $destDir");
    die unless ( -w $destDir );

    die "Can not read source: $source" unless ( -r $source );

    copy( $source, "$destDir/$destFile" );
}

1;
