<?php
require_once("Buscar_coluna_primary.php");
class Gerar_DAO_arqDAO
{
		
		
		function montarArquivo($_tabela_bd, $nome_classe)
		{
			$buscar_coluna_primary = new Buscar_coluna_primary();
			$coluna_primary = $buscar_coluna_primary->buscar($_tabela_bd)->getColuna();
			$nome_coluna_pk = strtoupper(substr($coluna_primary,0,1)).substr($coluna_primary,1);
						
			$dao = "<?php\n";
			$dao .= "require_once(\"../../config/config_dir_raiz.php\");\n\$config = new Config();\n";
			$dao .= "require_once(\$config->diretorio_raiz().\"/src/controller/Funcoes_bd.php\");\n";
			$dao .= "require_once(\$config->diretorio_raiz().\"/src/model/".$nome_classe.".php\");\n";
			
			
			///verificar se possuí um chave estrangeira para incluir o DAO
			$colunas = $_tabela_bd->getLista_colunas();
			$lista_de_classes_incluidas_para_nao_duplicar = array();
			for ($i=0; $i <count($colunas); $i++)
			{	
				$nome_classe_dao = strtoupper(substr($colunas[$i]->getTipoTabela()->getTabela(),0,1)).substr($colunas[$i]->getTipoTabela()->getTabela(),1);
				if ($colunas[$i]->getTipo() == "tabela")
				{
					if (!in_array($nome_classe_dao, $lista_de_classes_incluidas_para_nao_duplicar))
					{	
						$dao .= "require_once(\$config->diretorio_raiz().\"/src/model/bd/".$nome_classe_dao."DAO.php\");\n";
						array_push($lista_de_classes_incluidas_para_nao_duplicar, $nome_classe_dao);
					}	
				}	
			}
			////
			
			
			$dao .= "class ".$nome_classe."DAO\n{\n";
			$dao .= "	private \$_funcoes_bd;\n";
			$dao .= "	private \$_banco_atual;\n";
			$dao .= "	private \$conexao;\n";
			$dao .= "	function __construct()\n";
			$dao .= "	{\n";
			$dao .= "		\$this->conexao = Conexao::obterConexao();\n";
			$dao .= "		\$this->_banco_atual = Conexao::getUtilizarBanco();\n";
			$dao .= "		\$this->_funcoes_bd = new Funcoes_bd();\n";			
			$dao .= "	}\n";
			///funcao salvar
			$dao .= "	public function salvar(\$".$_tabela_bd->getTabela().")\n";
			$dao .= "	{\n";
			$dao .= "		\$inputs = array();\n";
			$colunas = $_tabela_bd->getLista_colunas();
			$colunasInsert = "";
			$valuesInsert = "";
			for ($i=0; $i <count($colunas); $i++)
			{	
				if ($colunas[$i]->getIndice() != "PRIMARY")
				{
					$nome_coluna = strtoupper(substr($colunas[$i]->getColuna(),0,1)).substr($colunas[$i]->getColuna(),1);
					switch ($colunas[$i]->getTipo())
					{
						case ("md5"):
							$dao .= "		array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna."()));\n";
							$valuesInsert .= "md5(:".$colunas[$i]->getColuna().")";
						break;
						case ("data"):
							$dao .= "		if(\$".$_tabela_bd->getTabela()."->get".$nome_coluna."() instanceof DateTime)\n";
							$dao .= "		{\n";
							$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna."()->format('Y-m-d H:i:s')));\n";
							$dao .= "		}\n";
							$dao .= "		else\n";
							$dao .= "		{\n";
							$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>null));\n";
							$dao .= "		}\n";
						case ("tabela"):
							$dao .= "		if(\$".$_tabela_bd->getTabela()."->get".$nome_coluna."() != \"\")\n";
							$dao .= "		{\n";
							$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna."()));\n";
							$dao .= "		}\n";
							$dao .= "		else\n";
							$dao .= "		{\n";
							$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>null));\n";
							$dao .= "		}\n";	
							
							$valuesInsert .= ":".$colunas[$i]->getColuna()."";
						break;
						default:
							$dao .= "		array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna."()));\n";
							$valuesInsert .= ":".$colunas[$i]->getColuna()."";
					}	
					
					$colunasInsert .= "".$colunas[$i]->getColuna()."";
					
					if ($i < count($colunas)-1)
					{
						$colunasInsert .= ", ";
						$valuesInsert .= ", ";
					}	
				}	
			}
			$dao .= "		try\n";
			$dao .= "		{\n";
			$dao .= "			\$sql = \"INSERT INTO ".$_tabela_bd->getTabela()." (".$colunasInsert.") VALUES (".$valuesInsert.")  \";\n";
			$dao .= "			return \$this->_funcoes_bd->executarSql(\$sql,\$inputs);\n";
			$dao .= "		}\n";
			$dao .= "		catch (Exception \$e)\n";
			$dao .= "		{\n";
			$dao .= "			throw new Exception(\$e->getMessage());\n";
			$dao .= "		}\n";
			$dao .= "	}\n";
			///funcao buscar
			$dao .= "	public function buscar".$nome_classe."(\$id)\n";
			$dao .= "	{\n";
			$dao .= "		\$inputs = array();\n";
			$dao .= "		\$sql = \"SELECT * FROM ".$_tabela_bd->getTabela()." where ".$coluna_primary." = \".\$id;\n";
			$dao .= "		\$".$_tabela_bd->getTabela()." = new ".$nome_classe."();\n";
			$dao .= "		\$rows_".$_tabela_bd->getTabela()." = \$this->_funcoes_bd->sql(\$sql);\n";
			$dao .= "		foreach (\$rows_".$_tabela_bd->getTabela()." as \$row)\n";
			$dao .= "		{\n";
			$colunas = $_tabela_bd->getLista_colunas();
			$colunasInsert = "";
			$valuesInsert = "";
			///verificar se possuí um chave primaria, se não tem que criar id hidden
			for ($i=0; $i <count($colunas); $i++)
			{	
				$nome_coluna = strtoupper(substr($colunas[$i]->getColuna(),0,1)).substr($colunas[$i]->getColuna(),1);
				
				switch($colunas[$i]->getTipo())
				{
					case "data":
						$dao .= "			if(\$row['".$colunas[$i]->getColuna()."'] != \"\")\n";
						$dao .= "			{\n";
						$dao .= "				\$date".$nome_coluna." = DateTime::createFromFormat('Y-m-d H:i:s', \$row['".$colunas[$i]->getColuna()."']);\n";
						$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$date".$nome_coluna.");\n";
						$dao .= "			}\n";
					break;
					case "tabela":
						$nome_classe_dao = strtoupper(substr($colunas[$i]->getTipoTabela()->getTabela(),0,1)).substr($colunas[$i]->getTipoTabela()->getTabela(),1);
						$dao .= "			if(\$row['".$colunas[$i]->getColuna()."'] != \"\")\n";
						$dao .= "			{\n";
						$dao .= "				\$".$colunas[$i]->getColuna()."DAO = new ".$nome_classe_dao."DAO();\n";
						$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$".$colunas[$i]->getColuna()."DAO->buscar".$nome_classe_dao."(\$row['".$colunas[$i]->getColuna()."']));\n";
						$dao .= "			}\n";
						$dao .= "			else\n";
						$dao .= "			{\n";
						$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(new ".$nome_classe_dao."());\n";
						$dao .= "			}\n";
					break;
					default:
						$dao .= "			\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$row['".$colunas[$i]->getColuna()."']);\n";
				}
			}
			$dao .= "		}\n";
			$dao .= "		return \$".$_tabela_bd->getTabela().";\n";
			$dao .= "	}\n";
			
			///funcao atualizar
			$dao .= "	public function atualizar(\$".$_tabela_bd->getTabela().")\n";
			$dao .= "	{\n";
			$dao .= "		\$inputs = array();\n";
			$colunas = $_tabela_bd->getLista_colunas();
			$colunasUpdate = "";
			$dao .= "		array_push(\$inputs, array('campo'=>':".$coluna_primary."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna_pk."()));\n";
			$updatesOpcionais="";
			for ($i=0; $i <count($colunas); $i++)
			{	
				if ($colunas[$i]->getIndice() != "PRIMARY")
				{
					$nome_coluna = strtoupper(substr($colunas[$i]->getColuna(),0,1)).substr($colunas[$i]->getColuna(),1);
					switch ($colunas[$i]->getTipo())
					{
						case ("md5"):
							//$dao .= "".$colunas[$i]->getColuna()." = md5(:".$colunas[$i]->getColuna().")";
							$dao .= "		\$alteraMD5".$nome_coluna."casoForPreenchido = \"\"; \n";
							$dao .= "		if ($".$_tabela_bd->getTabela()."->get".$nome_coluna."() != \"\")\n";
							$dao .= "		{\n";
							$dao .= "			\$alteraMD5".$nome_coluna."casoForPreenchido = \", ".$colunas[$i]->getColuna()." = md5(:".$colunas[$i]->getColuna().")\";\n";
							$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna."()));\n";
							$dao .= "		}\n";
							$updatesOpcionais.="\". \$alteraMD5".$nome_coluna."casoForPreenchido. \"";
						break;
						case ("data"):
							if ($colunas[$i]->getIndice() != "DATACRIACAO")//nao atualiza data de criação como diz o nome
							{	
								$dao .= "		if(\$".$_tabela_bd->getTabela()."->get".$nome_coluna."() instanceof DateTime)\n";
								$dao .= "		{\n";
								$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna."()->format('Y-m-d H:i:s')));\n";
								$dao .= "		}\n";
								$dao .= "		else\n";
								$dao .= "		{\n";
								$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>null));\n";
								$dao .= "		}\n";
								$colunasUpdate .= "".$colunas[$i]->getColuna()." = :".$colunas[$i]->getColuna()."";	
							}	
							
						break;
						case ("tabela"):
							$dao .= "		if(\$".$_tabela_bd->getTabela()."->get".$nome_coluna."() != \"\")\n";
							$dao .= "		{\n";
							$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna."()));\n";	
							$dao .= "		}\n";
							$dao .= "		else\n";
							$dao .= "		{\n";
							$dao .= "			array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>null));\n";
							$dao .= "		}\n";
							$colunasUpdate .= "".$colunas[$i]->getColuna()." = :".$colunas[$i]->getColuna()."";	
						break;
						default:
							$colunasUpdate .= "".$colunas[$i]->getColuna()." = :".$colunas[$i]->getColuna()."";	
							$dao .= "		array_push(\$inputs, array('campo'=>':".$colunas[$i]->getColuna()."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna."()));\n";							
					}	
					
					
					if ($i < count($colunas)-1)
					{
						if ($colunas[$i+1]->getTipo() != "md5" and $colunas[$i+1]->getIndice() != "DATACRIACAO")//nao adicionar virgula no md5 pois cria em cima e nao atualiza data de criação como diz o nome
						{	
							$colunasUpdate .= ", ";
						}	
					}	
				}	
			}
			$dao .= "		try\n";
			$dao .= "		{\n";
			if ($updatesOpcionais == "")
			{	
				$dao .= "			\$sql = \"UPDATE  ".$_tabela_bd->getTabela()."  SET ".$colunasUpdate." WHERE ".$coluna_primary." = :".$coluna_primary." \";\n";
			}	
			else
			{
				$dao .= "			\$sql = \"UPDATE  ".$_tabela_bd->getTabela()."  SET ".$colunasUpdate.$updatesOpcionais." WHERE ".$coluna_primary." = :".$coluna_primary." \";\n";
			}
			
			$dao .= "			return \$this->_funcoes_bd->executarSql(\$sql,\$inputs);\n";
			$dao .= "		}\n";
			$dao .= "		catch (Exception \$e)\n";
			$dao .= "		{\n";
			$dao .= "			throw new Exception(\$e->getMessage());\n";
			$dao .= "		}\n";
			$dao .= "	}\n";
			//funcao excluir
			$dao .= "	public function excluir(\$".$_tabela_bd->getTabela().")\n";
			$dao .= "	{\n";
			$dao .= "		try\n";
			$dao .= "		{\n";
			$dao .= "			\$sql = \"DELETE FROM ".$_tabela_bd->getTabela()."  WHERE ".$coluna_primary." = :".$coluna_primary."\";\n";
			$dao .= "			\$inputs = array();\n";
			$dao .= "			array_push(\$inputs, array('campo'=>':".$coluna_primary."', 'valor'=>\$".$_tabela_bd->getTabela()."->get".$nome_coluna_pk."()));\n";			
			$dao .= "			return \$this->_funcoes_bd->executarSql(\$sql,\$inputs);\n";
			$dao .= "		}\n";
			$dao .= "		catch (Exception \$e)\n";
			$dao .= "		{\n";
			$dao .= "			throw new Exception(\$e->getMessage());\n";
			$dao .= "		}\n";
			$dao .= "	}\n";
			
			///funcao listarTodosRegistros
			$dao .= "	public function listarTodosRegistros()\n";
			$dao .= "	{\n";
			$dao .= "		\$inputs = array();\n";
			$dao .= "		\$sql = \"SELECT * FROM ".$_tabela_bd->getTabela()."\";\n";
			$dao .= "		\$lista".$nome_classe." = array();\n";
			$dao .= "		\$rows_".$_tabela_bd->getTabela()." = \$this->_funcoes_bd->sql(\$sql);\n";
			$dao .= "		foreach (\$rows_".$_tabela_bd->getTabela()." as \$row)\n";
			$dao .= "		{\n";
			$dao .= "			\$".$_tabela_bd->getTabela()." = new ".$nome_classe."();\n";
			$colunas = $_tabela_bd->getLista_colunas();
			$colunasInsert = "";
			$valuesInsert = "";

			for ($i=0; $i <count($colunas); $i++)
			{	
				$nome_coluna = strtoupper(substr($colunas[$i]->getColuna(),0,1)).substr($colunas[$i]->getColuna(),1);
				switch($colunas[$i]->getTipo())
				{
					case "data":
						$dao .= "			if(\$row['".$colunas[$i]->getColuna()."'] != \"\")\n";
						$dao .= "			{\n";
						$dao .= "				\$date".$nome_coluna." = DateTime::createFromFormat('Y-m-d H:i:s', \$row['".$colunas[$i]->getColuna()."']);\n";
						$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$date".$nome_coluna.");\n";
						$dao .= "			}\n";
					break;
					case "tabela":
						$nome_classe_dao = strtoupper(substr($colunas[$i]->getTipoTabela()->getTabela(),0,1)).substr($colunas[$i]->getTipoTabela()->getTabela(),1);
						$dao .= "			if(\$row['".$colunas[$i]->getColuna()."'] != \"\")\n";
						$dao .= "			{\n";
						$dao .= "				\$".$colunas[$i]->getColuna()."DAO = new ".$nome_classe_dao."DAO();\n";
						$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$".$colunas[$i]->getColuna()."DAO->buscar".$nome_classe_dao."(\$row['".$colunas[$i]->getColuna()."']));\n";
						$dao .= "			}\n";
						$dao .= "			else\n";
						$dao .= "			{\n";
						$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(new ".$nome_classe_dao."());\n";
						$dao .= "			}\n";
					break;
					default:
						$dao .= "			\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$row['".$colunas[$i]->getColuna()."']);\n";
				}
				
			}
			$dao .= "			array_push(\$lista".$nome_classe.",\$".$_tabela_bd->getTabela()." );\n";
			$dao .= "		}\n";
			$dao .= "		return \$lista".$nome_classe.";\n";
			$dao .= "	}\n";
			
			/////cria funcoes de buscar
			foreach ($colunas as $colunaAtual)
			{	
				if ($colunaAtual->getIndice() != "PRIMARY")
				{
					$nome_coluna_atual = strtoupper(substr($colunaAtual->getColuna(),0,1)).substr($colunaAtual->getColuna(),1);
					$dao .= "	public function buscar".$nome_classe."Por".$nome_coluna_atual."(\$".$colunaAtual->getColuna().")\n";
					$dao .= "	{\n";
					$dao .= "		\$inputs = array();\n";
					switch($colunaAtual->getTipo())
					{
						case "tabela":
							$dao .= "		\$sql = \"SELECT * FROM ".$_tabela_bd->getTabela()." where ".$colunaAtual->getColuna()." = \".\$".$colunaAtual->getColuna().".\"\";\n";
						break;
						default:
							$dao .= "		\$sql = \"SELECT * FROM ".$_tabela_bd->getTabela()." where ".$colunaAtual->getColuna()." like '%\".\$".$colunaAtual->getColuna().".\"%'\";\n";
					}	
					$dao .= "		\$lista_".$_tabela_bd->getTabela()." = array();\n";
					$dao .= "		\$rows_".$_tabela_bd->getTabela()." = \$this->_funcoes_bd->sql(\$sql);\n";
					$dao .= "		foreach (\$rows_".$_tabela_bd->getTabela()." as \$row)\n";
					$dao .= "		{\n";
					$dao .= "			\$".$_tabela_bd->getTabela()." = new ".$nome_classe."();\n";
					$colunas = $_tabela_bd->getLista_colunas();
					$colunasInsert = "";
					$valuesInsert = "";
					///verificar se possuí um chave primaria, se não tem que criar id hidden
					for ($i=0; $i <count($colunas); $i++)
					{	
						$nome_coluna = strtoupper(substr($colunas[$i]->getColuna(),0,1)).substr($colunas[$i]->getColuna(),1);
						
						switch($colunas[$i]->getTipo())
						{
							case "data":
								$dao .= "			if(\$row['".$colunas[$i]->getColuna()."'] != \"\")\n";
								$dao .= "			{\n";
								$dao .= "				\$date".$nome_coluna." = DateTime::createFromFormat('Y-m-d H:i:s', \$row['".$colunas[$i]->getColuna()."']);\n";
								$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$date".$nome_coluna.");\n";
								$dao .= "			}\n";
							break;
							case "tabela":
								$nome_classe_dao = strtoupper(substr($colunas[$i]->getTipoTabela()->getTabela(),0,1)).substr($colunas[$i]->getTipoTabela()->getTabela(),1);
								$dao .= "			if(\$row['".$colunas[$i]->getColuna()."'] != \"\")\n";
								$dao .= "			{\n";
								$dao .= "				\$".$colunas[$i]->getColuna()."DAO = new ".$nome_classe_dao."DAO();\n";
								$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$".$colunas[$i]->getColuna()."DAO->buscar".$nome_classe_dao."(\$row['".$colunas[$i]->getColuna()."']));\n";
								$dao .= "			}\n";
								$dao .= "			else\n";
								$dao .= "			{\n";
								$dao .= "				\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(new ".$nome_classe_dao."());\n";
								$dao .= "			}\n";
							break;
							default:
										$dao .= "			\$".$_tabela_bd->getTabela()."->set".$nome_coluna."(\$row['".$colunas[$i]->getColuna()."']);\n";
						}
					}
							$dao .= "			array_push(\$lista_".$_tabela_bd->getTabela().", \$".$_tabela_bd->getTabela().");\n";
							$dao .= "		}\n";
							$dao .= "		return \$lista_".$_tabela_bd->getTabela().";\n";
							$dao .= "	}\n";
									
				}	
			}
			
			$dao .= "}";
			return $dao;
			
		}
	
}