<?php

require_once 'connect.php';
require_once 'inc/messages.php';

// retorna array com lista com grupos de usuário, ou false se deu erro
function usuariosGrupo_getAll() {
  global $conexao;
  $sql = "select * from erpc_usuarios_grupo where st_ativo=?";
  $values[] = '1';
  $result = _prepareAndQuery($sql, $values);

  return $result;
}

// retorna array associativo com objeto, ou false se deu erro/não encontrar
function usuariosGrupo_getById($id, $loadItens=true, $incluirItensNaoVinculados=false) {
  global $conexao;
  $sql = "select * from erpc_usuarios_grupo where id=? and st_ativo=1";
  $values[] = $id;
  $result = _prepareAndQuery($sql, $values);
  if ($result !== false) {
    if (count($result) === 1) {
      $result = $result[0];
      $result['funcionalidades'] = usuariosGrupo_getFuncionalidadesDoGrupo($result['id'], true);
    } else {
      $result = false;
      addError('Id não encontrado');
    }
  }

  return $result;
}

// insere novo grupo
function usuariosGrupo_insert($usuariosGrupo) {
  global $conexao;
  $ok = false;
  $sql = 'insert into erpc_usuarios_grupo ';
  $campos = array('ds_grupo', 'st_ativo');
  $values = array($usuariosGrupo['ds_grupo'], $usuariosGrupo['st_ativo']);
  $sql .= '(' . implode(',', $campos) . ') values (' . trim(str_repeat('?,', count($values)), ',') . ')';
  
  $ok = _prepareAndExecute($sql, $values);
  if ($ok) {
    $usuariosGrupo['id'] = mysqli_insert_id($conexao);
    $ok = usuariosGrupo_setFuncionalidadesDoGrupo($usuariosGrupo);
  }
  if($ok !== false) {
    addMessage('Inserido com sucesso');
  }

  return $ok;
}

// altera grupo
function usuariosGrupo_update($usuariosGrupo) {
  global $conexao;
  $ok = false;
  $sql = 'update erpc_usuarios_grupo set ds_grupo = ?';
  $values = array($usuariosGrupo['ds_grupo']);
  $sql .= ' where id = ?';
  $values[] = $usuariosGrupo['id'];

  $ok = _prepareAndExecute($sql, $values);
  if ($ok !== false) {
    $ok = usuariosGrupo_setFuncionalidadesDoGrupo($usuariosGrupo);
  }
  if($ok !== false) {
    addMessage('Atualizado com sucesso');
  }
  return $ok;
}

// marca como apagado o grupo
function usuariosGrupo_delete($usuariosGrupo) {
  global $conexao;
  $ok = false;
  $sql = 'update erpc_usuarios_grupo set st_ativo = 0';
  $values = array();
  $sql .= ' where id = ?';
  $values[] = $usuariosGrupo['id'];
  $ok = _prepareAndExecute($sql, $values);
  if($ok !== false) {
    addMessage('Removido com sucesso');
  }
  return $ok;
}

// cria um grupo vazio
function usuariosGrupo_create($incluirItens=false, $incluirItensNaoVinculados=false) {
  date_default_timezone_set('America/Sao_Paulo');
  $usuariosGrupo = array(
    'id' => '',
    'ds_grupo' => '',
    'st_ativo' => '1'
  );
  if ($incluirItens) {
    require_once 'inc/funcionalidade.php';
    $usuariosGrupo['funcionalidades'] = usuariosGrupo_getFuncionalidadesDoGrupo(0, $incluirItensNaoVinculados);
  } else {
    $usuariosGrupo['funcionalidades'] = array();
  }
  return $usuariosGrupo;
}

// monta o array de funcionalidades associado ao grupo desejado, e caso necessário também pega os não vinculados, para mostrar na tela
function usuariosGrupo_getFuncionalidadesDoGrupo($id=0, $incluirItensNaoVinculados=false) {
  global $conexao;
  $ok = false;
  $sql = 'SELECT
      f.id AS id_funcionalidade,
      f.ds_funcionalidade,
      gf.id_grupo  
    FROM
      erpc_funcionalidades f   
    JOIN
      erpc_grupo_funcionalidade gf 
        ON f.id = gf.id_funcionalidade  
    WHERE
      gf.id_grupo = ?';
  $values[] = $id;
  if ($incluirItensNaoVinculados) {
    $sql .= '
        union
        select
          f.id AS id_funcionalidade,
          f.ds_funcionalidade,
          null as id_grupo  
        FROM
          erpc_funcionalidades f  
        WHERE
          f.id not in (
            select
              gf.id_funcionalidade 
            from
              erpc_grupo_funcionalidade gf 
            where
              gf.id_grupo = ?
          )';
    // 2x o id, uma em cada query
    $values[] = $id;
  }
  $sql .= ' order by 1';
  $result = _prepareAndQuery($sql, $values);
  return $result;
}

// salva os itens selecionados na base
function usuariosGrupo_setFuncionalidadesDoGrupo($usuariosGrupo) {
  global $conexao;
  $ok = false;
  // deleta todos os itens atuais e depois insere novamente
  $sql = 'delete from erpc_grupo_funcionalidade where id_grupo=?';
  $values = array($usuariosGrupo['id']);
  $ok = _prepareAndExecute($sql, $values);
  if ($ok !== false) {
    $values = array();
    // insere todas as linhas
    $sql = 'insert into erpc_grupo_funcionalidade (id_funcionalidade, id_grupo) values' . PHP_EOL;
    foreach($usuariosGrupo['funcionalidades'] as $gf) {
      $sql .= ' (?, ?),';
      $values[] = $gf['id_funcionalidade'];
      $values[] = $usuariosGrupo['id'];
    }
    // remove última ','
    $sql = trim($sql, ',');
    $ok = _prepareAndExecute($sql, $values);
    if ($ok === false) {
      addError('Erro na gravação das funcionalidades.');
    }
  } else {
    addError('Erro na gravação das funcionalidades');
  }
  
  return $ok;
}
