###########################################################################
#
# HtmlToExpediteeAction.pm -- 
# A component of the Greenstone digital library software
# from the New Zealand Digital Library Project at the 
# University of Waikato, New Zealand.
#
# Copyright (C) 2009 New Zealand Digital Library Project
#
# This program is free software; you can redistr   te it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
###########################################################################

package HtmlToExpediteeAction;

use strict;

use cgiactions::baseaction;

use ExpediteeFrameIO;
use JSON;


BEGIN {
#    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/perl-5.8");
}


@HtmlToExpediteeAction::ISA = ('baseaction');



# c=collect and site=xxxx implicitly handled by code
# 'c' is handled by baseaction, site is tested for only if greenstone3 


my $action_table =
{ 
    "generate-frame"     => { 'compulsory-args' => [ "fn", "json" ],
			      'optional-args'   => ["assoc", "compute-font"] }, 
};


sub new 
{
    my $class = shift (@_);
    my ($gsdl_cgi,$iis6_mode) = @_;

    my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode);

    return bless $self, $class;
}

##
# Subroutine for writing a collection.inf file -
# this is just so that when we load GlamED, it will
# only try to process framesets containing this file.
##
sub write_collection_info
{
	my ($output_dir,$collect) = @_;
	
	my $filename = &util::filename_cat($output_dir,"collection.inf");
	my $status = undef;
	
	if(open(FNOUT,">$filename")){
		binmode(FNOUT,":utf8");
		
		print FNOUT "$collect";
		close(FNOUT);
		$status =1;
	}else{
		print STDERR "Failed to open $filename for outputting collection info\n";
		
		$status = 0;
	}
	
	return $status;
}

sub generate_frame
{
    my $self = shift @_;

    my $username  = $self->{'username'};
    my $collect   = $self->{'collect'};
    my $gsdl_cgi  = $self->{'gsdl_cgi'};
    my $gsdlhome  = $self->{'gsdlhome'};

    my $site = $self->{'site'};
    my $collect_dir = $gsdl_cgi->get_collection_dir($site);

    my $fn = $self->{'fn'};
	
	my $assoc = $self->{'assoc'};
	
	my $compute_font = $self->{'compute-font'};
	print STDERR "Wil send compute_font... $compute_font\n\n";
	
    # no need to lock collection (??), the operation is read only

    my $json_str_unicode = $self->{'json'}; 
    my $json_str_utf8 = Encode::encode("utf8",$json_str_unicode);
    my $exp_frame_tree = decode_json $json_str_utf8;

    #if (!-d $output_dir) {
	#&util::mk_dir($output_dir);
    #}
	
	#Check for export directory. If it doesn't exist, create it.
	my $export_dir = &util::filename_cat($collect_dir,$collect,"export");
	
	if(!-d $export_dir){
		&util::mk_dir($export_dir);
	}
	
	#create output subdirectory within export directory.
	my $output_dir = &util::filename_cat($collect_dir,$collect,"export",$collect);
	
	if(!-d $output_dir){
		&util::mk_dir($output_dir);
	}

    my $expeditee_frame_io = new ExpediteeFrameIO($output_dir);
    
    $expeditee_frame_io->buildFrame($exp_frame_tree,$compute_font);

    if ($expeditee_frame_io->saveFrame("$fn.exp",$assoc)) {
	
	# write out next free frame num
	$expeditee_frame_io->saveLastFrameNumber($fn,$collect);
	
	# TODO: Have a parameter so that this file is only written out if requested.
	write_collection_info($output_dir,$collect);
	
	$gsdl_cgi->generate_message("html-to-expeditee saved frame $fn");
    }
    else {
	$gsdl_cgi->generate_error("Failed to save frame number $fn");
    }
}


1;
