<?php
require_once("../../../../config/config_dir_raiz.php");
$config = new Config();
require_once($config->diretorio_raiz()."/componentes/construtor/src/model/Tabela_bd.php");
require_once($config->diretorio_raiz()."/src/controller/Funcoes_bd.php");
require_once($config->diretorio_raiz()."/componentes/construtor/src/model/bd/Coluna_bdDAO.php");

class Tabela_bdDAO
{
	private $_funcoes_bd;
	private $_banco_atual;
	private $conexao;
	function __construct()
	{
		$this->conexao = Conexao::obterConexao();
		$this->_banco_atual = Conexao::getUtilizarBanco();
		$this->_funcoes_bd = new Funcoes_bd();
	}
	
	public function listarTabelas()
	{
		$lista_tabelas_bd = array();
		$sql = "SELECT ID, DESCRICAO, INVISIVEL, TABELA FROM tabelas";
		$row_tabelas = $this->_funcoes_bd->sql($sql);
		foreach ($row_tabelas as $row_tabelas)
		{
			$_tabela_bd = new Tabela_bd();
			$_tabela_bd->setId($row_tabelas["ID"]);
			$_tabela_bd->setDescricao($row_tabelas["DESCRICAO"]);
			$_tabela_bd->setInvisivel($row_tabelas["INVISIVEL"]);
			$_tabela_bd->setTabela($row_tabelas["TABELA"]);
			$coluna_bdDAO = new Coluna_bdDAO();
			$_tabela_bd->adicionar_colunas($coluna_bdDAO->listarColunas($_tabela_bd->getId()));
			array_push($lista_tabelas_bd,$_tabela_bd);
		}	
		return $lista_tabelas_bd;
	}
	

	
	public function listarTabela($id)
	{
	
		$sql = "SELECT ID, DESCRICAO, INVISIVEL, TABELA FROM tabelas where id =".$id;
		$_tabela_bd = new Tabela_bd();
		$row_tabelas = $this->_funcoes_bd->sql($sql);
		foreach ($row_tabelas as $row_tabelas)
		{
			$_tabela_bd->setId($row_tabelas["ID"]);
			$_tabela_bd->setDescricao($row_tabelas["DESCRICAO"]);
			$_tabela_bd->setInvisivel($row_tabelas["INVISIVEL"]);
			$_tabela_bd->setTabela($row_tabelas["TABELA"]);
			$coluna_bdDAO = new Coluna_bdDAO();
			$_tabela_bd->adicionar_colunas($coluna_bdDAO->listarColunas($_tabela_bd->getId()));
		}	
		return $_tabela_bd;
	}
	
	public function listarTabelaSemColunas($id)
	{
	
		$sql = "SELECT ID, DESCRICAO, INVISIVEL, TABELA FROM tabelas where id =".$id;
		$_tabela_bd = new Tabela_bd();
		$row_tabelas = $this->_funcoes_bd->sql($sql);
		foreach ($row_tabelas as $row_tabelas)
		{
			$_tabela_bd->setId($row_tabelas["ID"]);
			$_tabela_bd->setDescricao($row_tabelas["DESCRICAO"]);
			$_tabela_bd->setInvisivel($row_tabelas["INVISIVEL"]);
			$_tabela_bd->setTabela($row_tabelas["TABELA"]);
			$coluna_bdDAO = new Coluna_bdDAO();
			//$_tabela_bd->adicionar_colunas($coluna_bdDAO->listarColunas($_tabela_bd->getId()));
		}	
		return $_tabela_bd;
	}
	
	public function buscarTabelaPeloNome($nome)
	{
	
		$sql = "SELECT ID, DESCRICAO, INVISIVEL, TABELA FROM tabelas where TABELA ='".$nome."'";
		$_tabela_bd = new Tabela_bd();
		$row_tabelas = $this->_funcoes_bd->sql($sql);
		foreach ($row_tabelas as $row_tabelas)
		{
			$_tabela_bd->setId($row_tabelas["ID"]);
			$_tabela_bd->setDescricao($row_tabelas["DESCRICAO"]);
			$_tabela_bd->setInvisivel($row_tabelas["INVISIVEL"]);
			$_tabela_bd->setTabela($row_tabelas["TABELA"]);
			$coluna_bdDAO = new Coluna_bdDAO();
			$_tabela_bd->adicionar_colunas($coluna_bdDAO->listarColunas($_tabela_bd->getId()));
		}	
		return $_tabela_bd;
	}
	
	public function salvarTabela($_tabela_bd)
	{
		$inputs = array();		
		$criarTabela = "";
		switch ($this->_banco_atual)
		{
			case "mysql": 
				//$criarTabela= "CREATE TABLE ".$_tabela_bd->getTabela()." ( ID BIGINT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB";
				$criarTabela= "CREATE TABLE ".$_tabela_bd->getTabela()." ( dafault int(11)) engine = MyIsam";
			break;			
		}
		
		try
		{
			$this->_funcoes_bd->executarSql($criarTabela,$inputs);
			array_push($inputs, array('campo'=>':TABELA', 'valor'=>$_tabela_bd->getTabela()));
			array_push($inputs, array('campo'=>':DESCRICAO', 'valor'=>$_tabela_bd->getDescricao()));
			$sql = "INSERT INTO tabelas( TABELA, DESCRICAO, INVISIVEL) VALUES (:TABELA, :DESCRICAO, 0)";
			$retornoInsertTabela = $this->_funcoes_bd->executarSql($sql,$inputs);
			$_colunas_bd = new Coluna_bd();
			$_colunas_bd->setDescricao('Código');
			$_colunas_bd->setInvisivel(0);
			$_colunas_bd->setColuna('codigo');
			$_colunas_bd->setTamanho(20);
			$_colunas_bd->setTipo('BIGINT');
			$_colunas_bd->setTabela($this->buscarTabelaPeloNome($_tabela_bd->getTabela())->getId());
			$_colunas_bd->setMascara('');
			$_colunas_bd->setIndice('PRIMARY');
			$_colunas_bd->setAutoIncrementar('1');
			$_colunas_bd->setTipoColuna( new Coluna_bd());
			$_colunas_bd->setTipoColunaPrimaria( new Coluna_bd());
			$_colunas_bd->setTipoTabela(new Tabela_bd());
			$_colunas_bd->setNaoExibirTabela('0');
			$_colunas_bd->setFiltrar('0');
			$_colunas_bd->setNovaLinha('0');
			$_colunas_bd_DAO = new Coluna_bdDAO();
			$_colunas_bd_DAO->salvarColuna($_colunas_bd,$this->buscarTabelaPeloNome($_tabela_bd->getTabela()));
			return $retornoInsertTabela;
		}
		catch (Exception $e)
		{
			throw new Exception($e->getMessage());
		}
		
		
	}
	public function atualizarTabela($_tabela_bd)
	{
		$inputs = array();		
		$criarTabela = "";
		switch ($this->_banco_atual)
		{
			case "mysql": 
				$sql = "SELECT ID, DESCRICAO, INVISIVEL, TABELA FROM tabelas where id =".$_tabela_bd->getId();
				$row_tabelas = $this->_funcoes_bd->sql($sql);
				foreach ($row_tabelas as $row_tabelas)
				{
					$criarTabela= "ALTER TABLE ".$row_tabelas["TABELA"]." RENAME ".$_tabela_bd->getTabela()." ";
				}	
			break;			
		}
		
		try
		{
			$this->_funcoes_bd->executarSql($criarTabela,$inputs);
			$sql = "update tabelas SET TABELA = :TABELA, DESCRICAO = :DESCRICAO WHERE ID = :ID";
			$inputs = array();
			array_push($inputs, array('campo'=>':TABELA', 'valor'=>$_tabela_bd->getTabela()));
			array_push($inputs, array('campo'=>':DESCRICAO', 'valor'=>$_tabela_bd->getDescricao()));
			array_push($inputs, array('campo'=>':ID', 'valor'=>$_tabela_bd->getId()));			
			return $this->_funcoes_bd->executarSql($sql,$inputs);
		}
		catch (Exception $e)
		{
			throw new Exception($e->getMessage());
		}
		
		
	}
	public function excluirTabela($_tabela_bd)
	{
		$excluirTabela = ' DROP TABLE '.$_tabela_bd->getTabela().'';		
		try
		{
			$inputs = array();	
			array_push($inputs, array('campo'=>':ID', 'valor'=>$_tabela_bd->getId()));		
			//excluindo colunas
			$this->_funcoes_bd->executarSql($excluirTabela,array());
			$sql = "DELETE FROM colunas_composta WHERE coluna_origem in (select ID FROM colunas WHERE TABELA = :ID)";
			$this->_funcoes_bd->executarSql($sql,$inputs);
			///
			$sql = "DELETE FROM colunas WHERE TABELA = :ID";
			$this->_funcoes_bd->executarSql($sql,$inputs);
			//excluindo cargas
			$sql = "DELETE FROM cargatabela WHERE TABELA = :ID";
			$this->_funcoes_bd->executarSql($sql,$inputs);
			//excluindo tabelas
			$sql = "DELETE FROM tabelas WHERE ID = :ID";	
			return $this->_funcoes_bd->executarSql($sql,$inputs);
		}
		catch (Exception $e)
		{
			throw new Exception($e->getMessage());
		}
		
		
	}
	
	public function verificaSeEstaCarregadoNaTabela($idTabela)
	{
		$lista_carga_tabela_bd = array();
		$sql = "SELECT ID,TABELA,TABELACARREGADA, DESCRICAO FROM cargatabela WHERE TABELACARREGADA = ".$idTabela;
		//echo $sql;
		$rows = $this->_funcoes_bd->sql($sql);
		$esta = false;
		foreach ($rows as $row)
		{	
			$esta = true;
		}	
		return $esta;
	}
	
}