#!/usr/bin/perl -w

use strict;
use MARC::File::USMARC;
use MARC::File::XML;
use lib "/www/opals/module";
use Digest::SHA qw(
    sha1_base64
);

#use Opals::Context('/etc/opals/conf/alp_alp');
use Opals::Context('/etc/opals/conf/opl_ha');
$| = 1;

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


my @fieldDef_user = (
    {name => 'firstname',       tag => '100', sfcode  => 'a'},
    {name => 'middlename',      tag => '100', sfcode  => 'b' },
    {name => 'lastname',        tag => '100', sfcode  => 'c' },
    {name => 'nickname',        tag => '100', sfcode  => 'n' },
    {name => 'birthday',        tag => '100', sfcode  => 'k' },
    {name => 'gender',          tag => '100', sfcode  => 'f' },
    {name => 'identification',  tag => '100', sfcode  => 's' },

    {name => 'addrLine1',       tag => '110', sfcode  => 'a' },
    {name => 'addrLine2',       tag => '110', sfcode  => 'n' },
    {name => 'city',            tag => '110', sfcode  => 'b' },
    {name => 'state',           tag => '110', sfcode  => 'c' },
    {name => 'country',         tag => '110', sfcode  => 'd' },
    {name => 'zip',             tag => '110', sfcode  => 'e' },
    {name => 'neighborhood',    tag => '110', sfcode  => 'f' },
    {name => 'residency',       tag => '110', sfcode  => 'h' },
    {name => 'phone',           tag => '110', sfcode  => 'k' },
    {name => 'fax',             tag => '110', sfcode  => 'l' },
    {name => 'email',           tag => '110', sfcode  => 'm' },



    
    {name => 'addrLine1_alt',   tag => '111', sfcode  => 'a' },
    {name => 'city_alt',        tag => '111', sfcode  => 'b' },
    {name => 'state_alt',       tag => '111', sfcode  => 'c' },
    {name => 'country_alt',     tag => '111', sfcode  => 'd' },
    {name => 'zip_alt',         tag => '111', sfcode  => 'e' },
    {name => 'neighborhood_alt',tag => '111', sfcode  => 'f' },
 
    {name => 'issueBy',      tag => '852', sfcode  => 'a' },
    #{name => 'homeroom',        tag => '852', sfcode  => 'b' },
    {name => 'categorycode',    tag => '852', sfcode  => 'b' },
    {name => 'teacher',         tag => '852', sfcode  => 'c' },
    {name => 'pref_lang',       tag => '852', sfcode  => 'f' },
    {name => 'grade',           tag => '852', sfcode  => 'g' },
    {name => 'yeargraduation',  tag => '852', sfcode  => 'h' },
    {name => 'username',        tag => '852', sfcode  => 'o' },
    {name => 'userbarcode',     tag => '852', sfcode  => 'p' },
    {name => 'password',        tag => '852', sfcode  => 'q' },
    {name => 'notes',           tag => '852', sfcode  => 'z' },

    {name => 'created',         tag => '008'},
    {name => 'expirydate',      tag => '853', sfcode  => 'e' },

);

my @fieldDef_guardian = (
    {name => 'addrLine1',       tag => '110', sfcode  => 'a' },
    {name => 'city',            tag => '110', sfcode  => 'b' },
    {name => 'state',           tag => '110', sfcode  => 'c' },
    {name => 'country',         tag => '110', sfcode  => 'd' },
    {name => 'zip',             tag => '110', sfcode  => 'e' },
    {name => 'neighborhood',    tag => '110', sfcode  => 'f' },
    {name => 'email',           tag => '120', sfcode  => 'c' },
    {name => 'phone',           tag => '120', sfcode  => 'a' },
    {name => 'fax',             tag => '120', sfcode  => 'b' },


);
    my $typeMap={
        "0000000002"=>{name=>"Adult (18+)"},
        "0000000003"=>{name=>"Administrators"},
        "0000000004"=>{name=>"Librarians"},
        "0000000012"=>{name=>"Library staff"},
        "0000000013"=>{name=>"ILL Institution"},
        "0000000015"=>{name=>"Outreach patron"},
        "0000000016"=>{name=>"Restricted status patron"},
        "0000000017"=>{name=>"Inactive patron"},
        "0000000019"=>{name=>"Temporary patron"},
        "0000000020"=>{name=>"Suspended patron"},
        "0000000026"=>{name=>"Unverified"},
        "0000000033"=>{name=>"Virtual service"},
        "0000000042"=>{name=>"SILS Lakeland region patron"},
        "0000000043"=>{name=>"Library volunteer"},
        "0000000044"=>{name=>"Child (0-13)"},
        "0000000045"=>{name=>"Outreach institution"},
        "0000000048"=>{name=>"Print disabled"},
        "0000000049"=>{name=>"Institution"},
        "0000000051"=>{name=>"Non-resident patron - Adult (18+)"},
        "0000000052"=>{name=>"Provincial library community"},
        "0000000053"=>{name=>"System functions"},
        "0000000054"=>{name=>"Young adult (14-17)"},
        "0000000055"=>{name=>"Non-resident patron - Young adult (14-17)"},
        "0000000056"=>{name=>"Non resident patron - Child (0-13)"},
        "0000000040"=>{name=>"New Special Reserve Group1"}
    };

my @fArr=();
foreach my $f(@fieldDef_user){
    push @fArr,$f->{'name'} ."=?";
}
push @fArr, " permissions=?";
my $fList= join ",",@fArr;
my $sql="insert into opl_user_alp set $fList";
print "$sql\n";
my $file= @ARGV[0];
my $marcFile = MARC::File::USMARC->in($file);
while (my $rec = $marcFile->next) {
    my @fValArr=();
    my $permissions="";
    foreach my $fd (@fieldDef_user) {
        my $sfval =$fd->{'tag'} gt "009"? $rec->subfield($fd->{'tag'}, $fd->{'sfcode'}):$rec->field($fd->{'tag'})->data();
        ($sfval) || ($sfval = '');
        if($fd->{'name'} eq 'password' && $sfval ne ''){
            $sfval=sha1_base64($sfval);
        }
        if($fd->{'name'} eq 'categorycode' && $sfval ne ''){
            $sfval=getUserType($sfval);
        }
        if($fd->{'name'} eq 'gender' && $sfval ne ''){
            $sfval= ($sfval=~ m/^f/i)?0:1;
        }
        push @fValArr,$sfval;
    }
    $dbh->do($sql,undef,@fValArr);
}
$marcFile->close;


sub getUserType{
    my($typeCode)=@_;
    if($typeMap->{$typeCode}){
        if(!defined $typeMap->{$typeCode}->{'code'}){
            $dbh->do("insert into  opl_category_alp set cattype=?, catname=?",undef,$typeCode,$typeMap->{$typeCode}->{'name'});
            $typeMap->{$typeCode}->{'code'}=$dbh->{'mysql_insertid'};
        }
    }
    else{
        $dbh->do("insert into  opl_category_alp set cattype=?, catname=?",undef,$typeCode,$typeCode);

         $typeMap->{$typeCode}->{'name'}=$typeCode;
         $typeMap->{$typeCode}->{'code'}=$dbh->{'mysql_insertid'};
    }
    return $typeMap->{$typeCode}->{'code'};
    
}


