#!/usr/bin/perl 
use lib '/www/opals/module';

use MARC::Record;
use MARC::Field;
use Text::CSV_XS;

open CSV ,"</tmp/BOOKS.csv";
my $fieldMap;
my $colFieldMap={
   "BOOK ID"  => {tag=>"852",sfCode=>"p"},
   "TITLE"    => {tag=>"245",sfCode=>"a"},
   "AUTHOR"   => {tag=>"100",sfCode=>"a"},
   "CATEGORY" => {tag=>"655",sfCode=>"a"},
   "LANGUAGE" => {function=>"setMarcLang"}, 
   "DDC"      => {tag=>"852",sfCode=>"h"},
   "PUBLISHER"=> {tag=>"260",sfCode=>"b"},
   "YEAR"     => {tag=>"260",sfCode=>"c"},
   "ISBN"     => {tag=>"020",sfCode=>"a"},
   "PRICE"    => {tag=>"852",sfCode=>"9"},
   "NOTE"     => {tag=>"500",sfCode=>"a"}
};
my $langCodeMap= getLangCodeTbl();
my @rData = ();
    while (<CSV>) {
        push @rData,  $_;
    }
    close csvFile;
    $fieldMap=getFielMap($rData[0]);
    open tmp, ">/tmp/library_books.mrc";
    for(my $i=1; $i<scalar(@rData);$i++){
    #for(my $i=1; $i<20;$i++){
        my $rec =parseCSVfields2marc21Rec($fieldMap,$rData[$i]); 
        print tmp $rec->as_usmarc;
        #print $rec->as_formatted, "\n======================================================================\n";
    }
    close tmp;

#------------------------------------------------------
sub getFielMap{
    my ($str)=@_;
    my @fields = split /,/, $str;
    my $fieldMap={};
     for(my $i=0; $i<scalar(@fields);$i++){
        @fields[$i] =~ s/^"|"$//g;
        @fields[$i] =~ s/^ +| +$|\n//g;
        if($colFieldMap->{@fields[$i]}){
            my $tag   =$colFieldMap->{@fields[$i]}->{'tag'};
            my $fnct  =$colFieldMap->{@fields[$i]}->{'function'};
            if(defined $tag){
                if($tag =~ m/^\d{3}$/g){
                    my $sfCode=$colFieldMap->{@fields[$i]}->{'sfCode'};      
                    $fieldMap->{$tag}->{$sfCode}=$i;
                }
            }    
            elsif(defined $fnct ){
                $fieldMap->{$fnct}=$i;
            }
        }
    }
    return $fieldMap;
}

#------------------------------------------------------
sub parseCSVfields2marc21Rec{
    my ($fieldMap,$fieldStr)=@_;
    my $csv = Text::CSV_XS->new({binary => 1,allow_loose_quotes=>1 });
    $csv->parse($fieldStr);
    my @fields = $csv->fields();
    #my @fields = split /,/, $fieldStr;
    my $LEADER = '00000cam  2200241   4500';
    my $f008   ="960618s1973    xxu           000 0 eng d";
    my $record = MARC::Record->new();
    $record->leader($LEADER);
    setCtrlField($record,'008',$f008);
    foreach my $tag (sort keys %$fieldMap){
        my $data ="";
        my($ind1, $ind2)=(' ',' ');
        ($ind1, $ind2)=('1','0')if($tag=~ /100|245/);
        if($tag =~ m/00\d/){
            my $i =$fieldMap->{$tag};
            my $data=@fields[$i];
            $data =~ s/^"|"$//g;
            setCtrlField($tag,$data);
        }
        elsif($tag =~ m/\d\d\d/){
            foreach my $sfCode(sort keys %{$fieldMap->{$tag}}){
                my $i =$fieldMap->{$tag}->{$sfCode};
                my $data=@fields[$i];
                $data =~ s/^"|"$//g;
                setDataField($record,$tag,$sfCode,$ind1, $ind2,$data);
            }
        }
        elsif($tag =~ m/^[a-zA-Z]/){
            my $i =$fieldMap->{$tag};
            my $data=@fields[$i];
                $data =~ s/^"|"$//g;
            setFieldByFunction($record,$tag,$data);
        }
        
    }

    return $record;
}

#----------------------------------------------------
sub setLangCode{
    my($marc,$lang)=@_;
    my $langCode=getLangCode($lang) ;
    if(defined $langCode){
        my $field = $marc->field( '008' );
        my $data = $field->data();
        substr($data, 35, 3) = $langCode;
        $field->update($data);

    }
}
#----------------------------------------------------
sub setDataField{
    my ($marc,$tag,$sfCode,$ind1,$ind2,$data)=@_;
    $data =fixData($data);
    return if($data eq '');
    my $field=$marc->field($tag);
    if(!defined $field){
        $field=MARC::Field->new($tag,$ind1,$ind2, $sfCode=>$data);
        $marc->insert_fields_ordered($field);
    }
    else{
        $field->update( $sfCode => $data);
    }


}
#----------------------------------------------------

sub setCtrlField{
    my ($marc,$tag,$data)=@_;
    my $field=$marc->field($tag);
    if($field){
        $field->update($data);
    }
    else{
        $field = MARC::Field->new($tag, $data);
        $marc->insert_fields_ordered($field);
    }
}
#----------------------------------------------------
sub setFieldByFunction{
    my($marc,$fnctName,$data)=@_;
    if($fnctName eq 'setMarcLang'){
        setLangCode($marc,$data);
    }
}
sub getLangCode{
    my ($lang)=@_;
    return $langCodeMap->{$lang};
}
#----------------------------------------------------
sub fixData{
    my ($data)=@_;
    $data=~ s/^"|"$//g;
    $data=~ s// /g;
    $data=~ s//'/g;
    return $data;
}
#----------------------------------------------------
sub getLangCodeTbl{
   my $langCodeMap={
    "Afar"			    =>"aar",
    "Abkhazian"			=>"abk",
    "Afrikaans"			=>"afr",
    "Albanian"			=>"alb",
    "Albanian"			=>"sqi",
    "Amharic"			=>"amh",
    "Arabic"			=>"ara",
    "Aragonese"			=>"arg",
    "Armenian"			=>"arm",
    "Armenian"			=>"hye",
    "Assamese"			=>"asm",
    "Avestan"			=>"ave",
    "Aymara"			=>"aym",
    "Azerbaijani"		=>"aze",
    "Bashkir"			=>"bak",
    "Basque"			=>"baq",
    "Basque"			=>"eus",
    "Belarusian"		=>"bel",
    "Bengali"			=>"ben",
    "Bihari"			=>"bih",
    "Bislama"			=>"bis",
    "Bosnian"			=>"bos",
    "Breton"			=>"bre",
    "Bulgarian"			=>"bul",
    "Burmese"			=>"bur",
    "Burmese"			=>"mya",
    "Catalan"			=>"cat",
    "Chamorro"			=>"cha",
    "Chechen"			=>"che",
    "Chinese"			=>"chi",
    "Chinese"			=>"zho",
    "Chuvash"			=>"chv",
    "Cornish"			=>"cor",
    "Corsican"			=>"cos",
    "Czech"		    	=>"cze",
    "Czech"	    		=>"ces",
    "Danish"			=>"dan",
    "Divehi"			=>"div",
    "Dutch"		    	=>"dut",
    "Dutch"		    	=>"nld",
    "Dzongkha"			=>"dzo",
    "English"			=>"eng",
    "Esperanto"			=>"epo",
    "Estonian"			=>"est",
    "Faroese"			=>"fao",
    "Fijian"			=>"fij",
    "Finnish"			=>"fin",
    "French"			=>"fre",
    "French"			=>"fra",
    "Western Frisian"	=>"fry",
    "Georgian"			=>"geo",
    "Georgian"			=>"kat",
    "German"			=>"ger",
    "German"			=>"deu",
    "Gaelic"			=>"gla",
    "Irish"		    	=>"gle",
    "Galician"			=>"glg",
    "Manx"	    		=>"glv",
    "Greek"	    		=>"gre",
    "Greek"		    	=>"ell",
    "Guarani"			=>"grn",
    "Gujarati"			=>"guj",
    "Haitian"			=>"hat",
    "Hausa"		    	=>"hau",
    "Hebrew"			=>"heb",
    "Herero"			=>"her",
    "Hindi"	    		=>"hin",
    "Hiri Motu"			=>"hmo",
    "Hungarian"			=>"hun",
    "Icelandic"			=>"ice",
    "Icelandic"			=>"isl",
    "Ido"		    	=>"ido",
    "Sichuan Yi"		=>"iii",
    "Inuktitut"			=>"iku",
    "Interlingue"		=>"ile",
    "Interlingua"		=>"ina",
    "Indonesian"		=>"ind",
    "Inupiaq"			=>"ipk",
    "Italian"			=>"ita",
    "Javanese"			=>"jav",
    "Japanese"			=>"jpn",
    "Kalaallisut"		=>"kal",
    "Kannada"			=>"kan",
    "Kashmiri"			=>"kas",
    "Kazakh"			=>"kaz",
    "Khmer"			    =>"khm",
    "Kikuyu"			=>"kik",
    "Kinyarwanda"		=>"kin",
    "Kirghiz"			=>"kir",
    "Komi"		    	=>"kom",
    "Korean"			=>"kor",
    "Kuanyama"			=>"kua",
    "Kurdish"			=>"kur",
    "Lao"			    =>"lao",
    "Latin"			    =>"lat",
    "Latvian"			=>"lav",
    "Limburgan"			=>"lim",
    "Lingala"			=>"lin",
    "Lithuanian"		=>"lit",
    "Luxembourgish"		=>"ltz",
    "Macedonian"		=>"mac",
    "Macedonian"		=>"mkd",
    "Marshallese"		=>"mah",
    "Malayalam"			=>"mal",
    "Maori"			    =>"mao",
    "Maori"			    =>"mri",
    "Marathi"			=>"mar",
    "Malay"			    =>"may",
    "Malay"			    =>"msa",
    "Malagasy"			=>"mlg",
    "Maltese"			=>"mlt",
    "Moldavian"			=>"mol",
    "Mongolian"			=>"mon",
    "Nauru"			    =>"nau",
    "Navaho, Navajo"	=>"nav",
    "Ndebele, South"	=>"nbl",
    "Ndebele, North"	=>"nde",
    "Ndonga"			=>"ndo",
    "Nepali"			=>"nep",
    "Norwegian Nynorsk"	=>"nno",
    "Norwegian Bokmal"	=>"nob",
    "Norwegian"			=>"nor",
    "Nyanja"			=>"nya",
    "Occitan"			=>"oci",
    "Oriya"			    =>"ori",
    "Oromo"			    =>"orm",
    "Ossetian"			=>"oss",
    "Panjabi"			=>"pan",
    "Persian"			=>"per",
    "Persian"			=>"fas",
    "Pali"			    =>"pli",
    "Polish"			=>"pol",
    "Portuguese"		=>"por",
    "Pushto"			=>"pus",
    "Quechua"			=>"que",
    "Raeto-Romance"		=>"roh",
    "Romanian"			=>"rum",
    "Romanian"			=>"ron",
    "Rundi"		    	=>"run",
    "Russian"			=>"rus",
    "Sango"		    	=>"sag",
    "Sanskrit"			=>"san",
    "Serbian"			=>"scc",
    "Serbian"			=>"srp",
    "Croatian"			=>"scr",
    "Croatian"			=>"hrv",
    "Sinhala"			=>"sin",
    "Slovak"			=>"slo",
    "Slovak"			=>"slk",
    "Slovenian"			=>"slv",
    "Northern Sami"		=>"sme",
    "Samoan"			=>"smo",
    "Shona"		    	=>"sna",
    "Sindhi"			=>"snd",
    "Somali"			=>"som",
    "Sotho,Southern"	=>"sot",
    "Spanish"			=>"spa",
    "Sardinian"			=>"srd",
    "Swati"		    	=>"ssw",
    "Sundanese"			=>"sun",
    "Swahili"			=>"swa",
    "Swedish"			=>"swe",
    "Tahitian"			=>"tah",
    "Tamil"		    	=>"tam",
    "Tatar"		    	=>"tat",
    "Telugu"			=>"tel",
    "Tajik"		    	=>"tgk",
    "Tagalog"			=>"tgl",
    "Thai"		    	=>"tha",
    "Tibetan"			=>"tib",
    "Tibetan"			=>"bod",
    "Tigrinya"			=>"tir",
    "Tonga"		    	=>"ton",
    "Tswana"			=>"tsn",
    "Tsonga"			=>"tso",
    "Turkmen"			=>"tuk",
    "Turkish"			=>"tur",
    "Twi"		    	=>"twi",
    "Uighur"			=>"uig",
    "Ukrainian"			=>"ukr",
    "Urdu"		    	=>"urd",
    "Uzbek"		    	=>"uzb",
    "Vietnamese"		=>"vie",
    "Volapuk"			=>"vol",
    "Welsh"		    	=>"wel",
    "Welsh"		    	=>"cym",
    "Walloon"			=>"wln",
    "Wolof"		    	=>"wol",
    "Xhosa"		    	=>"xho",
    "Yiddish"			=>"yid",
    "Yoruba"			=>"yor",
    "Zhuang; Chuang"	=>"zha",
    "Zulu"              =>"zul"
 } ;
    foreach my $lang(keys %$langCodeMap){
        $langCodeMap->{uc($lang)} =$langCodeMap->{$lang};
    }

   return $langCodeMap;
}

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