<?php

class Sistema_Form_VistoriadoresAuxiliares extends Agro_Form
{
    private $_elementosDesabilitarResponsavelEmpresa = [
        'ds_crea', 'cpf_cnpj', 'dt_nascimento', 'ds_nome_estado'
        , 'ds_nome_municipio', 'ds_endereco_rua', 'ds_endereco_nro', 'ds_endereco_bairro', 'ds_endereco_cep'
        , 'ds_endereco_complemento', 'id_tipo_carteira_profissional'
    ];

    private array $_values;

    public function getResponsavelEmpresa()
    {
        return $this->getUser()->fl_responsavel_empresa;
    }

    public function init()
    {
        $this->addElement('hidden', 'id', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('hidden', 'id_usuario', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('hidden', 'nome_empresa', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('hidden', 'nome_departamento', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('hidden', 'ds_tipo_carteira_profissional', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('hidden', 'ds_tipo_usuario', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('hidden', 'ds_perfil', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('hidden', 'dadosSerializados', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('text', 'ds_nome_funcionario', array(
            'decorators' => $this->elementDecorator,
            'maxlength' => 100,
            'label' => 'Nome Completo',
            'required' => true,
            'class' => 'upper',
            'size' => 70
        ));

        $this->addElement('text', 'ds_crea', array(
            'decorators' => $this->elementDecorator,
            'maxlength' => 11,
            'label' => 'CREA/CFTA',
            'size' => 14,
            'class' => 'upper'
        ));

        $this->addElement('text', 'ds_nome_guerra', array(
            'decorators' => $this->elementDecorator,
            'required' => false,
            'maxlength' => 100,
            'label' => 'Nome Social',
            'size' => 30
        ));

        $this->addElement('text', 'cpf_cnpj', array(
            'decorators' => $this->elementDecorator,
            'label' => 'CPF',
            'required' => !$this->getResponsavelEmpresa(),
            'maxlength' => 15,
            'size' => 15
        ));

        $this->addElement('text', 'dt_nascimento', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Data de Nascimento',
            'required' => !$this->getResponsavelEmpresa(),
            'maxlength' => 10,
            'class' => 'data',
            'size' => 11
        ));

        $Empresa = new Sistema_Model_Empresas();
        $propriedadesEmpresa = [
            'MultiOptions' => $Empresa->getCombo(array('VISTORIADORA')),
            'decorators' => $this->elementDecorator,
            'label' => 'Empresa',
            'required' => true
        ];

        if (!$this->getUsuarioAgroLogado()) {
            $propriedadesEmpresa['MultiOptions'] = $Empresa->getEmpresaByIdCombo($this->getUser()->id_empresa);
        }

        $this->addElement('select', 'id_empresa', $propriedadesEmpresa);

        $propriedadesDepartamento = [
            'decorators' => $this->elementDecorator,
            'RegisterInArrayValidator' => false,
            'label' => 'Departamento',
            'required' => true
        ];

        if (!$this->getUsuarioAgroLogado()) {
            $propriedadesDepartamento['MultiOptions'] = (new Sistema_Model_Departamentos())->getComboDeptEmpresa($this->getUser()->id_empresa);
        }

        $this->addElement('select', 'id_departamento', $propriedadesDepartamento);

        $this->addElement('hidden', 'id_estado', array('decorators' => $this->elementDecorator));
        $this->addElement('text', 'ds_nome_estado', array(
            'decorators' => $this->elementDecorator,
            'label' => 'UF',
            'disabled' => true,
            'maxlength' => 2,
            'size' => 2
        ));

        $this->addElement('hidden', 'id_municipio', array('decorators' => $this->elementDecorator));
        $this->addElement('text', 'ds_nome_municipio', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Município',
            'disabled' => true,
            'maxlength' => 30,
            'size' => 78,
        ));

        $this->addElement('text', 'ds_endereco_rua', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Endereço',
            'class' => 'upper',
            'maxlength' => 100,
            'size' => 40
        ));

        $this->addElement('text', 'ds_endereco_nro', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Número',
            'maxlength' => 100,
            'size' => 10
        ));

        $this->addElement('text', 'ds_endereco_bairro', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Bairro',
            'maxlength' => 100,
            'size' => 40,
            'class' => 'upper',
        ));

        $this->addElement('text', 'ds_endereco_cep', array(
            'decorators' => $this->elementDecorator,
            'label' => 'CEP',
            'class' => 'cep',
            'maxlength' => 9,
            'size' => 9
        ));

        $this->addElement('text', 'ds_endereco_complemento', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Complemento',
            'maxlength' => 100,
            'size' => 10
        ));

        $this->addElement('text', 'ds_email', array(
            'validators' => array(
                array(
                    'EmailAddress',
                    true,
                    array(
                        'messages' => array(
                            Zend_Validate_EmailAddress::INVALID_FORMAT =>
                                "Formato inválido.",
                            Zend_Validate_EmailAddress::INVALID_HOSTNAME =>
                                "Formato inválido."
                        )
                    )
                )
            ),
            'decorators' => $this->elementDecorator,
            'label' => 'E-mail Pessoal',
            'required' => true,
            'maxlength' => 100,
            'class' => 'email lower',
            'size' => 100
        ));

        $this->addElement('select', 'id_role', array(
            'MultiOptions' => (new Sistema_Model_Roles())->getCombo(),
            'decorators' => $this->elementDecorator,
            'label' => 'Perfil',
            'required' => true
        ));

        $this->addElement('select', 'tp_usuario', array(
            'MultiOptions' => array('V' => 'Vistoriador', 'M' => 'Aux. Administrativo', 'H' => 'Aux. de Campo'),
            'decorators' => $this->elementDecorator,
            'label' => 'Tipo',
            'required' => true
        ));

        $this->addElement('text', 'ds_nome_usuario', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Login',
            'required' => true,
            'maxlength' => 40,
            'class' => 'lower',
            'size' => 40
        ));

        $parametrosSenha = [
            'decorators' => $this->elementDecorator,
            'label' => 'Senha',
            'required' => false,
            'disabled' => true,
            'size' => 20
        ];

        $this->addElement('text', 'ds_senha', $parametrosSenha);

        $parametrosSenha['label'] = 'Confirmar Senha';

        $this->addElement('text', 'ds_senha2', $parametrosSenha);

        $this->addElement('textarea', 'ds_observacao', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Observações',
            'cols' => 50,
            'rows' => 5
        ));

        $parametrosResponsavelEmpresa = [
            'decorators' => $this->elementDecorator,
            'label' => 'Responsável pela empresa'
        ];

        if (!$this->getUsuarioAgroLogado()) {
            $parametrosResponsavelEmpresa['disabled'] = true;
        }

        $this->addElement('checkbox', 'fl_responsavel_empresa', $parametrosResponsavelEmpresa);

        $this->addElement('hidden', 'fl_responsavel_empresa_hidden', array(
            'decorators' => $this->elementDecorator
        ));

        $this->addElement('checkbox', 'fl_liberado_tablet_previa', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Ativar Prévia Digital?'
        ));

        $this->addElement('checkbox', 'fl_usuario_tagh', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Incluir usuário na Tagh?'
        ));

        $this->addElement('text', 'deviceid', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Dispositivo Vinculado',
            'readonly' => 'readonly',
            'maxlength' => 60,
            'size' => 60
        ));

        $this->addElement('select', 'id_tipo_carteira_profissional', [
            'MultiOptions' => [1 => 'CREA', 2 => 'CFTA'],
            'decorators' => $this->elementDecorator,
            'label' => 'Tipo de Carteira Profissional',
        ]);

        $this->addElement('select', 'id_status', array(
            'MultiOptions' => (new Sistema_Model_Status())->getCombo('CADASTRO_VISTORIADORES'),
            'decorators' => $this->elementDecorator,
            'label' => 'Status do Cadastro'
        ));

        $this->addElement('checkbox', 'fl_liberado_tablet_sinistro', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Ativar Sinistro Digital?'
        ));

        $this->addElement('text', 'deviceid_sinistro', array(
            'decorators' => $this->elementDecorator,
            'label' => 'Dispositivo Vinculado',
            'readonly' => 'readonly',
            'maxlength' => 60,
            'size' => 60
        ));

        $this->addElement('text', 'cpf_search', array(
			'decorators' => $this->elementDecorator,
			'label' => 'CPF',
			'class' => 'cpf_cnpj',
			'required' => false,
			'maxlength' => 14,
			'size' => 14,
		));

        $this->validarBloqueioCampos();
    }

    public function populate(array $values)
    {
        $this->_values = $values;

        if (!empty($values)) {
            if ($values['dt_nascimento']) {
                $values['dt_nascimento'] = Agro_Util::formatDate($values['dt_nascimento'], Zend_Date::DATES);
            }

            // Preenche o campo de departamento
            if ($values['id_empresa']) {
                $Departamentos = new Sistema_Model_Departamentos();
                $Departamento = $Departamentos->find($values['id_empresa'])->current();
                $this->id_departamento->addMultiOptions($Departamentos->fetchPairs($values['id_empresa']));
                //print_r($Departamentos->fetchPairs($values['id_empresa']));
            }

            // Preenche os municipios e o estado
            if ($values['id_municipio']) {
                $Municipios = new Sistema_Model_Municipios();
                $Estados = new Sistema_Model_Estados();

                $Municipio = $Municipios->find($values['id_municipio'])->current();
                $Estado = $Estados->find($Municipio->id_estado)->current();

                $values['ds_nome_municipio'] = $Municipio->ds_nome_municipio;
                $values['ds_nome_estado'] = $Estado->ds_sigla;
                $values['id_estado'] = $Municipio->id_estado;
                $values['id_municipio'] = $Municipio->id;
            }

            // Preenche os campos do usuario
            if ($values['id_usuario']) {
                $Usuarios = new Sistema_Model_Usuarios();
                $Usuario = $Usuarios->find($values['id_usuario'])->current();

                $values['ds_nome_usuario'] = $Usuario->ds_nome_usuario;
                $values['tp_usuario'] = $Usuario->tp_usuario;
                $values['ds_senha2'] = $Usuario->ds_senha;
                $values['ds_senha'] = $Usuario->ds_senha;
                $values['id_role'] = $Usuario->id_role;
                $values['fl_liberado_tablet_previa'] = $Usuario->fl_liberado_tablet_previa;
                $values['fl_liberado_tablet_sinistro'] = $Usuario->fl_liberado_tablet_sinistro;
                $values['deviceid'] = $Usuario->deviceid;
                $values['deviceid_sinistro'] = $Usuario->deviceid_sinistro;
            }

            $values['ds_senha'] = '';
            $values['ds_senha2'] = '';
        }

        $this->validarBloqueioCampos(false);
        parent::populate($values);
    }

    private function desabilitarCamposSenha()
    {
        $this->getElement('ds_senha')->setAttrib('disabled', null);
        $this->getElement('ds_senha2')->setAttrib('disabled', null);
    }

    private function validarBloqueioCampos(bool $inicializacao = true)
    {
        $request = $this->getRequest();
        $hasStatusConferido = $ignoraStatusConferido = false;
        $usuarioAgroLogado = $this->getUsuarioAgroLogado();
        $vistoriador = null;

        if (!empty($request['id'])) {
            $hasStatusConferido = (new Sistema_Model_VistoriadoresStatus())->hasStatusConferido($request['id']);
            $vistoriador = (new Sistema_Model_Funcionarios())->find($request['id'])->current();

            if (!empty($vistoriador)) {
                $usuarioVistoriador = (new Sistema_Model_Usuarios())->find($vistoriador['id_usuario'])->current();
                if (!empty($usuarioVistoriador)) {
                    $ignoraStatusConferido = Sistema_Model_Usuarios::isTipoUsuarioIgnoraStatusConferido($usuarioVistoriador->tp_usuario);
                }
            }
        }
        
        if (!$usuarioAgroLogado && !$this->getResponsavelEmpresa()) {
            $this->getElement('ds_nome_usuario')->setAttrib('readonly', true);
            $this->getElement('ds_nome_usuario')->setAttrib('class', 'lower readonly_background_disabled');

            $this->getElement('tp_usuario')->setRequired(false);
            $this->getElement('id_role')->setRequired(false);
        }
        
        if ($request['action'] === 'form') {
            $usuario = $this->getUser();
            $isVistoriadorLogado = $vistoriador['id_usuario'] === $usuario->id;
            $isVistoriadorResponsavel = $usuario->id_role === Sistema_Model_Usuarios::PERFIL_VISTORIADOR_RESPONSAVEL;

            if (!$usuarioAgroLogado) {
                if (
                    empty($vistoriador) 
                    || (
                        !empty($vistoriador) 
                        && !$isVistoriadorLogado
                    )
                ) {
                    foreach ($this->_elementosDesabilitarResponsavelEmpresa as $elemento) {
                        $this->getElement($elemento)->setAttrib('readonly', true);
                        $this->getElement($elemento)->setAttrib('class', 'upper readonly_background_disabled');
                    }

                    // Bloqueia campos para vistoriador responsável ao realizar cadastro e recarregar tela
                    if (
                        !$inicializacao
                        && $isVistoriadorResponsavel
                    ) {
                        $this->getElement('ds_nome_funcionario')->setAttrib('readonly', true);
                        $this->getElement('ds_nome_funcionario')->setAttrib('class', 'upper readonly_background_disabled');
                    }
                    
                    $this->getElement('ds_nome_funcionario')->setRequired(false);
                    $this->getElement('id_tipo_carteira_profissional')->setAttrib('disabled', true);
                } else {
                    $this->desabilitarCamposSenha();
                }
                
                $isCadastroInicial = $isVistoriadorLogado && empty($vistoriador['id_usuario_alteracao']);
                
                if (
                    $vistoriador !== null
                    && !$ignoraStatusConferido
                    && ($hasStatusConferido || !$isCadastroInicial)
                ) {
                    $this->bloqueiaCamposNomeCpfDataNascimento();
                }
            } elseif (!$this->getAmbienteProducao()) {
                $this->desabilitarCamposSenha();
            }
            
            if ($usuarioAgroLogado && !$hasStatusConferido && $vistoriador !== null) {
                $this->bloqueiaCamposNomeCpfDataNascimento();
            }

            if ($hasStatusConferido) {
                $this->bloquearCampoEmpresa();
            }
        }
    }

    private function bloquearCampoEmpresa(): void
    {
        $this->getElement('id_empresa')->setAttrib('readonly', true);
        $this->getElement('id_empresa')->setAttrib('class', 'element_disabled readonly_background_disabled');
    }

    private function bloqueiaCamposNomeCpfDataNascimento(): void
    {
        $this->getElement('ds_nome_funcionario')->setAttrib('readonly', true);
        $this->getElement('ds_nome_funcionario')->setAttrib('class', 'readonly_background_disabled');

        $this->getElement('cpf_cnpj')->setAttrib('readonly', true);
        $this->getElement('cpf_cnpj')->setAttrib('class', 'readonly_background_disabled');

        $this->getElement('dt_nascimento')->setAttrib('readonly', true);
        $this->getElement('dt_nascimento')->setAttrib('class', 'readonly_background_disabled');
    }
}
