<?php
use Dompdf\Exception;

class Sistema_FuncionarioController extends Agro_Controller_Action
{
	protected $_paginator = false;
  protected $_backAfterSave = false;

	public $_columnList = array(
		'ds_nome_funcionario' => 'Nome',
		'ds_nome_fantasia' => 'Empresa',
		'ds_nome_departamento' => 'Departamento',
		'ds_sigla' => 'UF',
		'ds_nome_municipio' => 'Município'
	);

	public function feriasAction() {
		$this->getHelper('layout')->disableLayout();
		$Agendamentos = new Sistema_Model_AgendamentoFerias();
		$ferias = $Agendamentos->fetchRow("id_funcionario = ".$this->getRequest()->getParam('id'));
		$this->view->id = $this->getRequest()->getParam('id');
		$this->view->data_inicio = $ferias->data_inicio;
		$this->view->data_final = $ferias->data_final;
		$this->view->id_agendamento = $ferias->id;
	}

	/* Cria um registro de agendamento na tabela sistema.agendamento_ferias
	 * Chama a função que cria chamada cron para ser executada na data do agendamento
	*/
	public function agendamentoAction()
    {
        $return = array('status' => false, 'message' => null);
        $this->isAjax();

        if (
            Agro_Util::validaDataInicioFim(
                $this->getRequest()->getParam('data_inicio'),
                $this->getRequest()->getParam('data_final')
            )
        ) {

            if (!Agro_Util::filterVariable($this->getRequest()->getParam('id_funcionario'))) {
                $this->getResponse()->setBody(Zend_Json::encode([
                    'message' => 'Id do funcionário inválido.',
                    'status' => false
                ]));

                return false;
            }

            if ((new Sistema_Model_AgendamentoFerias())->save($this->getRequest()->getParams())) {
                $return['message'] = 'Agendamento efetuado com sucesso.';
                $return['status'] = true;

                $criouCron = $this->createCron(
                    (int)$this->getRequest()->getParam('id_funcionario'),
                    $this->getRequest()->getParam('data_inicio'),
                    $this->getRequest()->getParam('data_final')
                );

                if (!$criouCron) {
                    $return['message'] = 'Não foi possível criar o agendamento.';
                    $return['status'] = false;
                }
            }
        } else {
            $return['message'] = 'Data de início não pode ser igual ou maior que a data final';
        }

        $this->getResponse()->setBody(Zend_Json::encode($return));
    }

	public function cancelamentoAction()
    {
        $return = array('status' => false, 'message' => null);
        $this->isAjax();
        if (($this->getRequest()->getParam('id_funcionario')) && ($this->getRequest()->getParam('id'))) {
            if (!Agro_Util::filterVariable($this->getRequest()->getParam('id_funcionario'))) {
                $this->getResponse()->setBody(Zend_Json::encode([
                    'message' => 'Id do funcionário inválido.',
                    'status' => false
                ]));

                return false;
            }

            if ((new Sistema_Model_AgendamentoFerias())->delete($this->getRequest()->getParam('id'))) {
                $this->deleteCron((int)$this->getRequest()->getParam('id_funcionario'));
                $return['message'] = 'Agendamento cancelado com sucesso.';
                $return['status'] = true;
            }
        } else {
            $return['message'] = 'Não existe agendamento para ser cancelado.';
        }

        $this->getResponse()->setBody(Zend_Json::encode($return));
    }

	/* Remove linhas no arquivo cron referente ao funcionário em questão */
	private function deleteCron(int $idFuncionario, bool $unico = null)
    {
        $unico = !is_null($unico) ? ($unico ? 'true' : 'false') : '';
        $comando = "sed -i '/php {$idFuncionario} {$unico} /d' /tmp/mycron";

        $agroCron = new Agro_Cron();
        $agroCron->execute([$comando]);
	}

	/* Cria dois CRON no sistema para desativar e depois ativar funcionar nas datas determinadas */
	private function createCron(int $idFuncionario, $dtInicio, $dtFim)
    {
        if (!Agro_Util::isDate($dtInicio) || !Agro_Util::isDate($dtFim)) {
            return false;
        }

		$inicio = explode('/', $dtInicio);
		list($idia, $imes, $iano) = $inicio;
		$fim = explode('/', $dtFim);
		list($fdia, $fmes, $fano) = $fim;

        $stringBase = "* /usr/bin/php " . APPLICATION_PATH . "/../Curl/bloqueioferias.php {$idFuncionario}";
        $comandos = [
            "sed -i '/php {$idFuncionario} /d' /tmp/mycron",
            "echo \"01 00 {$idia} {$imes} {$stringBase} false > /tmp/output.cronlog\" >> /tmp/mycron",
            "echo \"59 23 {$fdia} {$fmes} {$stringBase} true > /tmp/output.cronlog\" >>	/tmp/mycron",
        ];

        $agroCron = new Agro_Cron();
        $agroCron->execute($comandos);

		return true;
	}

	public function init()
    {
		$this->view->title = 'Sistema » Cadastro » Funcionários';
	}

	public function setBack() {
		$this->view->back = '/sistema/funcionario';
	}

	public function getForm() {
		$Form = new Sistema_Form_Funcionario();
		return $Form;
	}

	public function getModel() {
		return new Sistema_Model_Funcionarios();
	}

	public function viewAction() {
		$Funcionarios = new Sistema_Model_Funcionarios();
		$this->view->funcionario = $Funcionarios->find($this->getRequest()->getParam('id'))->current();

		$Empresas = new Sistema_Model_Empresas();
		$this->view->empresa = $Empresas->find($this->view->funcionario->id_empresa)->current();

		$Departamentos = new Sistema_Model_Departamentos();
		$this->view->departamento = $Departamentos->find($this->view->funcionario->id_departamento)->current();

		$Municipios = new Sistema_Model_Municipios();
		$this->view->municipio = $Municipios->find($this->view->funcionario->id_municipio)->current();

		$Estados = new Sistema_Model_Estados();
		$this->view->estado = $Estados->find($this->view->municipio->id_estado)->current();

		$Telefones = new Sistema_Model_Telefones();
		$this->view->telefones = $Telefones->fetchAll($Telefones->getData("id_usuario = ".$this->view->funcionario->id_usuario));

		parent::viewAction();
	}

	/*
	* Bloqueia/desbloqueia usuário que está em férias
	*/
	public function setferiasAction() {
		$User = Zend_Auth::getInstance()->getIdentity();
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$Usuarios = new Sistema_Model_Usuarios();
		$result = array('status' => false);
		$Model = $this->getModel();

		if ($this->getRequest()->getParam('id')) {
			$Row = $Model->getRow($this->getRequest()->getParam('id'));
			$Usuario = $Usuarios->find($Row->id_usuario)->current();
			$Old = $Row->toArray();

			$Row->fl_ativo = $this->getRequest()->getParam('ativo');
			$Row->save();

			$Usuario->fl_ativo = $this->getRequest()->getParam('ativo');
			$Usuario->save();

			$result['ativo'] = $Usuario->fl_ativo;
			$this->deleteCron((int)$this->getRequest()->getParam('id'), $Usuario->fl_ativo);
			$this->getResponse()->setBody(Zend_Json::encode($result));
		}
	}

	public function activeAction() {
		$User = Zend_Auth::getInstance()->getIdentity();
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$Usuarios = new Sistema_Model_Usuarios();
		$result = array('status' => false);
		$Model = $this->getModel();

		if ($this->getRequest()->getParam('id')) {
			$Row = $Model->getRow($this->getRequest()->getParam('id'));
			$Usuario = $Usuarios->find($Row->id_usuario)->current();
			$Old = $Row->toArray();

			$Row->fl_ativo = ($Row->fl_ativo ? 0 : 1);
			$Row->save();

			$Usuario->fl_ativo = ($Row->fl_ativo ? 1 : 0);
			$Usuario->save();

			$result['ativo'] = $Usuario->fl_ativo;

			$info = $Model->info();

			/**
			 * Sincroniza com TAGH
			 * @Todo não irá funcionar em produção em função do if APPLICATION_ENV
			*/

			if (($info) && (APPLICATION_ENV != 'production')) {
				$tagh = new Agro_Tagh();

				$dados['username_to_disable_or_enable'] = $Usuario->ds_nome_usuario;
				$dados['enable'] = $Usuario->fl_ativo;
				$tagh->disableOrEnableUser($dados);
			}

			$this->getResponse()->setBody(Zend_Json::encode($result));
		}
	}

	public function resetAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$idUsuario = $this->getRequest()->getParam('id');

		if ($idUsuario) {
			$Model = new Sistema_Model_UsuarioAcao();
			$clear = $Model->clear($idUsuario);

			if ($clear) {
                /**
                 * Se o usuário for preposto, verifica se tem restrições configuradas para que estas sejam mantidas
                 */
			    $modelPrepostos = new Sistema_Model_Prepostos();
			    $rowPreposto = $modelPrepostos->findByUser($idUsuario);

			    if (!empty($rowPreposto) && !empty($rowPreposto['ds_excecoes'])) {
			        $excecoes = explode(',', $rowPreposto['ds_excecoes']);
                    $acoesExcecao = ['id_acao' => ['nao_permitido' => []], 'id_usuario' => $idUsuario];

			        foreach ($excecoes as $excecao) {
			            if ($excecao === '2') {
			                continue;
                        }

			            $acoesExcecao['id_acao']['nao_permitido'] = array_merge(
			              $acoesExcecao['id_acao']['nao_permitido'], Sistema_Model_ExcecaoUsuario::$_RESTRICOES_PREPOSTO[trim($excecao)]
                        );
                    }

                    $modelExcecaoUsuario = new Sistema_Model_ExcecaoUsuario();
                    $modelExcecaoUsuario->setBloqueioAcao($acoesExcecao);
                }

				$this->getResponse()->setBody("alert('Exceções removidas com sucesso.')");
			} else {
				$this->getResponse()->setBody("alert('Não foi possível realizar o procedimento.')");
			}
		}
	}

	public function getFilter() {
		$where = array();

        $where[] = [
            'field' => 'us.tp_usuario',
            'operator' => '=',
            'value' => 'F'
        ];

		if ($this->getRequest()->getParam('ds_nome_funcionario')) {
			$where[] = array(
				'field' => 'ds_nome_funcionario',
				'operator' => 'ilike',
				'value' => '%'.$this->getRequest()->getParam('ds_nome_funcionario').'%'
			);
		}

		if ($this->getRequest()->getParam('id_empresa')) {
			$where[] = array(
				'field' => 'f.id_empresa',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_empresa')
			);
		}

		if ($this->getRequest()->getParam('id_departamento')) {
			$where[] = array(
				'field' => 'id_departamento',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_departamento')
			);
		}

		if ($this->getRequest()->getParam('fl_ativo')) {
			$where[] = array(
				'field' => 'f.fl_ativo',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('fl_ativo')
			);
		}

		if ($this->getRequest()->getParam('id_categoria')) {
			$where[] = array(
				'field' => 'e.id_categoria',
				'operator' => '=',
				'value' => $this->getRequest()->getParam('id_categoria')
			);
		}

		return $where;
	}

	public function getfuncionariosAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		if ($this->getRequest()->getParam('id')) {
			$Model = $this->getModel();
            $tiposUsuario = $this->getRequest()->has('tiposUsuario') ? $this->getRequest()->getParam('tiposUsuario') : null;
            $somenteAtivos = $this->getRequest()->has('somenteAtivos') ? $this->getRequest()->getParam('somenteAtivos') : true;
			$funcionarios = $Model->getArrayVistoriadoresByEmpresa($this->getRequest()->getParam('id'), $tiposUsuario, $somenteAtivos);

			$this->getResponse()->setBody(Zend_Json::encode($funcionarios));
		}
	}

	/* retorna um funcionário pelo seu id */
	public function getfuncionariobyidAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		$Model = $this->getModel();
		$dados = $Model->find($this->getRequest()->getParam('id'))->toArray();
		$this->getResponse()->setBody(Zend_Json::encode($dados[0]['ds_nome_funcionario']));
	}

	public function listAction() {
		$this->getHelper('layout')->disableLayout();

        $Module = $this->getRequest()->getModuleName();
        $Controller = $this->getRequest()->getControllerName();

        $Session = new Zend_Session_Namespace('filtro');
        $Session->{$Module}->{$Controller} = $this->getRequest()->getParams();

		$Where = $this->getFilter();
		$Model = $this->getModel();
		$Select = $Model->getData($Where);
		$aux = $Model->getPaginator($Select, $this->getRequest()->getParam('page'), 20);
		$this->view->paginator = $aux;
	}

	public function afterSave($id) {

		/**
		 * Envio do funcionario atualizado/criado para a Tagh
		 * @TODO só funcionará em produção quando tirar o APPLICATION_ENV do IF
		*/

		$ModelEmpresa = new Sistema_Model_Empresas();
		$Empresa = $ModelEmpresa->getRow($this->getRequest()->getParam('id_empresa'));

		if (($this->getRequest()->getParam('tp_usuario') == 'V') && (APPLICATION_ENV != 'production') && (!is_null($Empresa['id_tagh']))) {

			$Model = $this->getModel();
			$Row = $Model->find($id)->current()->toArray();

			$Usuario = new Sistema_Model_Usuarios();
			$RowUsuario = $Usuario->find($Row['id_usuario'])->current()->toArray();

			if ($Row['fl_usuario_tagh']) { 
				$dados['inspectorid'] = ($Row['id_tagh'] ? $Row['id_tagh'] : 0);
				$dados['inspectorname'] = $this->getRequest()->getParam('ds_nome_funcionario');
				$dados['username'] = $RowUsuario['ds_nome_usuario'];
				$dados['userpassword'] = $RowUsuario['ds_senha'];
				$dados['identificador'] = null;
				$dados['identificador2'] = null;
				$dados['maxarea'] = 0;
				$dados['maxinspections'] = 0;
				//$dados['headid'] = 0;
				$dados['districtid'] = $this->getRequest()->getParam('id_estado');
				$dados['addesss'] = $this->getRequest()->getParam('ds_endereco_rua').' '.
									$this->getRequest()->getParam('ds_endereco_nro');
				$dados['townid'] = $this->getRequest()->getParam('id_municipio');
				$dados['zipcode'] = $this->getRequest()->getParam('ds_endereco_cep');
				$dados['email'] = $this->getRequest()->getParam('ds_email');
				$dados['email1'] = null;

				$Fone = new Sistema_Model_Telefones();
				$RowFone = $Fone->fetchAll("id_usuario = ". $RowUsuario['id'])->toArray();

				foreach ($RowFone as $fone) {
					switch ($fone['id_tipo_telefone']) {
						case 2:
							if (is_null($dados['mobile'])) {
								$dados['mobile'] = $fone['ds_numero'];
							}
							break;
						case 3:
							if (is_null($dados['phone'])) {
								$dados['phone'] = $fone['ds_numero'];
							}
							break;
						case 5:
							if (is_null($dados['fax'])) {
								$dados['fax'] = $fone['ds_numero'];
							}
							break;
					}
				}

				//dados não existentes no AgroNet
				$dados['bankaccountbank'] = null;
				$dados['bankaccountbranch'] = null;
				$dados['bankaccountcode'] = null;
				$dados['bankaccountname'] = null;
				$dados['bankaccountnumber'] = null;
				$dados['bankaccounttype'] = null;

				$dados['firmid'] = $Empresa['id_tagh'];

				$tagh = new Agro_Tagh();
				$id_tagh = $tagh->createOrUpdateInspector($dados);

				if ($id_tagh) {
					$this->getModel()->update(array('id_tagh' => $id_tagh), 'id = '.$id);
				}
			}
		}

        $parametros = $this->getRequest()->getParams();

        if (isset($parametros['salvar']) && empty($parametros['id']) && $this->ambienteProducao) {
            $this->view->usuario = $parametros['ds_nome_usuario'];
            $this->view->link = "{$this->protocoloUrlNovaSenha}{$this->urlNovaSenha}{$this->parametrosUrlNovaSenha}";
            $this->view->link .= "{$parametros['ds_url_senha']}";
            $content = $this->view->render('senhausuarionovo.phtml');

            $agromail = new Agro_Mail();
            $agromail->addTo($parametros['ds_email']);
            $agromail->setTipoUsuario($parametros['ds_nome_funcionario']);
            $agromail->setBody($content);
            $agromail->setSubject('Cadastro de Funcionário - AgroNet® 2.0');
            $agromail->send();
        }
	}

	public function excelAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();
		
		ini_set('memory_limit','4096M');
		ini_set('max_execution_time',360);
		
		$where = $this->getFilter();

		$Module = $this->getRequest()->getModuleName();
		$Controller = $this->getRequest()->getControllerName();
		$Model = $this->getModel();

		if ($this->getRequest()->getParam("o")) {
			$Model->_order = trim($this->getRequest()->getParam("o") .' '. $this->getRequest()->getParam("s"));
		}

		$Rs = $Model->fetchAllPaginator($where);
		foreach ($Rs as $key => $value) {
			$value->fl_liberado_tablet_previa = $value->fl_liberado_tablet_previa ? 'Sim' : 'Não';
			$value->fl_ativo = $value->fl_ativo ? 'Sim' : 'Não';
		}
		
		if ($Model->_columnExcel) {
			$Csv = new Agro_Plugin_Rs2Csv();
			$Csv->setTitles($Model->_columnExcel);
			$Csv->setRecordSet($Rs);
			$Csv->setType("application/octet-stream");
			$Csv->setFileName("pesquisa.csv");
			$Csv->setDisposition("attachment");
			$Csv->setSeparator(";");
			$Csv->getCsv();
		} else {
			$Csv = new Agro_Plugin_Rs2Csv();
			$Csv->setTitles($Model->_columnExcel);
			$Csv->setRecordSet(array('Excel não configurado'));
			$Csv->setType("application/octet-stream");
			$Csv->setFileName("notfound.csv");
			$Csv->setDisposition("attachment");
			$Csv->setSeparator(";");
			$Csv->getCsv();
		}
	}

	public function treinadoAction() {
		$this->isAjax();
		$ModelTreinamento = new Sistema_Model_TreinamentoVistorias();
		$ModelTreinamento->getAdapter()->beginTransaction();
		$Model = $this->getModel();

		try {
			foreach ($this->getRequest()->getParams() as $campo => $valor) {
				if ($valor == '') {
					throw new \Exception(strtoupper($campo) . ' não pode ser nulo.');
				}
			}

			$ModelTreinamento->save($this->getRequest()->getParams());
			$Model->treinado($this->getRequest()->getParam('id_funcionario'), true);

			$tipoVistoria = explode(',', $this->getRequest()->getParam('id_tipo_vistoria'));

			if (in_array(Sistema_Model_TipoVistoria::PREVIA, $tipoVistoria)) {
			    $this->liberarPreviaDigital($this->getRequest()->getParam('id_funcionario'), true);
            }

			$ModelTreinamento->getAdapter()->commit();
			$result = array('status' => true, 'message' => 'Treinamento salvo com sucesso.');
		} catch (\Exception $e) {
			$result = array('status' => false, 'message' => 'ATENÇÃO:\n\nErro ao salvar treinamento.');
			$ModelTreinamento->getAdapter()->rollback();
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}
	 
	public function formAction()
    {
        $parametros = $this->getRequest()->getParams();
		
        if (isset($parametros['salvar']) && empty($parametros['id']) && $this->ambienteProducao) {
            $agroSenha = new Agro_Senha();
            $novaSenha = $agroSenha->gerarNovaSenha();

            $this->getRequest()->setParam('ds_senha', $novaSenha);
            $this->getRequest()->setParam('ds_senha2', $novaSenha);
            $this->getRequest()->setParam('ds_url_senha', $agroSenha->gerarHash());

            $urlSenha = $agroSenha->gerarHash();
            $this->getRequest()->setParam('ds_url_senha', $urlSenha);
        }

        if (!empty(trim($this->getRequest()->getParam('ds_senha')))) {
            $this->getRequest()->setParam('validarSenha', true);
        }

        parent::formAction();

        if (!empty($parametros['id'])) {
            $this->view->configuracoes = new stdClass();
            $this->view->configuracoes->idLiberarValidacoesIS = (new Sistema_Model_Acoes())->getIdAcao('seguro', 'proposta', 'liberarvalidacoesis');
            $this->view->configuracoes->liberaraValidacoesISUsuario = (new Sistema_Model_UsuarioAcao())->checkPermission(
                $this->view->form->id_usuario->getValue(), $this->view->configuracoes->idLiberarValidacoesIS
            );
        }
    }

    public function beforeSave()
    {
        $parametros = $this->getRequest()->getParams();

        if ($parametros['tp_usuario'] === Sistema_Model_Usuarios::TIPO_USUARIO_VISTORIADOR) {
            $camposEndereco = [
              $parametros['ds_endereco_cep'],
              $parametros['ds_endereco_bairro'],
              $parametros['ds_endereco_rua'],
              $parametros['ds_endereco_nro'],
              $parametros['id_municipio'],
              $parametros['id_estado'],
            ];

            $camposEnderecoVazio = array_filter($camposEndereco, function($valor) {
                return empty($valor);
            });

            if (!empty($camposEnderecoVazio)) {
                throw new \Exception('É obrigatório o preenchimento dos campos de Endereço do Funcionário', 403);
            }
        }

        $this->validarUsuario($parametros);
    }

	private function liberarPreviaDigital(int $idFuncionario, bool $liberarPrevia)
    {
        $rowFuncionario = $this->getModel()->getRow($idFuncionario);
        $rowUsuario = (new Sistema_Model_Usuarios())->getRow($rowFuncionario['id_usuario']);

        $rowUsuario->fl_liberado_tablet_previa = $liberarPrevia ? 't' : 'f';
        $rowUsuario->deviceid = !$liberarPrevia ? '' : $rowUsuario->deviceid;
        $rowUsuario->save();
    }

    public function historicoalteracoesAction()
    {
        $this->isAjax();

        $modelFuncionario = $this->getModel();
        $rowsLogs = (new Log_Model_LogAlteracoesCadastroFuncionarios())->getDados((int) $this->getRequest()->getParam('idFuncionario'))->toArray();

        foreach ($rowsLogs as $indice => $logs) {
            $alteracoes = (array) json_decode($logs['ds_alteracoes']);
            $alteracoesAtualizadas = [];

            foreach ($alteracoes as $campo => $valor) {
                $campoAtualizado = $modelFuncionario->dicionarioDados($campo);

                if (empty($campoAtualizado)) {
                    continue;
                }

                $dados = new stdClass();
                $dados->campo = $campoAtualizado;
                $dados->valor = $valor;
                $alteracoesAtualizadas[] = $dados;
            }

            $rowsLogs[$indice]['ds_alteracoes'] = json_encode($alteracoesAtualizadas);
        }

        return $this->getResponse()->setBody(Zend_Json::encode($rowsLogs));
    }

	public function dispositivosAction()
    {
        $this->getHelper('layout')->disableLayout();

        $parametros = $this->getRequest()->getParams();

        if (isset($parametros['id_usuario'])) {
            $modelUsuarios = new Sistema_Model_Usuarios();
            $this->view->usuario = $modelUsuarios->getRow($parametros['id_usuario']);
        }
    }

	public function buscavistoriadoresempresaAction()
	{
		$this->isAjax();

		$idEmpresa = $this->getRequest()->getParam('id_empresa');

		$retorno = ['ids_funcionario' => [], 'status' => true];

		try {
			if (empty($idEmpresa)) {
				throw new Exception('ID Empresa não informado.');
			}

			if (!filter_var($idEmpresa, FILTER_VALIDATE_INT)) {
				throw new Exception('ID empresa deve ser um inteiro.');
			}

			$retorno['ids_funcionario'] = (new Sistema_Model_Funcionarios())->getComboVistoriadoresByEmpresas([$idEmpresa], true);

		} catch (Exception $e) {
			$retorno['status'] = false;
			$retorno['message'] = $e->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($retorno));
	}
}
