#!/usr/bin/perl 
#
# This script is used to remove all duplicate barcodes.
#
use lib '/www/opals/module';
#use Opals::Context("/etc/opals/conf/_MY_SITE_");
use Opals::Context("/etc/opals/conf/odev");

use strict;
use DBI;
#use Getopt::Std;
use POSIX qw(
    ceil
);
use Opals::Marc::Record;
use MARC::File::XML;

use Opals::MarcXml qw(
    mxml_update
);


use Getopt::Std;
use POSIX qw(
    ceil
    floor
);

my $dbh = Opals::Context->dbh();
END {
    if ($dbh) {
        $dbh->disconnect();
    }
}


$| = 1;

my $zdbDir = Opals::Context->config('zRoot') .'/'
           . Opals::Context->config('zPort') .'/'
           . 'record' .'/'
           . Opals::Context->config('zDatabase');


my $sth = $dbh->prepare(<<_SQL_);
select distinct rid 
from opl_item
where barcode not regexp '^\_\_' 
order by rid 
_SQL_

    $sth->execute;
    my $dir;
    while (my ($rid) = $sth->fetchrow_array) {
        if($rid){
            my $xml=getRecXml($rid);
            #updateRecXml($dbh,$rid);
            my $marc = Opals::Marc::Record::newFromXml($xml);
            my $match=recMatchCritetia($marc,'856','z','Click here to read this eBook');
            if($match){
                print $rid,"\n";
                my $content = MARC::File::XML::record($marc);
                addReplaceSubfield($marc,'852','k','eBook');
                transferSubfield($marc,'856','z','3');
                changeRecType($marc,'Internet');
                $content = MARC::File::XML::record($marc);
#                print "$content\n";
                mxml_update($dbh,{rid=>$rid,marcXml=>$content});
            }
        }
    }
    
    $sth->finish;


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

sub getRecXml{
    my($rid)=@_;
    my $dir     = "$zdbDir/" . ceil($rid/1000);
    my $xml="";
    if (-f "$dir/$rid.xml") {
        open  RECORD, "<$dir/$rid.xml";
        my $line;
        while (<RECORD>) {
            $line = $_;
            if ($line !~ m/<subfield code="-"/) {
                    $xml .= $line;
            }

       }
        close RECORD;
    }
    return $xml;

}


############################################################
sub changeRecType{
    my($marc,$type)=@_;
    my $leader =$marc->leader();
    my $cf007 =$marc->field('007');
    my $cf008 =$marc->field('008');

    my $recTypes={
    'Book'              =>{leader=>[{pos=>6,val=>'a'},{pos=>7,val=>'m'}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Journal'           =>{leader=>[{pos=>6,val=>'a'},{pos=>7,val=>'s'}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Artifact'          =>{leader=>[{pos=>6,val=>'r'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Photos, Posters'   =>{leader=>[{pos=>6,val=>'k'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Music Cassette'    =>{leader=>[{pos=>6,val=>'j'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'CD Music'          =>{leader=>[{pos=>6,val=>' '},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>'s'},{pos=>1,val=>'d'}], cf008=>[{pos=>26,val=>' '}]},
    'Electronic Media'  =>{leader=>[{pos=>6,val=>'m'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Movie'             =>{leader=>[{pos=>6,val=>'g'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Videocassette'     =>{leader=>[{pos=>6,val=>' '},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>'v'},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Internet'          =>{leader=>[{pos=>6,val=>'m'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>'j'}]},
    'Compact Disc'      =>{leader=>[{pos=>6,val=>' '},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>'c'},{pos=>1,val=>'o'}], cf008=>[{pos=>26,val=>' '}]},
    'Book on Tape'      =>{leader=>[{pos=>6,val=>'i'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Libray Kit'        =>{leader=>[{pos=>6,val=>'o'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Map'               =>{leader=>[{pos=>6,val=>'e'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]},
    'Sheet Music'       =>{leader=>[{pos=>6,val=>'c'},{pos=>7,val=>' '}], cf007=>[{pos=>0,val=>' '},{pos=>1,val=>' '}], cf008=>[{pos=>26,val=>' '}]}
    };

    if($recTypes->{$type}){
       my $dataLeader=$leader;
       foreach my $l (@{$recTypes->{$type}->{'leader'}}){
           $dataLeader =replaceStr($dataLeader,$l->{'pos'},$l->{'val'});
       }
       $marc->leader($dataLeader); 
       my $data007=$cf007->data();
       foreach my $l (@{$recTypes->{$type}->{'cf007'}}){
           $data007 =replaceStr($data007,$l->{'pos'},$l->{'val'});
       }
       my @new_fields = $marc->field('007');
       $cf007->update($data007);

       my $data008=$cf008->data();
       foreach my $l (@{$recTypes->{$type}->{'cf008'}}){
           $data008 =replaceStr($data008,$l->{'pos'},$l->{'val'});
       }
       $cf008->update($data008);
       
    }
}
############################################################
sub replaceStr{
    my ($str,$pos,$c)=@_;    
    $str=substr($str,0,$pos) . $c . substr($str,$pos + length($c));
    return $str;    
}

############################################################
sub transferSubfield{
    my ($marc,$tag,$sfCodeFrom,$sfCodeTo)=@_;
    my @fields =$marc->field($tag);
    foreach my $f(@fields){
        my $sfData = $f->subfield($sfCodeFrom);
        $f->delete_subfield(code=>"$sfCodeFrom");
        $f->add_subfields($sfCodeTo=>$sfData);
    }
}

############################################################
sub addReplaceSubfield{
    my ($marc,$tag,$sfCode,$sfData)=@_;
    my @fields =$marc->field($tag); 
    foreach my $f(@fields){
        my $sf= $f->subfield($sfCode);
        if($sf){
            $f->update($sfCode=>$sfData);
        }
        else{
            $f->add_subfields($sfCode=>$sfData);
        }
    }

    
}

############################################################
sub recMatchCritetia{
    my ($marc,$fTag,$sfCode,$sfData)=@_;
    my $match=0;
    my @subfield=$marc->subfield($fTag,$sfCode);
    foreach my $sf(@subfield){
        if($sf =~ m/$sfData/gc){
            $match=1;
            last;
        }
    }
    
    return $match;
}


############################################################
sub makeConnection {
    my ($config) = @_;
    if (!$config) {
        return;
    }
    my ($db_driver, $db_name, $db_host, $db_port, $db_user, $db_password);

    $db_driver   = $config->{'db_driver'} || 'mysql';
    $db_name     = $config->{'db_name'};
    $db_host     = $config->{'db_host'};
    $db_port     = $config->{'db_port'}   || '3306';
    $db_user     = $config->{'db_user'};
    $db_password = $config->{'db_password'};

    my $dsn = "dbi:$db_driver:$db_name:$db_host:$db_port";

    return DBI->connect($dsn, $db_user, $db_password);
}


############################################################
sub loadConfig {
    my ($configFile) = @_;
#    print "Enter the config filename of Opals: ";
#    $configFile = <STDIN>;
    my $config = {};

    open CONF, $configFile || die "Cannot open file $configFile";
    while (<CONF>) {
        chomp;
        s/#.*//;                # remove comments
        next if /^\s*$/;        # ignore blank lines

        if (/^\s*(\w+)\s*=\s*(.*?)\s*$/) {
            $config->{$1} = $2;
        }
    }
    close CONF;
    
    return $config;
}
############################################################


exit 0;

