<?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.
 * 
 * 
 *
 *
 *
 *
 *
 *
 **/

$MIOLO->getClass('gnuteca3', 'controls/GFileUploader');
$MIOLO->getClass('gnuteca3', 'gIso2709Import');
$MIOLO->getClass('gnuteca3', 'gIso2709');
$MIOLO->getClass('gnuteca3', 'GSaraivaImport');
$MIOLO->getClass('gnuteca3', 'GMinhaBibliotecaImport');
$MIOLO->getClass('gnuteca3', 'GBibliotecaAImport');

class FrmBibliotecaDigital extends GForm
{
    public $busMaterial;
    public $busPreCatalogue;
    public $busSpreadsheet;
    public $busTag;
    private $busChangeMaterial;

    public function __construct($data)
    {
        $this->MIOLO    = MIOLO::getInstance();
        $this->module   = MIOLO::getCurrentModule();

        $this->busMaterial = $this->MIOLO->getBusiness($this->module, 'BusMaterial');
        $this->busPreCatalogue = $this->MIOLO->getBusiness($this->module, 'BusPreCatalogue');
        $this->busSpreadsheet = $this->MIOLO->getBusiness($this->module, 'BusSpreadsheet');
        $this->busTag = $this->MIOLO->getBusiness($this->module, 'BusTag');
        $this->busChangeMaterial = $this->MIOLO->getBusiness($this->module, 'BusChangeMaterial');

        if ( GForm::primeiroAcessoAoForm() )
        {
            GFileUploader::clearData('isoFile');
        }

        $this->setTransaction('gtcISO2709Import');

        parent::__construct(_M("Importar", $this->module));
    }

    public function mainFields()
    {
        $fields = array();
        $tags = $this->busSpreadsheet->getTagsOfSpreadSheet('BK', 4);

        if ( !in_array('040.a', $tags['BK.4']) )
        {
            $fields[] = new MTextLabel('',_M('É necessário habilitar o campo 040.a na planilha de categoria BK e nível 4 (padrão).'), '');
        }
        else
        {
            $fields[] = $bibliotecaDigital = new GSelection('bibliotecaDigital', null, _M('Biblioteca digital',$this->module), array('saraiva' => 'Saraiva', 'minha_biblioteca' => 'Minha Biblioteca', 'biblioteca_a' => 'Biblioteca A'),null, null, null,true);
            $bibliotecaDigital->addAttribute('onChange', "if ( this.value == 'minha_biblioteca' ) { document.getElementById('divAcao').style.display = 'block'; } else { document.getElementById('divAcao').style.display = 'none'; } ");
            
            $fields[] = $acao = new GContainer( 'divAcao', array(new GSelection('acao', null, _M('Ação:',$this->module), array('importar' => 'Incluir obras', 'remover' => 'Remover do acervo'),null, null, null,true)));
            $acao->addStyle('display', 'none');

            $fields[] = new MSeparator('<br>');
            $fields[] = new GFileUploader( _M('Envie seu arquivo', $this->module), false, $opts = array('remove'), 'isoFile' );
            GFileUploader::setLimit(10, 'isoFile');

            $fields[] = new MSeparator('<br>');
            $fields[] = new MDiv('divGrid');

            //toolbar
            $this->getToolBar();
            $fields[] =  $this->_toolBar;
            $this->_toolBar->enableButtons('tbBtnSave', 'tbBtnNew');
            $this->_toolBar->disableButton( array('tbBtnSearch'));
        }

        $this->setFields($fields);
    }

    public function tbBtnSave_click($sender=NULL, $confirm = DB_FALSE)
    {
        ini_set('memory_limit', '-1'); // define sem nenhuma limitação de memória
        $data = $this->getData();
        $data->files = GFileUploader::getData('isoFile');
        $this->MIOLO->getSession()->setValue('data', $data);

        $action = MIOLO::getCurrentAction();

        if ( $data->bibliotecaDigital == 'minha_biblioteca' && $data->acao == 'remover' )
        {
            //interpreta os arquivos a fim de verificar a quantidades de registros
            $quantidadeIsbns = 0;

            if ( is_array($data->files) )
            {
                foreach( $data->files as $file )
                {
                    $content = file_get_contents($file->tmp_name);
                    $isbns = explode("\n", $content);
                    $quantidadeIsbns += count($isbns) - 1;
                }
            }

            if ( $quantidadeIsbns > 0 )
            {
                $this->MIOLO->getSession()->setValue('data', $data);
                return $this->question(_M('Tem certeza que deseja remover @1 registros?', $this->module, $quantidadeIsbns), GUtil::getAjax('saveConfirmationRemove'));
            }
            else
            {
                $goto = $this->MIOLO->getActionURL($this->module, $action, null, array('function' => 'insert'));
                return $this->information(_M('Não há registros para remover.', $this->module), $goto);
            }
        }
        else
        {
            if ( $data->bibliotecaDigital == 'saraiva' || $data->bibliotecaDigital == 'minha_biblioteca' || $data->bibliotecaDigital == 'biblioteca_a' )
            {
                $spreasheetTags = $this->busSpreadsheet->getTagsOfSpreadSheet('BK', 4);
                $missingTags = array();

                $readRecords = 0;

                if ( $data->bibliotecaDigital == 'biblioteca_a' )
                {
                    // TODO aqui que vai mudar o delimitador conforme é usado na biblioteca A
                    $data->recordDelimiter = chr(29);
                    $data->fieldDelimiter = chr(30);
                    $data->subFieldDelimiter = chr(31);
                }
                else
                {
                    $data->recordDelimiter = chr(29);
                    $data->fieldDelimiter = chr(30);
                    $data->subFieldDelimiter = chr(31);
                }

                $readRecords = 0 ;
                
                //interpreta os arquivos a fim de verificar a quantidades de registros
                if ( is_array($data->files) )
                {
                    foreach( $data->files as $file )
                    {
                        $content = file_get_contents($file->tmp_name);
                        $importObject = new gIso2709Import($content , $data->recordDelimiter, $data->fieldDelimiter, $data->subFieldDelimiter);
                        $readRecords += $importObject->size();

                        // Verica se todas as tags estão na planila BK.4
                        $records = $importObject->getRecords();

                        foreach ( $records as $record )
                        {
                            $tags = $record->getTags();

                            foreach ( $tags as $tag )
                            {
                                if ( $tag->subfieldid && !in_array($tag->fieldid . '.' . $tag->subfieldid, $spreasheetTags['BK.4']) )
                                {
                                    $missingTags[$tag->fieldid . '.' . $tag->subfieldid] = $tag->fieldid . '.' . $tag->subfieldid;
                                }
                            }
                        }
                    }
                }
                else 
                {
                    return $this->information(_M('Não há registros para importar.', $this->module));
                }
                
                //caso existiam registros nos arquivos pede confirmação
                if ( $readRecords > 0 )
                {
                    $this->MIOLO->getSession()->setValue('data', $data);
                
                    if ( count($missingTags) > 0 )
                    {
                        $missingTags = implode(', ', $missingTags);
                        return $this->question(_M("As seguintes etiquetas não foram encontradas na planilha BK.4 (livro): @1.<br> Tem certeza que deseja importar @2 registros?", $this->module, $missingTags, $readRecords), GUtil::getAjax('saveConfirmation'));
                    }
                    else
                    {
                        return $this->question(_M('Tem certeza que deseja importar @1 registros?', $this->module, $readRecords), GUtil::getAjax('saveConfirmation'));
                    }
                    
                } 
                else 
                {
                    return $this->information(_M('Não há registros para importar.', $this->module));
                }
            }
            else
            {
                $goto = $this->MIOLO->getActionURL($this->module, $action, null, array('function' => 'insert'));
                $this->error(_M('Ocorreu um erro na importação', $this->module), $goto);
            }
        }
    }

    public function saveConfirmationRemove()
    {
        GFileUploader::clearData('isoFile'); //limpa a repetitive de arquivos
        GFileUploader::generateTable('isoFile');

        $this->busMaterial->beginTransaction();
        try
        {
            $action = MIOLO::getCurrentAction();
            $data = $this->MIOLO->getSession()->getValue('data'); //pega os files da sessão

            if ( $data->bibliotecaDigital == 'minha_biblioteca' && $data->acao == 'remover' )
            {
                $deletados = 0;
                
                $gMinhaBibliotecaImport = new GMinhaBibliotecaImport(null);

                if ( is_array($data->files) )
                {
                    foreach( $data->files as $file )
                    {
                        $content = file_get_contents($file->tmp_name);

                        $isbns = explode("\n", $content);

                        foreach ( $isbns as $isbn )
                        {
                            $isbn = trim($isbn);

                            if ( strlen($isbn) > 0 )
                            {
                                $controlNumber = $gMinhaBibliotecaImport->obterMaterial($isbn, 'Minha Biblioteca');

                                if ( $controlNumber )
                                {
                                    $this->busChangeMaterial->deleteMaterial($controlNumber); 
                                    $deletados++;
                                }
                            }
                        }
                    }
                }

                $urlConfirm = $this->MIOLO->getActionURL('gnuteca3', $action, null, array('function' => 'insert'));
                $this->information( _M('Foram removidos @1 materiais do acervo.', $this->module, $deletados), $urlConfirm);

                $this->busMaterial->commitTransaction();
            }
        }
        catch ( Exception $e )
        {
            $goto = $this->MIOLO->getActionURL($this->module, $action, null, array('function' => 'insert'));
            $this->error(_M('Ocorreu um erro na importação', $this->module), $goto);
        }
    }

    /**
     * Função chamada após a confirmação de importação de registros
     */
    public function saveConfirmation()
    {
        $action = MIOLO::getCurrentAction();
        $data = $this->MIOLO->getSession()->getValue('data'); //pega os files da sessão

        GFileUploader::clearData('isoFile'); //limpa a repetitive de arquivos
        GFileUploader::generateTable('isoFile');
        $this->busMaterial->beginTransaction();
        $repetitiveTags = $this->busTag->listAllRepetitiveTag();

        $import = array();
        $controlNumbers = null;

        if ( $data->bibliotecaDigital == 'saraiva' )
        {
            $tagFonteCatalogacao = new stdClass();
            $tagFonteCatalogacao->fieldid = '040'; 
            $tagFonteCatalogacao->subfieldid = 'a';
            $tagFonteCatalogacao->line = 0;
            $tagFonteCatalogacao->indicator1 = null;
            $tagFonteCatalogacao->indicator2 = null;
            $tagFonteCatalogacao->content = 'Saraiva';

            $readRecords = $savedRecors = 0;

            if ( !is_array($data->files))
            {
                throw new Exception(_M('Impossível encontrar arquivo!','gnuteca3'));
            }

            foreach($data->files as $file )
            {
                $content = file_get_contents($file->tmp_name);
                $importObject = new gIso2709($content, $data->recordDelimiter, $data->fieldDelimiter, $data->subFieldDelimiter);
                $records = $importObject->getRecords();

                foreach ( $records as $record )
                {
                    $tags = $record->getTags();

                    $tags[] = $tagFonteCatalogacao;

                    $gSaraivaImport = new GSaraivaImport($tags, $repetitiveTags);
                    $import[] = $gSaraivaImport->execute();
                    $savedRecors += $gSaraivaImport->savedRecords;
                }
            }

            $this->busMaterial->commitTransaction();

            // Indexação da pesquisa.
            $controlNumbers = $this->busMaterial->getAllControlNumberByContent('040.a', array('Saraiva'));
        }
        else if ( $data->bibliotecaDigital == 'minha_biblioteca' )
        {
            $readRecords = $savedRecors = 0;

            if ( !is_array($data->files))
            {
                throw new Exception(_M('Impossível encontrar arquivo!','gnuteca3'));
            }

            foreach($data->files as $file )
            {
                $content = file_get_contents($file->tmp_name);
                $importObject = new gIso2709($content, $data->recordDelimiter, $data->fieldDelimiter, $data->subFieldDelimiter);
                $records = $importObject->getRecords();

                foreach ( $records as $record )
                {
                    $tags = $record->getTags();

                    $gMinhaBibliotecaImport = new GMinhaBibliotecaImport($tags, $repetitiveTags);
                    $import[] = $gMinhaBibliotecaImport->execute();
                    $savedRecors += $gMinhaBibliotecaImport->savedRecords;
                }
            }

            $this->busMaterial->commitTransaction();

            // Indexação da pesquisa.
            $controlNumbers = $this->busMaterial->getAllControlNumberByContent('040.a', array('Minha Biblioteca'));
        }
        else if ( $data->bibliotecaDigital == 'biblioteca_a' )
        {
            // TODO escrever código aqui

            $tagFonteCatalogacao = new stdClass();
            $tagFonteCatalogacao->fieldid = '040'; 
            $tagFonteCatalogacao->subfieldid = 'a';
            $tagFonteCatalogacao->line = 0;
            $tagFonteCatalogacao->indicator1 = null;
            $tagFonteCatalogacao->indicator2 = null;
            $tagFonteCatalogacao->content = 'Biblioteca A';

            $readRecords = $savedRecors = 0;

            if ( !is_array($data->files))
            {
                throw new Exception(_M('Impossível encontrar arquivo!','gnuteca3'));
            }

            foreach($data->files as $file )
            {
                $content = file_get_contents($file->tmp_name);
                $importObject = new gIso2709($content, $data->recordDelimiter, $data->fieldDelimiter, $data->subFieldDelimiter);
                $records = $importObject->getRecords();

                foreach ( $records as $record )
                {
                    $tags = $record->getTags();

                    $tags[] = $tagFonteCatalogacao;

                    $gBibliotecaAImport = new GBibliotecaAImport($tags, $repetitiveTags);
                    $import[] = $gBibliotecaAImport->execute();
                    $savedRecors += $gBibliotecaAImport->savedRecords;
                }
            }

            $this->busMaterial->commitTransaction();

            // Indexação da pesquisa.
            $controlNumbers = $this->busMaterial->getAllControlNumberByContent('040.a', array('Biblioteca A'));
        }

        if ( is_array($controlNumbers) )
        {
            foreach ( $controlNumbers as $cn )
            {
                $arguments = new stdClass();
                $arguments->controlNumber = $cn;
                $arguments->controlNumberFather = NULL;
                GBackgroundTask::executeBackgroundTask('updateSearchTable', $arguments);
            }
        }
        
        if ( !in_array(false, $import)  )
        {
            $urlConfirm = $this->MIOLO->getActionURL('gnuteca3', $action, null, array('function' => 'insert'));
            $this->information( _M('Foram importados @1 materiais.', $this->module, $savedRecors), $urlConfirm);
        }
        else
        {
            $goto = $this->MIOLO->getActionURL($this->module, $action, null, array('function' => 'insert'));
            $this->error(_M('Ocorreu um erro na importação', $this->module), $goto);
        }
    }

}

?>
