<?php
  require_once 'MysqlConnector.php';

  class GerenciadorGrupos {
    private $db;

    public function __construct() {
        // Inicializa uma nova conexão com o banco de dados
        $this->db = new MysqlConnector();
    }

    public function buscarGrupo($idgrupo = 0) {
      // Prepare a consulta SQL com um marcador de posição para o parâmetro
      $sql =  "SELECT gd.*,	g.descricao FROM grupodetalhe gd INNER JOIN grupo g on g.IdGrupo = gd.IdGrupo WHERE (0 = ? OR gd.IdGrupo = ? )";

      $link = $this->db->GetConnectionLink();

      // Prepare a declaração SQL
      $stmt = $link->prepare($sql);

      // Vincule o parâmetro à declaração
      $stmt->bind_param("ii", $idgrupo, $idgrupo);

      // Execute a consulta
      $stmt->execute();

      // Obtenha os resultados da consulta
      $result = $stmt->get_result();

      // Verifique se houve erros na consulta
      if (!$result) {
          // Lançar uma exceção em vez de apenas imprimir uma mensagem
          throw new Exception("Erro na consulta: " . $link->error);
      }

      // Fetch os dados
      $dados = $result->fetch_all(MYSQLI_ASSOC);

      // Feche a declaração
      $stmt->close();

      return $dados;
    }

    public function inserirGrupo($grupo) {
      $sql = "INSERT INTO grupo (descricao) VALUES(?)";

      $link = $this->db->GetConnectionLink();

      // Prepare a declaração SQL
      $stmt = $link->prepare($sql);

      // Vincule os parâmetros à declaração
      $stmt->bind_param("s", $grupo);

      // Execute a declaração
      $result = $stmt->execute();

      // Verifique se houve erros na execução
      if (!$result) {
          // Lançar uma exceção em vez de apenas imprimir uma mensagem
          throw new Exception("Erro ao inserir usuário: " . $link->error);
      }

      // Obter o ID inserido
      $id_inserido = $link->insert_id;

      // Feche a declaração
      $stmt->close();

      // Retorna o ID inserido
      return $id_inserido;
    }

    public function editarGrupo($idgrupo, $usuario,$grupo) {
      $sql = "UPDATE grupo SET descricao = ?,UsuarioAlteracao = ? WHERE IdGrupo = ?";

      $link = $this->db->GetConnectionLink();

      // Prepare a declaração SQL
      $stmt = $link->prepare($sql);

      // Vincule os parâmetros à declaração
      $stmt->bind_param("sii", $grupo, $usuario,$idgrupo);

      // Execute a declaração
      $result = $stmt->execute();

      // Verifique se houve erros na execução
      if (!$result) {
          // Lançar uma exceção em vez de apenas imprimir uma mensagem
          throw new Exception("Erro ao editar usuário: " . $link->error);
      }

      // Feche a declaração
      $stmt->close();

      return $result;
    }
    public function excluirGrupo($idgrupo) {
      $sql = "DELETE FROM grupo WHERE IdGrupo = ?";

      $link = $this->db->GetConnectionLink();

      // Prepare a declaração SQL
      $stmt = $link->prepare($sql);

      // Vincule os parâmetros à declaração
      $stmt->bind_param("i", $idgrupo);

      // Execute a declaração
      $result = $stmt->execute();

      // Verifique se houve erros na execução
      if (!$result) {
          // Lançar uma exceção em vez de apenas imprimir uma mensagem
          throw new Exception("Erro ao Excluir Grupo: " . $link->error);
      }

      // Feche a declaração
      $stmt->close();

      return $result;
    }

    public function excluirDetalhes($idgrupo){
      $sql = "DELETE FROM grupodetalhe WHERE IdGrupo = ?";

      $link = $this->db->GetConnectionLink();

      // Prepare a declaração SQL
      $stmt = $link->prepare($sql);

      // Vincule os parâmetros à declaração
      $stmt->bind_param("i", $idgrupo);

      // Execute a declaração
      $result = $stmt->execute();

      // Verifique se houve erros na execução
      if (!$result) {
          // Lançar uma exceção em vez de apenas imprimir uma mensagem
          throw new Exception("Erro ao Excluir Grupo: " . $link->error);
      }

      // Feche a declaração
      $stmt->close();

      return $result;
    }

    public function inserirDetalhes($idgrupo,$tbCriar,$tbAlterar,$tbExcluir,$tbSelect,$tbUpdate,$tbDelete,$vwCriar,$vwDelete,
                                    $sqCriar,$sqAlterar,$sqExcluir,$sqSelect,$prCria,$prAltera,$prExcluir,$trCriar,$trAlterar,$trExcluir,
                                    $idxCriar,$idxAlterar,$idxExcluir){
      $sql = "INSERT INTO grupodetalhe (idgrupo,tbcriar,tbalterar,tbexcluir,tbselect,tbupdate,tbdelete,vwcriar,vwdelete,
                                        sqcriar,sqalterar,sqexcluir,sqselect,prcriar,pralterar,prexcluir,trcriar,tralterar,trexcluir,
                                        idxcriar,idxalterar,idxexcluir
                                        ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

      $link = $this->db->GetConnectionLink();

      // Prepare a declaração SQL
      $stmt = $link->prepare($sql);

      // Vincule os parâmetros à declaração
      $stmt->bind_param("isssssssssssssssssssss", $idgrupo, $tbCriar, $tbAlterar, $tbExcluir, $tbSelect, $tbUpdate, $tbDelete, $vwCriar, $vwDelete,
                        $sqCriar,$sqAlterar,$sqExcluir,$sqSelect,$prCria,$prAltera,$prExcluir,$trCriar,$trAlterar,$trExcluir,
                        $idxCriar,$idxAlterar,$idxExcluir );


      // Execute a declaração
      $result = $stmt->execute();

      // Verifique se houve erros na execução
      if (!$result) {
          // Lançar uma exceção em vez de apenas imprimir uma mensagem
          throw new Exception("Erro ao inserir usuário: " . $link->error);
      }
      // Feche a declaração
      $stmt->close();

      // Retorna o ID inserido
      return $result;
    }

    public function contaregistros($idgrupo){
      $sql = "SELECT COUNT(*) FROM GRUPODETALHE WHERE IDGRUPO = ?";

      $link = $this->db->GetConnectionLink();

      $stmt = $link->prepare($sql);

      $stmt->bind_param("i",$idgrupo);

      $result = $stmt->execute();

      if (!$result) {
        // Lançar uma exceção em vez de apenas imprimir uma mensagem
        throw new Exception("Erro buscar registros: " . $link->error);
      }
      // Feche a declaração
      $stmt->close();

      // Retorna o ID inserido
      return $result;
    }

    public function editarDetalhes($idgrupo,$tbCriar,$tbAlterar,$tbExcluir,$tbSelect,$tbUpdate,$tbDelete,$vwCriar,$vwDelete,
                                    $sqCriar,$sqAlterar,$sqExcluir,$sqSelect,$prCria,$prAltera,$prExcluir,$trCriar,$trAlterar,$trExcluir,
                                    $idxCriar,$idxAlterar,$idxExcluir,$usuario){

      $sql = "UPDATE GRUPODETALHE SET tbcriar = ?,tbalterar = ?,tbexcluir = ?,tbselect = ?,tbupdate = ?,tbdelete = ?,vwcriar = ?,vwdelete = ?,
                                      sqcriar = ?,sqalterar = ?,sqexcluir = ?,sqselect = ?,prcriar = ?,pralterar = ?,prexcluir = ?,trcriar = ?,
                                      tralterar = ?,trexcluir = ?,idxcriar = ?,idxalterar = ?,idxexcluir = ?,UsuarioAlteracao = ? WHERE idgrupo = ?";


      $link = $this->db->GetConnectionLink();

      // Prepare a declaração SQL
      $stmt = $link->prepare($sql);

      // Vincule os parâmetros à declaração
      $stmt->bind_param("sssssssssssssssssssssii", $tbCriar, $tbAlterar, $tbExcluir, $tbSelect, $tbUpdate, $tbDelete, $vwCriar, $vwDelete,
                        $sqCriar,$sqAlterar,$sqExcluir,$sqSelect,$prCria,$prAltera,$prExcluir,$trCriar,$trAlterar,$trExcluir,
                        $idxCriar,$idxAlterar,$idxExcluir,$usuario,$idgrupo );


      // Execute a declaração
      $result = $stmt->execute();

      // Verifique se houve erros na execução
      if (!$result) {
          // Lançar uma exceção em vez de apenas imprimir uma mensagem
          throw new Exception("Erro ao inserir usuário: " . $link->error);
      }
      // Feche a declaração
      $stmt->close();

      // Retorna o ID inserido
      return $result;
    }

  }

?>
