<?php

declare(strict_types=1);

class Sinistro2_Form_VistoriadorDespesa extends Agro_Form
{
    private $isVistoriadorResponsavel;
    private $isVistoriador;
    private $isUsuarioAgroComPermissao;
    private $idEmpresa;
    private $idFuncionario;
    private $siglaEstado;

    public function init(): void
    {
        $user = Zend_Auth::getInstance()->getIdentity();

        $idAcao = (new Sistema_Model_Acoes())->getIdAcao('sinistro2', 'vistoriadordespesa', 'index');

        $this->isVistoriadorResponsavel = $user->id_role
            == Sistema_Model_Usuarios::PERFIL_VISTORIADOR_RESPONSAVEL;
        $this->isVistoriador = $user->id_role
            == Sistema_Model_Usuarios::PERFIL_VISTORIADOR;
        $this->isUsuarioAgroComPermissao =
            $user->id_role == Sistema_Model_Usuarios::PERFIL_ADMIN
            || (new Sistema_Model_UsuarioAcao())->checkPermission($user->id, $idAcao);
        $this->siglaEstado = '';

        if ($this->isVistoriadorResponsavel || $this->isVistoriador) {
            $this->idEmpresa = (new Sistema_Model_Funcionarios())->getIdEmpresaByIdUsuario($user->id);

            $funcionario = (new Sistema_Model_Funcionarios())->getFuncionarioByIdUsuario($user->id);
            $this->idFuncionario = $funcionario['id'];
        }
        
        if ($this->getRequest()['action'] == 'index') {
            $this->loadFilter();
            return;
        }

        $this->loadForm();
    }

    private function loadFilter(): void
    {
        $empresas = null;
        
        if ($this->isUsuarioAgroComPermissao) {
            $empresas = (new Sistema_Model_Empresas())->getCombo();

            $this->addElement('select', 'id_empresa', [
                'MultiOptions' => $empresas,
                'decorators' => $this->elementDecorator,
                'label' => 'Empresa'
            ]);
        }
        
        if ($this->isVistoriadorResponsavel || $this->isUsuarioAgroComPermissao) {
            $vistoriadores = [];
            
            if ($this->idEmpresa) {
                $vistoriadores = (new Sistema_Model_Funcionarios())->getComboVistoriadoresByEmpresas([$this->idEmpresa], true);
                $vistoriadores[0] = '';
                
                ksort($vistoriadores);
            }
            
            $this->addElement('select', 'id_funcionario', [
                'MultiOptions' => $vistoriadores,
                'decorators' => $this->elementDecorator,
                'label' => 'Vistoriador',
            ]);
        }

        $this->addElement('select', 'id_parametro_tipo_despesa', [
            'MultiOptions' => (new Sinistro2_Model_ParametroTipoDespesa())->getCombo(true, 'ds_parametro_tipo_despesa'),
            'decorators' => $this->elementDecorator,
            'label' => 'Tipo de Despesa'
        ]);

        $this->addElement('select', 'id_estado', [
            'MultiOptions' => (new Sistema_Model_Estados())->getCombo(),
            'decorators' => $this->elementDecorator,
            'label' => 'Estado / UF'
        ]);

        $this->addElement('text', 'dt_despesa_inicial', [
			'decorators' => $this->elementDecorator,
			'label' => 'Dt. despesa (Início)',
			'class' => 'data'
		]);

		$this->addElement('text', 'dt_despesa_final', [
			'decorators' => $this->elementDecorator,
			'label' => 'Dt. despesa (Final)',
			'class' => 'data'
		]);

        $this->addElement('text', 'id_proposta', [
			'decorators' => $this->elementDecorator,
			'label' => 'Proposta'
		]);
    }

    private function loadForm(): void
    {
        $params = $this->getRequest();
        $vistoriadorDespesa = $funcionario = null;
        $vistoriadores = [];
           
        if (!empty($params['id'])) {
            $vistoriadorDespesa = (new Sinistro2_Model_VistoriadorDespesa())->find($params['id'])->current();
            $this->siglaEstado = (new Sistema_Model_Estados())->getName($vistoriadorDespesa->id_estado);
        }

        if ($this->isUsuarioAgroComPermissao) {
            $funcionario = !empty($vistoriadorDespesa)
                ? (new Sistema_Model_Funcionarios())->find($vistoriadorDespesa->id_funcionario)->current()
                : null;

            $this->idEmpresa = !empty($funcionario) ? $funcionario->id_empresa : null;

            $this->addElement('select', 'id_empresa', [
                'MultiOptions' => (new Sistema_Model_Empresas)->getComboVistoriadoras(),
                'decorators' => $this->elementDecorator,
                'label' => 'Empresa',
                'value' => empty($funcionario) ? '' : $funcionario->id_empresa,
                'required' => true
            ]);
        }

        if ($this->isVistoriadorResponsavel || $this->isUsuarioAgroComPermissao) {
            if (!empty($this->idEmpresa)) {
                $vistoriadores = (new Sistema_Model_Funcionarios())->getComboVistoriadoresByEmpresas([$this->idEmpresa], true);
            }

            $idFuncionario = '';

            if ($this->isVistoriadorResponsavel) {
                $idFuncionario = $this->idFuncionario;
            } elseif (!empty($vistoriadorDespesa)) {
                $idFuncionario = $vistoriadorDespesa->id_funcionario;
            }

            $this->addElement('select', 'id_funcionario', [
                'MultiOptions' => $vistoriadores,
                'decorators' => $this->elementDecorator,
                'label' => 'Vistoriador',
                'class' => empty($vistoriadores) ? 'select-id-funcionario' : '',
                'value' => $idFuncionario,
                'required' => true
            ]);
        } elseif ($this->isVistoriador) {
            $this->addElement('hidden', 'id_funcionario', ['decorators' => $this->elementDecorator, 'value' => $this->idFuncionario]);
        }
        
        $this->addElement('hidden', 'id', ['decorators' => $this->elementDecorator]);
        
        $this->addElement('hidden', 'is_vistoriador', ['decorators' => $this->elementDecorator, 'value' => ($this->isVistoriador ? 1 : 0)]);
        $this->addElement('hidden', 'is_vistoriador_responsavel', ['decorators' => $this->elementDecorator, 'value' => ($this->isVistoriadorResponsavel ? 1 : 0)]);

        $this->addElement('select', 'id_parametro_tipo_despesa', [
            'decorators' => $this->elementDecorator,
            'label' => 'Parâmetro Tipo de Despesa',
            'required' => true
        ]);

        $this->addElement('hidden', 'id_estado', ['decorators' => $this->elementDecorator]);
        $this->addElement('text', 'ds_sigla', [
            'decorators' => $this->elementDecorator,
            'label' => 'Estado / UF',
            'required' => true,
            'value' => $this->siglaEstado,
            'readonly' => true,
			'size' => 2,
            'class' => 'element_disabled readonly_background_disabled'
        ]);
        
        $this->addElement('text', 'dt_despesa', [
    		'decorators' => $this->elementDecorator,
    		'class'=>'data',
    		'required' => true,
    		'label' => 'Data'
    	]);

        $this->addElement('text', 'vl_despesa', [
			'decorators' => $this->elementDecorator,
			'label' => 'Valor',
			'required' => true,
			'class' => 'valor-despesa'
		]);

        $this->addElement('textarea', 'ds_justificativa', [
    		'decorators' => $this->elementDecorator,
    		'label' => 'Justificativa'
    	]);
        
        $this->addElement('text', 'id_proposta', [
    		'decorators' => $this->elementDecorator,
    		'label' => 'Proposta',
            'required' => true,
            'size' => 10
    	]);
    }

    public function populate(array $params)
    {
        parent::populate($params);
        
        if (!empty($params['dt_despesa'])) {
            $dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $params['dt_despesa']);
            $this->getElement('dt_despesa')->setValue($dateTime->format('d/m/Y'));
        }
        
        if (!empty($params['id_proposta'])) {
            $this->getElement('id_proposta')->setValue((new Seguro_Model_Propostas())->getIdPropostaMae((int) $params['id_proposta']));
        }
    }
}