<?php

class Log_Model_MaisAcessados extends Agro_Db_Table_Abstract {
    protected $_name = 'mais_acessados';
    protected $_schema = 'log';
    protected $_primary = 'id';

    // Salva e atualiza o número de vezes que o usuário acessou a ação em questão.
    public function save(array $values) {

        $filter = "id_usuario_criacao = {$values['id_usuario']}
            and ds_module = '{$values['module']}'
            and ds_controller = '{$values['controller']}'
            and ds_action = '{$values['action']}'";

        if ($values['ds_chave_menu']) {
            $filter .= " and ds_chave_menu = '{$values['ds_chave_menu']}'";
        }

        $Row = $this->fetchRow($filter);

        if ($Row->numero_acessos > 0) {

            $numacc = $Row->numero_acessos+1;
            $Row = $this->getRow($Row->id);
            $Row->numero_acessos = $numacc;
        } else {

            $Row = $this->createRow();
            $Row->ds_module          = $values['module'];
            $Row->ds_controller      = $values['controller'];
            $Row->ds_action          = $values['action'];
            $Row->ds_chave_menu      = ($values['ds_chave_menu'] ? $values['ds_chave_menu'] : null);
            $Row->numero_acessos     = 1;
        }

        return $Row->save();
    }

    // Busca as 10 ações mais acessadas pelo usuário
    public function getMaisAcessados($idUsuario) {

        $subselect = $this->select()->setIntegrityCheck(false);
        $subselect->from(array('a' => 'sistema.acao'),'a.ds_label');
        $subselect->where('a.ds_module = ma.ds_module');
        $subselect->where('a.ds_controller = ma.ds_controller');
        $subselect->where('a.ds_action = ma.ds_action');
        $subselect->where('a.fl_ativo is true');
        $subselect->where('a.fl_del is false');
        $subselect->where('a.ds_param is null');
        $subselect->order('a.nr_ordem asc');
        $subselect->limit(1);

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('ma' => 'log.mais_acessados'), array('('.new Zend_Db_Expr($subselect).') as ds_label'
                                                        ,'ma.numero_acessos'
                                                        , 'ma.ds_module'
                                                        , 'ma.ds_controller'
                                                        , 'ma.ds_action'
                                                        , 'ma.ds_chave_menu'));
        $select->where('ma.id_usuario_criacao = ?', $idUsuario);
        $select->where('ma.fl_ativo is true');
        $select->where('ma.fl_del is false');
        $select->where('ma.ds_chave_menu is null');

        //UNION PRA TRAZER QUANDO TEM CONFERÊNCIA
        $subselectUnion = $this->select()->setIntegrityCheck(false);
        $subselectUnion->from(array('a' => 'sistema.acao'),'a.ds_label');
        $subselectUnion->where('a.ds_module = ma.ds_module');
        $subselectUnion->where('a.ds_controller = ma.ds_controller');
        $subselectUnion->where('a.ds_action = ma.ds_action');
        $subselectUnion->where('a.fl_ativo is true');
        $subselectUnion->where('a.fl_del is false');
        $subselectUnion->where("a.ds_param = '{\"ds_chave_menu\":\"enviada_aguardando_conf\"}'");
        $subselectUnion->order('a.nr_ordem asc');
        $subselectUnion->limit(1);

        $selectUnion = $this->select()->setIntegrityCheck(false);
        $selectUnion->from(array('ma' => 'log.mais_acessados'), array('('.new Zend_Db_Expr($subselectUnion).') as ds_label','ma.numero_acessos', 'ma.ds_module', 'ma.ds_controller', 'ma.ds_action', 'ma.ds_chave_menu'));
        $selectUnion->where('ma.id_usuario_criacao = ?', $idUsuario);
        $selectUnion->where('ma.fl_ativo is true');
        $selectUnion->where('ma.fl_del is false');
        $selectUnion->where('ma.ds_chave_menu = ?', 'enviada_aguardando_conf');

        $selectTotal = $this->select()->setIntegrityCheck(false);
        $selectTotal->union(array($select, $selectUnion));
        $selectTotal->order('numero_acessos desc');
        $selectTotal->order('ds_module asc');
        $selectTotal->limit(10);

        return $this->fetchAll($selectTotal)->toArray();
    }
}
