<?php
include("Bi_agendamento_cargaController.php");
include("Bi_carga_dadosController.php");
if(isset($_GET["mod"]) and $_GET["mod"] == "agente_agendamento")
{
	session_write_close();//permite se chamar mais de uma vez pelo mesmo navagador sem retornar dados
	$listaBi_agendamento_carga = $bi_agendamento_cargaDAO->buscarFiltro(" where (executando = 0 or executando is null) and carga_dados in (select codigo from bi_carga_dados where ativo = 1)");
	$funcoes_bd = new Funcoes_bd();
	echo "Iniciando agendamentos <br>";
	
	foreach($listaBi_agendamento_carga as $agendamento_carga)
	{
		$dataAtual = new DateTime();
		if($agendamento_carga->getRecorrente() == "0" or $agendamento_carga->getRecorrente() == null)
		{
			$liberado = false;
			if($agendamento_carga->getUltima_execucao() instanceof DateTime)
			{
				if($agendamento_carga->getUltima_execucao()->format('Ymd') != $dataAtual->format('Ymd'))
				{
					$liberado = true;
				}
			}
			else
			{
				$liberado = true;
			}
			if($dataAtual->format("Hi") >= $agendamento_carga->getHora_execucao()->format("Hi") and $liberado)
			{
				//echo "Nao recorre ".$agendamento_carga->getHora_execucao()->format("H:i")." -";
				$funcoes_bd->executarSql("update bi_agendamento_carga set executando = 1 where codigo =".$agendamento_carga->getCodigo(), array());
				echo " --Executando ".$agendamento_carga->getCarga_dados()->getNome()."<br>";
				executar($agendamento_carga->getCodigo());
			}
		}
		else
		{
			if($agendamento_carga->getUltima_execucao() instanceof DateTime)
			{
				$diferencaDaUltilaExecParaAtualEmMinutos = 0;
				if($agendamento_carga->getUnidade_recorrencia()->getCodigo()=="1"/*horas*/)
				{
					$diferencaDaUltilaExecParaAtualEmMinutos = diferencaDataEmMinutos($dataAtual,$agendamento_carga->getUltima_execucao())/60;
				}
				elseif($agendamento_carga->getUnidade_recorrencia()->getCodigo()=="2"/*minutos*/)
				{
					$diferencaDaUltilaExecParaAtualEmMinutos = diferencaDataEmMinutos($dataAtual,$agendamento_carga->getUltima_execucao());
				}
				if($diferencaDaUltilaExecParaAtualEmMinutos >= $agendamento_carga->getValor_recorrencia())
				{
					//echo "Recorre ".$agendamento_carga->getUltima_execucao()->format("d/m/Y H:i")." ".$diferencaDaUltilaExecParaAtualEmMinutos." -";
					$funcoes_bd->executarSql("update bi_agendamento_carga set executando = 1 where codigo =".$agendamento_carga->getCodigo(), array());
					echo " --Executando ".$agendamento_carga->getCarga_dados()->getNome()."<br>";
					executar($agendamento_carga->getCodigo());
				}
			}
			else
			{
				//echo "Recorre  -";
				$funcoes_bd->executarSql("update bi_agendamento_carga set executando = 1 where codigo =".$agendamento_carga->getCodigo(), array());
				echo " --Executando ".$agendamento_carga->getCarga_dados()->getNome()."<br>";
				executar($agendamento_carga->getCodigo());
			}
		}
	}
	echo "Fim agendamentos <br>";
}
if(isset($_POST["mod"]) and $_POST["mod"] == "executar_agendamento")
{
	/*session_write_close();//permite se chamar mais de uma vez pelo mesmo navagador sem retornar dados
	$funcoes_bd = new Funcoes_bd();
	echo "codigo ".$_POST["codigo"];
	$codigo = $_POST["codigo"];
	$agendamento_carga= $bi_agendamento_cargaDAO->buscarBi_agendamento_carga($codigo);
	$funcoes_bd->executarSql("update bi_agendamento_carga set executando = 0, ultima_execucao = now() where codigo =".$codigo, array());
	echo " --Finalizou ".$agendamento_carga->getCarga_dados()->getNome()."<br>";*/
}
/*print_r($_POST);
print_r($_GET);
echo "aaa".$_POST["mod"];*/
function executar($codigo)
{	
	set_time_limit(0);
	$funcoes_bd = new Funcoes_bd();
	$bi_agendamento_cargaDAO = new Bi_agendamento_cargaDAO();
	//$bi_conexaoDAO = new Bi_conexaoDAO();
	$agendamento_carga= $bi_agendamento_cargaDAO->buscarBi_agendamento_carga($codigo);
	$bi_conexao = $agendamento_carga->getCarga_dados()->getConexao();//$bi_conexaoDAO->buscarBi_conexao($agendamento_carga->getCarga_dados()->getCone);
	if($bi_conexao->getBanco_dados()->getNome_interno() == "sqlsrv")
	{
		$conexaoAnalise = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":Server=".$bi_conexao->getHost().";Database=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha());//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
		$conexaoAnalise->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	}
	elseif($bi_conexao->getBanco_dados()->getNome_interno() == "mysql")
	{
		$conexaoAnalise = new PDO($bi_conexao->getBanco_dados()->getNome_interno().":host=".$bi_conexao->getHost().";dbname=".$bi_conexao->getDatabase_name(), $bi_conexao->getUsuario(), $bi_conexao->getSenha(),array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));//,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
	}
	$tabela = $agendamento_carga->getCarga_dados()->getTabela();
	$aTabela = explode(".", $tabela);
	$tabelaInterna = $aTabela[count($aTabela)-1];
	criarTabela($conexaoAnalise, $bi_conexao->getBanco_dados()->getNome_interno(), $tabelaInterna."_TEMP", $tabelaInterna);
	criarTabela($conexaoAnalise, $bi_conexao->getBanco_dados()->getNome_interno(), $tabelaInterna."", $tabelaInterna);
	$colunas = nomeColunas($conexaoAnalise, $bi_conexao->getBanco_dados()->getNome_interno(), $tabelaInterna);
	$funcoes_bd->executarSql("DELETE FROM ".$tabelaInterna."_TEMP", array());
	//echo $tabelaInterna;
	$rows = $conexaoAnalise->query( "select * from ".$tabela );
	$dtqInserts = 0;
	$insert = " insert into ".$tabelaInterna."_TEMP (dafault,".implode(",", $colunas).") values ";
	$values = "";
	foreach($rows as $row)
	{
		if($values != "") { $values .= ",";}
		$values .= "(0";
		foreach($colunas as $coluna)
		{
			if($row[$coluna] == "")
			{
				$values .= ",null";
			}
			else
			{
				$values .= ",'".str_replace("'","",$row[$coluna])."'";
			}
		}
		$values .= ")";
		$dtqInserts += 1;
		if($dtqInserts == 500)
		{
			//echo $insert;
			$funcoes_bd->executarSql($insert.$values, array());
			$dtqInserts = 0;
			$values = "";
		}
	}
	if($values != "")
	{
		$funcoes_bd->executarSql($insert.$values, array());
		$dtqInserts = 0;
		$values = "";
	}
	//echo $insert;
	$funcoes_bd->executarSql("DELETE FROM ".$tabelaInterna."", array());
	$funcoes_bd->executarSql("INSERT INTO ".$tabelaInterna." (".implode(",", $colunas).") SELECT ".implode(",", $colunas)." FROM ".$tabelaInterna."_TEMP", array());
	$funcoes_bd->executarSql("DROP TABLE ".$tabelaInterna."_TEMP", array());
	$funcoes_bd->executarSql("update bi_agendamento_carga set executando = 0, ultima_execucao = now() where codigo =".$codigo, array());
	echo " --Finalizou ".$agendamento_carga->getCarga_dados()->getNome()."<br>";
}
function criarTabela($conexaoAnalise, $sgbd, $nomeTabelaInterna, $nomeTabExterna)
{
	$script = " CREATE TABLE IF NOT EXISTS ".$nomeTabelaInterna. " ( ";
	if($sgbd == "sqlsrv")
	{
		$sql = "SELECT COLUMN_NAME, 
		DATA_TYPE, 
		case when DATA_TYPE = 'varchar' then concat('(',CHARACTER_MAXIMUM_LENGTH ,')')
			 when DATA_TYPE = 'float'	then concat('(',NUMERIC_PRECISION,',',NUMERIC_PRECISION_RADIX,')')
			 when DATA_TYPE = 'int' then concat('(',NUMERIC_PRECISION,')')
			 when NUMERIC_PRECISION is not null THEN concat('(',NUMERIC_PRECISION,')')
		end TAMANHO,
		IS_NULLABLE
		FROM INFORMATION_SCHEMA.COLUMNS
		WHERE TABLE_NAME = N'".$nomeTabExterna."' ";
		$rows = $conexaoAnalise->query( $sql );
		$script .= " dafault int(11) DEFAULT NULL ";
		foreach($rows as $row)
		{
			$script .= " ,".$row["COLUMN_NAME"] ." ".$row["DATA_TYPE"]."".$row["TAMANHO"]." NULL";
			//echo $row["cont"];
		}
	}
	$script .= ") ENGINE=MyISAM DEFAULT CHARSET=latin1 ";
	$funcoes_bd = new Funcoes_bd();
	//echo $script;
	$funcoes_bd->executarSql($script, array());
}
function nomeColunas($conexaoAnalise, $sgbd, $nomeTabExterna)
{
	$colunas = array();
	if($sgbd == "sqlsrv")
	{
		$sql = "SELECT COLUMN_NAME, 
		DATA_TYPE, 
		case when DATA_TYPE = 'varchar' then concat('(',CHARACTER_MAXIMUM_LENGTH ,')')
			 when DATA_TYPE = 'float'	then concat('(',NUMERIC_PRECISION,',',NUMERIC_PRECISION_RADIX,')')
			 when DATA_TYPE = 'int' then concat('(',NUMERIC_PRECISION,')')
			 when NUMERIC_PRECISION is not null THEN concat('(',NUMERIC_PRECISION,')')
		end TAMANHO,
		IS_NULLABLE
		FROM INFORMATION_SCHEMA.COLUMNS
		WHERE TABLE_NAME = N'".$nomeTabExterna."' ";
		$rows = $conexaoAnalise->query( $sql );
		foreach($rows as $row)
		{
			array_push($colunas, $row["COLUMN_NAME"]);
		}
	}
	return $colunas;
}
function chamarExecutor($codigo)
{
	$url =  "http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
	$url_executar = str_replace("?mod=agente","?mod=executar",$url)."&codigo=".$codigo."";
	$url_executar = explode("?", $url_executar)[0]."?" .http_build_query(['mod'=>"executar", 'codigo'=>$codigo]);
	echo $url_executar;
	$url =  $url_executar;
	$myvars = 'mod=executar' . '&codigo=' . $codigo;
	$data = array('mod' => 'executar', 'codigo' =>  $codigo);

	$ch = curl_init( $url );
	curl_setopt( $ch, CURLOPT_POST, false);
	curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt( $ch, CURLOPT_HEADER, false);
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
	curl_setopt($ch, CURLOPT_NOBODY, 0);
	curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0');
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 
	curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

	$headers = array(
	  "Content-Type: application/x-www-form-urlencoded",
	);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
	$response = curl_exec( $ch );
	$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	echo $code ;
	echo 	$response;	
		// set post fields
			/*$post = [
				'mod' => 'executar',
				'codigo' => $codigo
			];

			$ch = curl_init($url_executar);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

			// execute!
			$response = curl_exec($ch);

			// close the connection, release resources used
			curl_close($ch);

			// do anything you want with your response
			var_dump($response);*/
}

//diferencaDataEmMinutos('19/10/2016 22:30','19/10/2016 00:00');
function diferencaDataEmMinutos($data1,$data2)// em minutos
{
	//echo "data1 ".$data1." strtotime ".strtotime($this->converteDataBRemDataUSA($data1)). " data2 ".$data2)." strtotime ". strtotime($this->converteDataBRemDataUSA($data2)) . " / 3600 <br>"
	//return round((strtotime($this->converteDataBRemDataUSA($data1)) - strtotime($this->converteDataBRemDataUSA($data2)))/ (60 * 60),2);
	//16/02/2022 removido o arredondamento
	return (strtotime($data1->format("Y-m-d H:i:s")) - strtotime($data2->format("Y-m-d H:i:s")))/ (60);
}