<?php
/**
 * Copyright 2005-2021 de Solis Soluções Livres Ltda.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software de propriedade da SOLIS, sendo desenvolvido
 * e mantido exclusivamente por esta empresa.
 *
 * A licença de uso está disponível mediante aquisição exclusiva junto à
 * SOLIS. A licença é concedida sem caráter de exclusividade ao licenciado.
 * Os direitos de uso são perpétuos.
 *
 * Embora os códigos fontes sejam fornecidos, o software é de propriedade
 * da SOLIS, não sendo permitido ao adquirente da licença a sua revenda,
 * empréstimo ou cessão (onerosa ou não) à terceiros. Também não é permitido,
 * a qualquer título e tempo, promover no software qualquer tipo de alienação,
 * reprodução, distribuição, divulgação, registro, licenciamento, transferência
 * ou qualquer outro ato que prejudique ou comprometa os direitos de propriedade
 * de software, o nome e a imagem da sua proprietária e do próprio software,
 * além de configurar concorrência à SOLIS.
 *
 * O licenciado, com o acesso ao código fonte do software, terá o direito de
 * promover mudanças no respectivo código. No entanto, nas situações em que ele
 * contar com o suporte oficial prestado pela SOLIS, não poderá promover mudanças
 * no código fonte, sob pena de perda do referido suporte.
 *
 * Para conhecer em detalhes o Termo de Licenciamento do Software Gnuteca
 * leia o arquivo “LICENCA.txt” disponível junto ao código deste software.
 * 
 * 
 * Class GSaraivaImport, extends the default gIso2709.
 *
 *
 *
 *
 *
 **/

$MIOLO = MIOLO::getInstance();
$MIOLO->getClass('gnuteca3', 'backgroundTasks/GBackgroundTask');

class GBibliotecaAImport extends gIso2709
{
    public $tags;
    public $busCatalogue;
    public $busMaterial;
    public $busFile;
    public $savedRecords = 0;
    private $repetitiveTags;

    public function __construct($tags=NULL, $repetitiveTags=NULL)
    {
        $MIOLO = MIOLO::getInstance();
        $this->tags = $tags;
        $this->busCatalogue = $MIOLO->getBusiness('gnuteca3', 'BusCataloge');
        $this->busMaterial = $MIOLO->getBusiness('gnuteca3', 'BusMaterial');
        $this->busFile = $MIOLO->getBusiness('gnuteca3', 'BusFile');
        $this->repetitiveTags = $repetitiveTags;
    }

    public function execute()
    {
        $MIOLO = MIOLO::getInstance();
        $ok = array();
        $formValues = new stdClass();
        $repetitiveControl = array();
        $urlCover = null;

        if ( is_array($this->tags) && ($this->tags[0] instanceof stdClass) )
        {
            $isbn = null;
            $controlNumber = null;

            // Obtém ISBN.
            foreach( $this->tags as $l => $tag )
            {
                if ( $tag->fieldid . '.' . $tag->subfieldid == MARC_ISBN_TAG )
                {
                    $isbn = $tag->content;
                    $controlNumber = $this->obterMaterial($isbn);
                    break;
                }
            }

            $this->busCatalogue->setLoadFields();

            if ( $controlNumber )
            {
                $this->busCatalogue->controlNumber = $controlNumber;
                $this->busCatalogue->function = 'update';
                $formValues->controlNumber = $controlNumber;
            }

            $formValues->leaderString = '00000nam**22000004**4500';
            $formValues->marcLeader = '00000nam**22000004**4500';
            $formValues->firstOperator = GOperator::getOperatorId();
            $formValues->lastOperator = GOperator::getOperatorId();

            foreach( $this->tags as $l => $tag )
            {
                if($tag->fieldid != '001')
                {
                    //trata as strings convertendo em UTF-8
                    $tag->content = str_replace('—', '-', $tag->content);
                    $tag->content = GString::construct($tag->content);

                    //caso for um campo de controle adiciona o valor "a" no subcampo
                    if ( self::isControlField($tag->fieldid) )
                    {
                        $tag->content->replace(' ', '#'); //troca o espaço pela hash "#"
                        $tag->subfieldid = 'a';
                    }

                    if ( $tag->fieldid . '.' . $tag->subfieldid == '020.6' )
                    {
                        $urlCover = $tag->content;
                    }

                    $tag->content = addslashes($tag->content->getString()); //obtém a string e escapa os "'"

                    //trata os indicadores
                    $tag->indicator1 = GString::construct($tag->indicator1)->replace(' ', ''); //tira espaço do indicador 1
                    $tag->indicator1 = $tag->indicator1->getString(); //obtém string
                    $tag->indicator2 = GString::construct($tag->indicator2)->replace(' ', '');//tira espaço do indicador 2
                    $tag->indicator2 = $tag->indicator2->getString(); //obtém string

                    $formValues->{'spreeadsheetField_' . $tag->fieldid . '_' . $tag->subfieldid} = $tag->content;
                    $formValues->{'spreeadsheetField_' . $tag->fieldid . '_I1'} = $tag->indicator1;
                    $formValues->{'spreeadsheetField_' . $tag->fieldid . '_I2'} = $tag->indicator2;

                    // Campo repetitivo.

                    if ( in_array($tag->fieldid . '.' . $tag->subfieldid, $this->repetitiveTags) )
                    {
                        $repetitiveControl[$tag->fieldid][$tag->subfieldid][0] = $tag->content;
                    }
                }
            }

            // Simula repetitivefield.
            if ( count($repetitiveControl) > 0 )
            {
                foreach ( $repetitiveControl as $fieldid => $subfields )
                {
                    foreach ( $subfields as $subfieldid => $values )
                    {
                        foreach ( $values as $line => $value )
                        {
                            if ( is_object($formValues->{"gtcRepeatField_$fieldid"}[$line]) )
                            {
                                $formValues->{'gtcRepeatField_' . $fieldid}[$line]->{'spreeadsheetField_' . $fieldid . '_' . $subfieldid} = $value;
                                $formValues->{'gtcRepeatField_' . $fieldid}[$line]->arrayItem = $line;
                            }
                            else
                            {
                                $formValues->{"gtcRepeatField_$fieldid"}[$line] = new stdClass();
                                $formValues->{'gtcRepeatField_' . $fieldid}[$line]->{'spreeadsheetField_' . $fieldid . '_' . $subfieldid} = $value;
                                $formValues->{'gtcRepeatField_' . $fieldid}[$line]->arrayItem = $line;
                            }
                        }
                    }
                }
            }

            $leaderObject = new stdClass();
            $leaderObject->leaderString = '00000nam**22000004**4500';
            $leaderObject->{'000-5'} = 'n';
            $leaderObject->{'000-6'} = 'a';
            $leaderObject->{'000-7'} = 'm';
            $leaderObject->{'000-8'} = '#';
            $leaderObject->{'000-17'} = '4';
            $leaderObject->{'000-18'} = '#';
            $leaderObject->{'000-19'} = '#';
            $leaderObject->leaderFields = true;

            $this->busCatalogue->getLeaderFields();
            $this->busCatalogue->setFormValueLeaderFields($leaderObject);
            $this->busCatalogue->getLeaderString();

            $this->busCatalogue->getSpreadsheet();
            $this->busCatalogue->setFormValues($formValues);
            $newControlNumber = $this->busCatalogue->save();

            $this->savedRecords++;

            if ( $newControlNumber )
            {
                // Download da capa.
                $coverData = file_get_contents($urlCover);
                $folderPath = $this->busFile->getAbsoluteServerPath(true) . '/cover/';

                file_put_contents($folderPath . $newControlNumber . '.png', $coverData);
            }
        }

        return true;
    }

    public function obterMaterial($isbn)
    {
        $return = null;
        $isbnPesquisa = str_replace('-', '', str_replace('.', '', $isbn));

        $controlNumber = $this->busMaterial->getControlNumberByISBN(array($isbnPesquisa));

        if ( isset($controlNumber[$isbn]) )
        {
            $fonte = $this->busMaterial->getContentTag($controlNumber[$isbn], '040.a');

            if ( $fonte == 'Biblioteca A' )
            {
                $return = $controlNumber[$isbn];
            }
        }

        return $return;
    }
}
?>