#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
);
use Time::localtime;

use Opals::Marc21 qw(
    mc21_parseRecord
);

use Opals::Search qw(
    srch_getMarcImport
);
use Opals::Tb_Record qw(
    
    tb_defRecordIndex_getList
    tb_barcode_getMaxValue

    tb_record_setFlagUpdating
    tb_record_findByRId
    tb_record_add
    tb_record_delete
    
    tb_itemType_getList
    tb_item_findByRId
    tb_item_setFlagUpdating
    tb_item_add
    tb_item_delete

    tb_barcode_getList
    tb_isbn_getList
    tb_title_getList

    tb_record_idGen

);

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

my $cgi = CGI->new;
my $input = $cgi->Vars();

my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'txtbk/record/merge.tmpl',
#            reqPermission   => 'marc_edit',
        }
);

my $rid         = $input->{'rid'};
my $isbn        = $input->{'isbn'};
my $mergeBy     = $input->{'mergeBy'};
my $mid         = $input->{'mid'};
my $opt         = $input->{'opt'};


my $defRecordIndexList  = tb_defRecordIndex_getList($dbh, 1);
my $tbItemTypeList    = tb_itemType_getList($dbh);

my $tm = localtime;
my $dateToday = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday, $tm->hour, $tm->min, $tm->sec);

my $existRecord;
my $itemList;

my $maxBarcode  = tb_barcode_getMaxValue($dbh);
my $bcList      = tb_barcode_getList($dbh, $rid);
my $isbnList    = tb_isbn_getList($dbh, $rid);
    my $sfInfo;
    my $sfTitle;
    my $sfIsbn;
    my $ridList;

    if ($opt && $opt eq 'list'){
        if (defined $input->{'mid'} && $input->{'mid'} >= 0 ) { # && $input->{'mid'} =~ m/^[\d]+$/  ) {
            my ($tag, $ind1, $ind2, $sfCode, $data);
            my $sfXml;
            my $field;
            my $fId;

            my $jsxmlMarc = srch_getMarcImport($dbh, 1, $input->{'mid'}) ;
            while ($jsxmlMarc =~ s/[\s]*<datafield tag="([\d]{3})" ind1="([\d ])" ind2="([\d ])">(([\s]*<subfield code=".">.*<\/subfield>)*)[\s]*<\/datafield>//) {
                $tag   = $1;
                $ind1  = $2;
                $ind2  = $3;
                $sfXml = $4;
                $field = undef;
                my @subfield = ();
                my ($curfId, $prefId) = ('','');
                while ($sfXml =~ s/[\s]*<subfield code="([\w])">(.*)<\/subfield>// && $tag ne '852') {
                    ($sfCode, $data) = ($1, $2);
                    $fId = $tag . "_" . $sfCode;
                    ($data) || ($data = ' '); # fix empty (sub)field
                    $data =~ s/^\s+|\s+$//g;
                    push @{$sfInfo->{$fId}}, $data;
                    if ($fId eq '020_a'){
                        push @{$sfIsbn} , $data;
                    }
                    if ($fId eq '245_a'){
                        push @{$sfTitle}, $data;
                    }
                }
            }
            my $newrid  = 0; #tb_record_idGen($dbh);
            my $newRecord  = mapRecordFields($dbh, $newrid ,$sfInfo);
            $template->param(
                newrid      => $newrid,
                mid         => $mid,
                newRecord   => $newRecord,
                #txtbk_edit      => 1,
            );
        }

        if ($rid && $rid > 0 ) { 
            ($rid, $existRecord) = tb_record_findByRId($dbh,$rid,'0');
            $itemList    = tb_item_findByRId($dbh,$rid);
            $ridList = getRIdList($dbh, $isbn);
            $template->param(
                rid         => $rid,
                existRecord => $existRecord,
                itemList    => $itemList,
                ridList     => $ridList,
                #txtbk_edit      => 1,
            );
        }
    }
    elsif ($opt && $opt eq 'updateRecord'){
        my @bCode       = ($cgi->param('bcode'));
        my @itType      = ($cgi->param('ittype'));
        my @lCode       = ($cgi->param('lcode'));
        my @price       = ($cgi->param('price'));
        my @classNo     = ($cgi->param('classno'));
        my @acqDate     = ($cgi->param('acquisitiondate'));
        my @distributor = ($cgi->param('distributor'));
        my @PONo        = ($cgi->param('pono'));
        my @regionCode  = ($cgi->param('rgncode'));
        my @districtCode    = ($cgi->param('dstcode'));
        my @buildingCode    = ($cgi->param('bldcode'));
        my @importDate  = ($cgi->param('impdate'));
        my $recordInfo;
        my $itemList;

        tb_record_setFlagUpdating($dbh, $rid);
        tb_item_setFlagUpdating($dbh, $rid);
        my $retRecAdd = tb_record_add($dbh, $rid, '005', $dateToday);
        foreach my $def(@$defRecordIndexList){
            my $fId= $def->{'fieldId'} . '_' . $def->{'subfield'};
            if ($def->{'repeatable'}){
                my @fVals = ($cgi->param($fId));
                my $n = scalar(@fVals);
                foreach my $f(@fVals){
                    my $ret = tb_record_add($dbh, $rid, $fId, $f);
                }
            }
            else{
                my $fVal = $input->{$fId};
                my $ret = tb_record_add($dbh, $rid, $fId, $fVal);
            }
        }
        for my $i (0 .. $#bCode){
            my $params = {
                rid         => $rid,
                barcode     => $bCode[$i],
                typeId      => $itType[$i],
                lCode       => $lCode[$i],
                price       => $price[$i],
                classno     => $classNo[$i],
                acqDate     => $acqDate[$i],
                PONo        => $PONo[$i],
                distributor => $distributor[$i],
                regionCode  => $regionCode[$i],
                districtCode=> $districtCode[$i],
                buildingCode=> $buildingCode[$i],
                importDate  => $importDate[$i],
            };
            my $ret = tb_item_add($dbh, $params);
        }
        tb_record_delete($dbh, $rid,1);    
        tb_item_delete($dbh, $rid, 1);  
        ($rid, $recordInfo) = tb_record_findByRId($dbh,$rid, '1');
        $itemList    = tb_item_findByRId($dbh,$rid);
    }
    elsif ($opt && $opt eq 'importRecord'){



    }

    elsif ($opt && $opt eq 'test'){
        listDuplicate => getDuplicateList($dbh,$input->{'iid'});

    }

$template->param(
        tbItemTypeList  => $tbItemTypeList, 
        maxBarcode      => $maxBarcode,
        barcodeList     => $bcList,
        isbnList        => $isbnList,
        todayDateTime   => $dateToday,
);


tmpl_write($dbh, $cgi, $cookie, $template);
#$dbh->disconnect();

#----------------------------------------------------------------------------

sub getRIdList {

    my ($dbh, $isbn) = @_;
    my @ridList;
    my $i = 0;
    return \@ridList if ($isbn eq '');
    my $sql = "select rid, deleted from tb_records where fId = '020_a' && fVal = ?";
   
    my $sth = $dbh->prepare($sql);
    $sth->execute($isbn);
    while (my $rec  = $sth->fetchrow_hashref){
        $rec->{'i'} = $i++;
        push @ridList, $rec;
    }
    $sth->finish;
    return \@ridList;

}

sub mapRecordFields {
    my $rec_info;
    my ($dbh, $rid, $sfInfo) = @_;
    my @record = ();
    my $order = 0;
    my $myHash;
    my @arr = ();
    my $sql = "SELECT * 
               FROM tb_index_map where showed = 1
               order by displayOrder ";
    
    my $sth = $dbh->prepare($sql);
    $sth->execute();
    while( my $rec = $sth->fetchrow_hashref){
         if ($rec->{'repeatable'}){
             if ($sfInfo->{$rec->{'fId'}}){
                foreach my $val (@{$sfInfo->{$rec->{'fId'}}}){
                    push @{$myHash->{$rec->{'fId'}}}, { 
                        fVal        => $val,
                        fOrder      => $order,
                        url_link    => ($rec->{'fieldType'} eq '3')?1:0,
                        number      => ($rec->{'fieldType'} eq '4')?1:0,
                        checkbox    => ($rec->{'fieldType'} eq '5')?1:0,
                        };
                    $order++;
                    }
             }
             else {
                 push @{$myHash->{$rec->{'fId'}}}, { 
                    fVal        => '',
                    fOrder      => $order,
                    url_link    => ($rec->{'fieldType'} eq '3')?1:0,
                    number      => ($rec->{'fieldType'} eq '4')?1:0,
                    checkbox    => ($rec->{'fieldType'} eq '5')?1:0,
                };
                $order++;
             }
        }
        $rec_info->{$rec->{'fId'}} = {
            rid         => $rid,
#            fOrder      => $order++,
            fId         => $rec->{'fId'},
            fVal        => $sfInfo->{$rec->{'fId'}}[0],
            fVals       => \@{$myHash->{$rec->{'fId'}}},
            nfVals      => scalar(@{$myHash->{$rec->{'fId'}}}) > 1 ? scalar(@{$myHash->{$rec->{'fId'}}}):1,
            fName       => $rec->{'fieldName'},
            repeatable  => $rec->{'repeatable'},
            required    => $rec->{'required'},
            displayOrder=> $rec->{'displayOrder'},
            url_link    => ($rec->{'fieldType'} eq '3')?1:0,
            number      => ($rec->{'fieldType'} eq '4')?1:0,
            checkbox    => ($rec->{'fieldType'} eq '5')?1:0,
        };
    }
    foreach my $fid (sort keys %{$rec_info}) {
        push @record, $rec_info->{$fid};
    }

    $sth->finish;
    return \@record;

}

sub getDuplicateList {
    
    my ($dbh,$iid) = @_;

    my $sql = "select * from tb_marcDuplicate ";
    if ($iid && $iid =~ m/^[\d]+$/ && $iid > 0){
        $sql .= " where iid = $iid";
    }
    $sql .= " order by mid asc ";
    my @dupList = (); 
    my $sth = $dbh->prepare($sql);
    $sth->execute();
    while ( my $rec = $sth->fetchrow_hashref) {
        push @dupList, {
            title  => getSubField($rec->{'content'}, "245" , "a"),
            author => getSubField($rec->{'content'}, "100" , "a"),
            isbn   => getSubField($rec->{'content'}, "020" , "a"),
            mid    => $rec->{'mid'},
        };
    }
    $sth->finish;
    return \@dupList;
}

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;
}

