#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::Catalog::ImageUpload;
use strict;
use warnings;

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

use lib '/app/tools/mediaserve/lib';
use MediaServe::MediaFile;
use MediaServe::Image::Matcher;
use MediaServe::Image::Converter;
use MediaServe::DB::Item::AlbumFile;

use lib '/app/tools/rps/lib';
use RPS::Catalog::AlbumSimple;
use RPS::DB::Item::Product;

use Common::FormObject;
use base 'Common::FormObject';


use constant kImageDirectory   => '/app/data/images';
use constant kImageTypeAllowed => qw( tif tiff jpg jpeg );


sub _init
{
	my ($self, %args) = @_;

	$self->SUPER::_init(%args);
    
    $self->{_albumID}   = $args{albumID};
    $self->{_imageFH}   = $args{imageFH};
    $self->{_imageName} = $args{imageName};

    return $self;
}

sub validate
{
	my ($self, @args) = @_;
    my @types = (kImageTypeAllowed);
    my $images = join( "|", @types );
    my $image_regex = qr/.*\.($images)$/i;
    
    my $valid = $self->SUPER::validate();

    Common::Log::Debug( "Validate uploaded image file" );
    
    my $albumID = $self->{_albumID};
    
    my $import_fh   = $self->{_imageFH};
    my $import_file = $self->{_imageName};

    
    Common::Log::Debug( "IMAGE NAME: $import_file, FH: $import_fh" );
    
    unless( $import_fh ) {
        Common::Log::Debug( "ERROR: File Requried" );
        $self->setError("error");
        $self->setErrorString("File required");
        $valid = 0;
    }

    unless( $import_fh && $import_file ) {
        Common::Log::Debug( "ERROR: Can't read file" );
        $self->setError("error");
        $self->setErrorString("Unable to read from input file");
        $valid = 0;
    }

    unless( $import_file =~ /$image_regex/ ) {
        Common::Log::Debug( "ERROR: Invalid Format" );
        $self->setError("error");
        $self->setErrorString("Invalid file format, valid extensions: " . join( ", ", @types ));
        $valid = 0;
    }

    unless( $import_file !~ /(\.\.|\/)/ ) {
        Common::Log::Debug( "ERROR: Bad chars in filename" );
        $self->setError("error");
        $self->setErrorString("Filename contains invalid characters");
        $valid = 0;
    }

    unless( $albumID ) {
        Common::Log::Debug( "ERROR: Album ID Required" );
        $self->setError("error");
        $self->setErrorString("Album ID Required");
        $valid = 0;
    }

    return $valid;
}

sub import_file {
    my $self = shift;
    my $infile = $self->{_imageFH};
    
    assert( $self );
    assert( $self->{_albumID} );
    assert( $infile );
    
    my $file;
    
    while( <$infile> ) {
        $file .= $_;
    }
    
    unless( $file ) {
        Common::Log::Debug( "ERROR: Can't read file" );
        $self->setError("error");
        $self->setErrorString("Unable to read from input file");
        return undef;
    }
    
    Common::Log::Debug( "Reading image file.  Size: " . length($file) );
    
    $self->store_file( $file );
}

sub store_file {
    my $self = shift;
    my $file = shift;
    my $input_filename = $self->{_imageName};
    my $album_id  = $self->{_albumID};
    my $client_id = Common::RSApp::GetClientID();
    my $upc = RPS::DB::Item::Product::GetDigitalUPCByAlbumID( $album_id );
    
    my $media_file = new MediaServe::MediaFile();
    my $converter  = new MediaServe::Image::Converter();
    
    Common::Log::Debug( "Storing image file" );
    
    assert( $self );
    assert( $file );
    assert( $input_filename );
    assert( $album_id );
    assert( $client_id );
    assert( -w kImageDirectory );
    
    my $extension = $input_filename;
    $extension =~ s/.*\.//g;
    my $dir = "album_$album_id";
    my $filename .= "$dir.$extension";
    my $img_dest   = kImageDirectory . "/$client_id/upload";
    my $spool_dest = kImageDirectory . "/$client_id/spool";
    
    Common::Log::Debug( "  - Output filename: $filename" );
    system( "mkdir -p $img_dest" ) unless( -d $img_dest );
    system( "mkdir -p $spool_dest" ) unless( -d $spool_dest );
    
    open( OUTFILE, ">$spool_dest/$filename" ) ||
        die( "Can not write to output directory: $spool_dest" );
    print OUTFILE "$file";
    close( OUTFILE );
        
    if( $converter->validate( "$spool_dest/$filename" ) ) {
    
        # Create assets for all image files
        foreach ( $converter->getFileTypes() ) {
            $media_file->addAlbumFile( album_id => $album_id,
                                       type     => $_,
                                       filename => $converter->outputFilename( $filename, $_ ) );
        }
        
        system( "mv $spool_dest/$filename $img_dest/$filename" );
    } else {
        unlink( "$spool_dest/$filename" );
        
        $self->setError("error");
        $self->setErrorString( $converter->error );
    }
}    

1;
