<?php

class Sistema_AvisotelainicialController extends Agro_Controller_Action {
    public $_columnList = array(
        'ds_descricao' => 'Descrição',
        'vl_largura' => 'Largura',
        'vl_altura' => 'Altura',
        'ds_posicao' => 'Posição',
        'ds_arquivo' => 'Arquivo'
    );

    public $_backAfterSave = false;

    public function init() {
        $this->view->title = 'Sistema » Configurações » Aviso de Tela Inicial';
    }

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

    public function getForm() {
        return new Sistema_Form_Avisotelainicial();
    }

    public function formAction()
    {
        parent::formAction();
        $model = $this->getModel();
        if ($this->getRequest()->getParam('id')) {
            $rs = $model->find($this->getRequest()->getParam('id'))->current();
            $this->view->ds_arquivo = $rs['ds_arquivo'];
            $this->view->ds_url = $rs['ds_url'];
            $this->view->fl_habilitar_confirmacao_leitura = (bool)$rs['fl_habilitar_confirmacao_leitura'];

            $this->getTiposUsuariosSelecionados((int)$this->getRequest()->getParam('id'));
        }
    }

    public function afterSave($id) {
        if ($id) {
            $Model = $this->getModel();
            $Row = $Model->find($id)->current()->toArray();
            if ($this->deleteCron($id, $Row['dt_inicio'], $Row['dt_termino'])) {
                $this->createCron($id, $Row['dt_inicio'], $Row['dt_termino']);
            }
        }

        $modelAvisoTelaInicialTipoUsuario = new Sistema_Model_AvisoTelaInicialTipoUsuario();
        $modelAvisoTelaInicialTipoUsuario->delete($id, 'id_aviso_tela_inicial');

        if ($this->getRequest()->getParam('ds_posicao') === Sistema_Model_AvisoTelaInicial::POSICAO_CENTRALIZADO
            && $this->getRequest()->has('tipo_usuario')
        ) {
            foreach ($this->getRequest()->getParam('tipo_usuario') as $tipoUsuario) {
                $modelAvisoTelaInicialTipoUsuario->save([
                    'id_aviso_tela_inicial' => $id,
                    'tp_usuario' => $tipoUsuario,
                ]);
            }

            $this->getTiposUsuariosSelecionados((int)$id);
        }
    }

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

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

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

        return $where;
    }

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

        $Model = $this->getModel();
        $where = $this->getFilter();
        $this->_paginator = $this->getRequest()->getParam('show_paginacao');
        $recordsPerPage = ($this->recordsPerPage ? $this->recordsPerPage : RECORDS_PER_PAGE);
        $Rs = $Model->fetchAllPaginator($where, $this->getRequest()->getParam('page'), $recordsPerPage, $this->_paginator);
        $this->view->paginator = $Rs;
    }

    /* Cria dois CRON no sistema para desativar e depois ativar funcionar nas datas determinadas */
    private function createCron($idAviso, $dtInicio, $dtFim) {
        $inicio = explode('-', $dtInicio);
        list($iano, $imes, $idia) = $inicio;
        $fim = explode('-', $dtFim);
        list($fano, $fmes, $fdia) = $fim;

        shell_exec("crontab -l >> /tmp/mycron");
        shell_exec("sed -i '/php ".$idAviso." /d' /tmp/mycron");
        shell_exec("echo \"01 00 ".$idia." ".$imes." * /usr/bin/php ".APPLICATION_PATH."/../Curl/avisotelainicial.php ".$idAviso." > /tmp/output.cronlog\" >>   /tmp/mycron");
        shell_exec("echo \"59 23 ".$fdia." ".$fmes." * /usr/bin/php ".APPLICATION_PATH."/../Curl/avisotelainicial.php ".$idAviso." > /tmp/output.cronlog\" >>   /tmp/mycron");
        shell_exec("crontab /tmp/mycron");
        shell_exec("rm /tmp/mycron");

        return true;
    }

    /* Remove linhas no arquivo cron referente ao funcionário em questão */
    private function deleteCron($idAviso) {
        shell_exec("crontab -l >> /tmp/mycron");
        shell_exec("sed -i '/avisotelainicial/d' /tmp/mycron");
        shell_exec("crontab /tmp/mycron");
        shell_exec("rm /tmp/mycron");

        return true;
    }

    public function activeAction()
    {
        $modelAvisosTelaInicial = $this->getModel();
        $avisoAlterado = $modelAvisosTelaInicial->fetchAll("id = {$this->getRequest()->getParam('id')}")->current()->toArray();

        if (!$avisoAlterado['fl_ativo']) {
            $avisoAtivoPosicao = $modelAvisosTelaInicial->fetchAll(
                "id <> {$this->getRequest()->getParam('id')} AND ds_posicao = '{$avisoAlterado['ds_posicao']}' AND fl_ativo is true"
            )->toArray();

            if (!empty($avisoAtivoPosicao)) {
                $this->getHelper('ViewRenderer')->setNoRender();
                $this->getHelper('layout')->disableLayout();

                $this->getResponse()->setBody("Ação não permitida, pois já existe um aviso ativo para mesma posição.");
                return true;
            }
        }

        parent::activeAction();
    }

    public function confirmarleituraAction()
    {
        $this->isAjax();
        $adapter = Agro_Db_Table_Abstract::getDefaultAdapter();

        try {
            $adapter->beginTransaction();

            if ((new Sistema_Model_AvisoTelaInicialUsuarioLeitura())->save([
                'id_aviso_tela_inicial' => $this->getRequest()->getParam('idAviso'),
                'id_usuario' => $this->getUsuarioLogado()->id,
                'fl_lido' => true,
            ])) {

            }

            $adapter->commit();
        } catch (Exception $erro) {
            $adapter->rollBack();

            $this->_return['erro'] = true;
            $this->_return['mensagem'] = 'Erro ao confirmar leitura do aviso.';
        }

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

    private function getTiposUsuariosSelecionados(int $id)
    {
        $tipoUsuariosFiltrados = (new Sistema_Model_AvisoTelaInicialTipoUsuario())->fetchAll(
            "id_aviso_tela_inicial = {$id}"
        )->toArray();

        $this->view->tipoUsuariosFiltrados = array_map(function($registro) {
            return $registro['tp_usuario'];
        },$tipoUsuariosFiltrados);
    }

    public function beforeSave()
    {
        $url = $this->getRequest()->getParam('ds_url');
        if (!empty($url) && !Agro_Util::filterVariable($url, FILTER_VALIDATE_URL)) {
            throw new Exception('URL inválida.', 403);
        }
    }
}
