#!/usr/bin/perl

#use utf8;
use lib '/www/opals/module';
use Opals::Context("/etc/opals/conf/scsd_snm");
use strict;
use DBI;


use Opals::MarcXml qw(
    mxml_updateDbZebra
    mxml_addItemType
);
#    mxml_validateRid

use Opals::Marc21 qw(
    mc21_parseRecord
    mc21_maxBarcodeTmp
    mc21_maxBarcodeDup
);

use Opals::Search qw(
    srch_identicalCriteria
    srch_checkLocalDatabase
    srch_F852Default_marcxml
    srch_validateRid
);
use Opals::Utility qw(
    util_formatBarcode
    util_removeChar
);

my $dbh = Opals::Context->dbh();

END { $dbh->disconnect(); }


   my $sth=$dbh->prepare('select  * from opl_marcDuplicate ');
   $sth->execute();
   while (my $merge=$sth->fetchrow_hashref) {
       mergeRecords($dbh,$merge);
   }
    
#$dbh->disconnect();
################################################################################



sub mergeRecords {
    my ($dbh,$merge) = @_;
    my $criteria = srch_identicalCriteria($merge->{'content'});
    my @recordList = srch_checkLocalDatabase($dbh, $criteria);
    if(scalar(@recordList)>0){
        my $rid= @recordList[0]->{'rid'};
        print $rid ."\n";
        my $oldxml = @recordList[0]->{'content'};
        my $newxml = $merge->{'content'};
        $newxml = processNewHolding($dbh, $newxml, $rid, "3");
        $oldxml = Merge($dbh, $rid, $newxml, $oldxml, "3");
        $dbh->do("update  opl_marcImport set     countMerged = countMerged + 1 where   iid = $merge->{'iid'} ");
        $dbh->do("update  opl_marcRecord set     zIndexed = 0 where   rid = $rid ");
        $dbh->do("delete from opl_marcDuplicate where mid = $merge->{'mid'} ");
    }
}

#----------------------------------------------------------
sub Merge
{
    my ($dbh, $rid, $srcxml, $dstxml) = @_;
    my ($f852src, $f852dst);
#    open ttt, ">/tmp/ttt";
    ($f852src, $srcxml) = GetFieldStr($srcxml, "852");
    ($f852dst, $dstxml) = GetFieldStr($dstxml, "852");
#    print ttt "1 ########\n$f852src\n2 ########\n$f852dst\n";
#    $f852dst .= $f852src;
#    print ttt "3 ########\n$f852src\n4 ########\n$f852dst\n";
    $dstxml =~ s/[\s]*<\/record>/$f852dst$f852src\n<\/record>/;
#    close ttt;
    
#    $dstxml =~ s/[\n]+/\n/g;
    mxml_updateDbZebra($dbh, $rid, $dstxml);
    return $dstxml;
}



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







#----------------------------------------------------------
# Hmm, 'GetFieldStr' should be named 'stripFieldStr'
sub GetFieldStr
{
    my ($xml, $field) = @_;
    my $fieldStr;
    
    if ($field =~ m/leader/) {
        while ($xml =~ s/([\s]*<leader>(.*)<\/leader>)//) {
            $fieldStr = $1;
        }
    }
    elsif ($field =~ m/00\d/) {
        while ($xml =~ s/([\s]*<controlfield tag="$field">.*<\/controlfield>)//) {
            $fieldStr .= $1;
        }
    }
    else {
        while ($xml =~ s/([\s]*<datafield tag="$field" ind1="[\d ]" ind2="[\d ]">([\s]*<subfield code=".">.*<\/subfield>)*[\s]*<\/datafield>)//) {
            $fieldStr .= $1;
        }
    }
    
    return ($fieldStr, $xml);
}


sub GetSubField {
    my ($xml, $tag, $sfcode) = @_;
    my $data;
    if ($xml =~ m/([\s]*<datafield tag="$tag" ind1="[\d ]" ind2="[\d ]">([\s]*<subfield code=".">.*<\/subfield>)+[\s]*<\/datafield>)/) {
        if ($1 =~ m/<subfield code="$sfcode">(.*)<\/subfield>/) {
            $data = $1;
        }
    }

    return $data;
}


#----------------------------------------------------------
sub Merge
{
    my ($dbh, $rid, $srcxml, $dstxml) = @_;
    my ($f852src, $f852dst);
#    open ttt, ">/tmp/ttt";
    ($f852src, $srcxml) = GetFieldStr($srcxml, "852");
    ($f852dst, $dstxml) = GetFieldStr($dstxml, "852");
#    print ttt "1 ########\n$f852src\n2 ########\n$f852dst\n";
#    $f852dst .= $f852src;
#    print ttt "3 ########\n$f852src\n4 ########\n$f852dst\n";
    $dstxml =~ s/[\s]*<\/record>/$f852dst$f852src\n<\/record>/;
#    close ttt;
    
#    $dstxml =~ s/[\n]+/\n/g;
    mxml_updateDbZebra($dbh, $rid, $dstxml);
    return $dstxml;
}


#----------------------------------------------------------
sub processNewHolding {
    my ($dbh, $xml, $rid, $itemType_sfCode) = @_;

    my $f852 = '';
    my $sth_barcode = $dbh->prepare(<<_STH_);
select  count(*)
from    opl_item
where   barcode = ?
_STH_

    my $sth_insertItem = $dbh->prepare(<<_STH_);
insert into opl_item
set     rid         = $rid,
        barcode     = ?,
        typeId      = ?,
        callNumber  = ?,
        dateImport  = now()
_STH_

    my $f852Default = srch_F852Default_marcxml($dbh, 0);
    if ($xml !~ m/<datafield tag="852"/) {
        $xml =~ s/[\s]*<\/record>/$f852Default\n<\/record>/;
    }

    my @newSubFields;
    while ($xml =~ s/([\s]*<datafield tag="852" ind1="[\d ]" ind2="[\d ]">([\s]*<subfield code="[\w]">.*<\/subfield>)+[\s]*<\/datafield>)//) {
        my $fsub = $1;
        my ($bc, $newbc, $newSubfield);
        if ($fsub =~ s/[\s]*<subfield code="p">(.*)<\/subfield>/_fdsa_/) {
            $newSubfield = $1;
            $bc = $newSubfield;
            #$bc =~ s/ *[:\/] *$//;
            $bc =~ s/(^[\s]+|[\s]+$)//;
            if ($bc) {
                $sth_barcode->execute($bc) || return;
                my ($cBarcode) = $sth_barcode->fetchrow_array;
                if ($cBarcode) { # duplicate
                    if ($bc =~ m/TMP\_/) {
                        $newbc  = mc21_maxBarcodeTmp($dbh);
                    }
                    else {
                        $newbc = mc21_maxBarcodeDup($dbh, $bc);
                    }
                }
                else {
                    $newbc = $bc;
                }
            }
            else {
                $newbc  = mc21_maxBarcodeTmp($dbh);
            }
        }
        else {
            $fsub =~ s/[\s]*<\/datafield>/_fdsa_\n  <\/datafield>/;
            $newbc  = mc21_maxBarcodeTmp($dbh);
        }

        $fsub =~ s/_fdsa_/\n    <subfield code="p">$newbc<\/subfield>/;

        # The code duplicating item type into zebra is for nothing
        my $typeId;
        if ($fsub =~ s/[\s]*<subfield code="$itemType_sfCode">(.*)<\/subfield>/_asdf_/) {
            $typeId = $1;
            $typeId =~ s/ *[:\/] *$//;
            mxml_addItemType($dbh, $typeId);
        }
        else {
            $fsub =~ s/[\s]*<\/datafield>/_asdf_\n  <\/datafield>/;
            ($typeId) = $dbh->selectrow_array("select id from opl_itemType where defaultType=1");
        }

        $fsub =~ s/_asdf_/\n    <subfield code="3">$typeId<\/subfield>/;

        my $callNumber  = GetSubField($fsub, '852', 'k') . ' ' .
                          GetSubField($fsub, '852', 'h') . ' ' .
                          GetSubField($fsub, '852', 'i') . ' ' .
                          GetSubField($fsub, '852', 'm');
        $callNumber =~ s/ +/ /g;
        $callNumber =~ s/(^ | $)//g;
        $sth_insertItem->execute($newbc, $typeId, $callNumber);

        $f852 .= $fsub;
        addItemInfo($dbh, $fsub, $newbc);
    }

    $sth_barcode->finish;

    $xml =~ s/[\s]*<\/record>/$f852\n<\/record>/;
    return $xml;
}


sub addItemInfo {
    my ($dbh, $f852, $barcode) = @_;
    my $sth = $dbh->prepare(<<_SQL_);
insert into opl_itemInfo
set barcode    = ?,
    sf852Code  = ?,
    sf852Data  = ?
_SQL_
    while ($f852 =~ s/[\s]*<subfield code="([\w])">(.*)<\/subfield>//) {
        $sth->execute($barcode, $1, $2);
    }
    $sth->finish;
}


