<?php
/**
 * Copyright 2005-2017 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.
 * 
 * 
 * LibraryPreference form
 *
 *
 *
 *
 *
 **/
class FrmLibraryPreference extends GForm
{
    public $tables;
    public $domainList;
    public $listLibraryUnit;
    public $listAssociatedLibraryUnit;
    public $listPreference;
    public $listLibraryPreference;
    
    public $busLibraryUnit;
    public $busLibraryUnitConfig;
    public $busDomain;
    
    public $fieldsOfGroup;

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

    	$this->setAllFunctions('Preference', null, array('moduleConfig','parameter'), 'parameter');
        $this->setTransaction('gtcLibraryPreference');

        $this->busLibraryUnit       = $this->MIOLO->getBusiness($this->module, 'BusLibraryUnit');
        $this->busLibraryUnitConfig = $this->MIOLO->getBusiness($this->module, 'BusLibraryUnitConfig');

        //Cria lista especial de bibliotecas
        $this->listLibraryUnit[] = array($this->business->getGeneralId(), '<b>'._M('-- Geral --', $this->module).'</b>');
        $this->listLibraryUnit    = array_merge($this->listLibraryUnit, $this->busLibraryUnit->listLibraryUnit(null, true));

        //Cria lista de bibliotecas associadas
        foreach ($this->listLibraryUnit as $key => $val)
        {
            $this->listAssociatedLibraryUnit[$val[0]] = $val[1];
        }

        //Cria lista de preferencias com array associativo
        $this->business->filterGroupByNotNull = true;
        $this->business->moduleConfigS = 'gnuteca3';
        $listPreference = $this->business->searchPreference( true, 'groupBy,orderBy' );

        if ($listPreference)
        {
            foreach ($listPreference as $key => $val)
            {
                $this->listPreference[$val->parameter] = $val;
            }
        }

        $libraryPreference = $this->busLibraryUnitConfig->searchLibraryUnitConfig(true);

        if ($libraryPreference)
        {
            foreach ($libraryPreference as $key => $val)
            {
                if (!in_array($val->libraryUnitId, array_keys($this->listAssociatedLibraryUnit))) //Operador nao possui permissao para esta biblioteca
                {
                    continue;
                }
                $this->listLibraryPreference[$val->libraryUnitId][$val->parameter] = $val->value;
            }
        }

        parent::__construct();

        $this->setClass("libraryPreference");
    }


    public function mainFields()
    {
        $fields = array();

        if ( is_array( $this->listPreference ) )
        {
            foreach ( $this->listPreference as $line => $preference )
            {
                $type = strtoupper( $preference->type );
                $label = new MLabeL($preference->label . ':');

                if ( $preference->parameter == 'EMAIL_PASSWORD' )
                {
                     $field = new MPasswordField( $preference->parameter, null, null, FIELD_DESCRIPTION_SIZE);
                     $field->addAttribute('autocomplete', 'new-password');
                }
                else
                {
                    if ( $type == 'INT' || $type == 'INTEGER' )
                    {
                        $field = new MIntegerField( $preference->parameter );
                    }
                    else
                    if ( $type == 'TEXT' )
                    {
                        $field = new MMultiLineField( $preference->parameter , null, null, FIELD_MULTILINE_ROWS_SIZE, FIELD_MULTILINE_ROWS_SIZE, FIELD_MULTILINE_COLS_SIZE);
                    }
                    else
                    if ( $type == 'VARCHAR' )
                    {
                        $field = new MMultiLineField( $preference->parameter , null, null, FIELD_MULTILINE_ROWS_SIZE, FIELD_MULTILINE_ROWS_SIZE, FIELD_MULTILINE_COLS_SIZE);
                    }
                    else
                    if ( $type == 'BOOLEAN' )
                    {
                        $field = new MSelection($preference->parameter, null, null, GUtil::listYesNo());
                    }
                    else
                    if ( $type == 'CHAR' || !$type)
                    {
                        $field = new MTextField( $preference->parameter, null, null, FIELD_DESCRIPTION_SIZE);
                    }
                }

                $field->addAttribute('title',$preference->description);
                $field->addAttribute('alt',$preference->description);

                //separa o id's dos campos por atributo
                $this->fieldsOfGroup[$preference->groupBy][] = $line; 
                $fields[ $preference->groupBy ][$preference->parameter] = new GContainer(null, array( $label, $field ) );
            }
        }

        //obtem qual é a tab da url
        $groupBy = MIOLO::_REQUEST('tabId');

        unset($columns, $valids, $tableData);
        $dataFound = false;

        $columns[] = new MGridColumn( _M('Código da biblioteca',$this->module),     'left', true, null, false,"libraryUnitId{$groupBy}" );
        $columns[] = new MGridColumn( _M('Unidade de biblioteca', $this->module),            'left', true, null, true,  "libraryName{$groupBy}" );

        foreach ($this->listLibraryUnit as $k => $v)
        {
            $varName = "libraryUnitId{$groupBy}";
            $tableData[ $v[0] ]->$varName = $v[0];
        }

        //Verifica para cada biblioteca se existe um ou mais valor(es) de parametro, caso nao exista, nao adiciona na subdetail
        foreach ($this->listAssociatedLibraryUnit as $libraryUnitId => $libraryName)
        {
            $existsValue[$groupBy][$libraryUnitId] = $this->checkLibraryParameter($fields[$groupBy], $libraryUnitId);
        }

        foreach ($fields[$groupBy] as $_key => $_val)
        {
            $controls = $_val->getControls();
            $columns[] = new MGridColumn( $controls[1]->name, 'left', true, null, false,  $controls[1]->name );

            //Carrega dados
            foreach ($this->listAssociatedLibraryUnit as $libraryUnitId => $libraryName)
            {
                if (!$existsValue[$groupBy][$libraryUnitId])
                {
                    unset($tableData[$libraryUnitId]);
                    continue;
                }
                else //Encontrou alguma coisa, entao marca para adicionar tab
                {
                    $dataFound = true;
                }

                $varName = $controls[1]->name;
                if ($libraryUnitId == $this->business->getGeneralId())
                {
                    $tableData[$libraryUnitId]->$varName = $this->listPreference[$varName]->configValue;
                }
                else
                {
                    $tableData[$libraryUnitId]->$varName = $this->listLibraryPreference[$libraryUnitId][$varName];
                }
            }
           
        }
        
        $label = new MLabel(_M('Unidade de biblioteca', $this->module) . ':');
        $libraryUnitId = new GSelection("libraryUnitId{$groupBy}", null, null, $this->listLibraryUnit, null, null, null, true);
        $libraryUnitId = new GContainer(null, array( $label, $libraryUnitId ));
        $fields[$groupBy] = array_merge(array($libraryUnitId), $fields[$groupBy]);
        $valids[] = new GnutecaUniqueValidator("libraryUnitId{$groupBy}", _M('Unidade de biblioteca', $this->module), 'required');

        if ($dataFound)
        {
            $tabName = MIOLO::_REQUEST('tabName') ? MIOLO::_REQUEST('tabName') : _M('Preferences', $this->module);
            $this->tables[$groupBy] = new GRepetitiveField("subdetail{$groupBy}", $tabName);
            $this->tables[$groupBy]->setFields( array(new MVContainer('vctTag', $fields[$groupBy])) ); //pega os fields dinamicos deste grupo
            $this->tables[$groupBy]->setColumns($columns);
            $this->tables[$groupBy]->setValidators($valids);

            if ($this->primeiroAcessoAoForm())
            {
                $this->tables[$groupBy]->setData($this->parseSubDetail($tableData));
            }
        }
        
        $this->setFields( array( $this->tables[$groupBy] ), true );

        $this->_toolBar->disableButton( array( MToolBar::BUTTON_NEW, MToolBar::BUTTON_DELETE,MToolBar::BUTTON_SEARCH ));
    }

    public function tbBtnSave_click($sender=NULL)
    {
        //FIXME precisa chamar o parent
        $this->mainFields();
        $groupBy = MIOLO::_REQUEST('tabId');

        $tableData = GRepetitiveField::getData('subdetail'.$groupBy);
        
        foreach ($tableData as $_key => $_val)
        {
            $varLibraryUnitId   = "libraryUnitId{$groupBy}";
            $varLibraryName     = "libraryName{$groupBy}";
            $libraryUnitId      = $_val->$varLibraryUnitId;

            foreach ($_val as $__key => $__val)
            {
                if (in_array($__key, $this->fieldsOfGroup[$groupBy]))
                {
                    $dados[$libraryUnitId][$__key] = ($_val->removeData) ? null : $__val; //Define null caso foi marcado como removido na subdetail
                }
            }
        }

        $ok = $this->business->updateAll($dados);
        
        if ( $ok )
        {
            $this->setModified(false);
            $this->information( MSG_RECORD_UPDATED );
        }
        else
        {
            $this->error(MSG_RECORD_ERROR, null, null, null, true);
        }
    }
    
    public function addToTable($args, $forceMode = FALSE)
    {
    	$item = $args->GRepetitiveField;
        $args = $this->parseSubDetail($args);
    	($forceMode) ? parent::forceAddToTable($args) : parent::addToTable($args);
    }
   
    public function forceAddToTable($args)
    {
        $this->addToTable($args, TRUE);
    }
    
    /**
     * Método invocado ao apagar registro da repetitive field.
     * 
     * @parm object $args Argumentos da chamada Ajax.
     */
    public function removeFromTable( $args )
    {
       // Verifica se a unidade que está sendo apagada é a "Geral", caso for, emite um erro.
        $dados = GRepetitiveField::getDataItem($args->arrayItemTemp, $args->GRepetitiveField);
        $chave = "libraryUnitId" .  $args->tabId;
        
        if ( $dados->{$chave} == $this->business->getGeneralId() )
        {
            $this->error(_M('A unidade Geral não pode ser removida!'));
        }
        else
        {
            autoRemoveAction( $args );
        }
    }
   
    public function parseSubDetail($data)
    {
    	if (is_array($data))
    	{
    		$arr = array();
    		foreach ($data as $val)
    		{
    			$arr[] = $this->parseSubDetail($val);
    		}
    		return $arr;
    	}
    	else if (is_object($data))
    	{
            $groupBy = MIOLO::_REQUEST('tabId');
            
            $varName = "libraryUnitId{$groupBy}";
            $libraryUnitId = $data->$varName;
            
            if ($libraryUnitId)
            {
                $varName = "libraryName{$groupBy}";
                $data->$varName = $this->listAssociatedLibraryUnit[$libraryUnitId];
            }
            
            return $data;
    	}
    }

    /**
     * Verifica se existe algum parametro para esta biblioteca (e para este grupo), caso nao, nao adiciona ela ao subdetail
     *
     * @param $fields (array)
     * @param $libraryUnitId (int)
     *
     * @return $exists (boolean)
     */
    public function checkLibraryParameter($fields, $libraryUnitId)
    {
        if ($libraryUnitId == $this->business->getGeneralId())
        {
            return true;
        }
        else
        {
            $keys = array_keys($this->listLibraryPreference[$libraryUnitId]);
            $groupKeys = array_keys($fields);
            
            foreach ($groupKeys as $key)
            {
                if (in_array($key, $keys))
                {
                    return true;
                }
            }
        }
        return false;
    }
}
?>
