<?php
if(file_exists("../../config/config_dir_raiz.php"))
{	
	require_once("../../config/config_dir_raiz.php");
}
else
{
	require_once("config/config_dir_raiz.php");
}
$config = new Config();
require_once($config->diretorio_raiz()."/src/controller/Funcoes_bd.php");
class ColunaAnalise
{
	public $nome;
	public $totaliza = false;
	public $media = false;
	public $campos_quebar_parcial = array();
}
class ConfigAnalise
{
	public $tipo_charts;
	public $usar_charts = false;
	public $nome;
	public $codigo;
	public $coluna_analise_vertical;
}
class InputgAnalise
{
	public $tipo;
	public $id ;
	public $label ;
	public $obrigatorio ;
	public $dadosEscolher = array();
}
class BiDAO
{
	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();
	}
	function monta_filtro($codigo)//, $nomeForm, $seletor)
	{	
	
		//configs analise
		$configAnalise = new ConfigAnalise();
		$sql = "select b.codigo, b.nome, b.coluna_analise_vertical from bi_analise b
		where b.codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$configAnalise->nome = $row["nome"];
			$configAnalise->codigo = $row["codigo"];
			$configAnalise->coluna_analise_vertical = $row["coluna_analise_vertical"];
		}
		$sql = "select tipo_js, b.codigo from bi_analise b
		join bi_tipo_grafico g on g.codigo = b.grafico
		where b.codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$configAnalise->tipo_charts = $row["tipo_js"];
			$configAnalise->usar_charts = true;
		}
		$jSonRetorno["config"] = $configAnalise;
		$jSonRetorno["input_form"] = array();
		$sql = "select f.id, f.descricao, t.tipo, f.obrigatorio, f.analise, f.tabela_buscar, f.coluna_buscar 
		from bi_analise a
		join bi_filtro f on f.analise = a.codigo
		join bi_tipo_dado t on t.codigo = f.tipo
		where f.analise = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$inputgAnalise = new InputgAnalise();
			$inputgAnalise->tipo = $row["tipo"];
			$inputgAnalise->id = $row["id"];
			$inputgAnalise->label = $row["descricao"];
			if($row["obrigatorio"] == "1")
			{
				$inputgAnalise->obrigatorio = true;
			}
			if($row["tipo"] == "múltipla escolha")
			{
				$sqlMultiplaEscolha = "select ".$row["coluna_buscar"]." from ".$row["tabela_buscar"]." 
				group by ".$row["coluna_buscar"]." 
				order by ".$row["coluna_buscar"]."";
				$rowsMult = $this->conexao->query($sqlMultiplaEscolha);
				foreach($rowsMult as $rowMult){
					array_push($inputgAnalise->dadosEscolher, $rowMult[$row["coluna_buscar"]]);
				}
			}
			array_push($jSonRetorno["input_form"], $inputgAnalise);
		}
		echo json_encode($jSonRetorno);
		exit();
		//antigo
		$sql = "select f.id, f.descricao, t.tipo, f.obrigatorio, f.analise 
		from bi_analise a
		join bi_filtro f on f.analise = a.codigo
		join bi_tipo_dado t on t.codigo = f.tipo
		where f.analise = ".$codigo;
		$rows = $this->conexao->query($sql);
		echo '<form  action=\'src/controller/Bi_analiseControllerUser.php?mod=executar&analise='.$codigo.'&seletor='.$seletor.'\' id="'.$nomeForm.'" class="form_filtro">';
		foreach($rows as $row){
			$tipoInput = "text";
			$atributos = "";
			$class = "form ";
			$labelObrigatorio = "";
			if($row["tipo"] == "data")
			{
				$atributos .= "data-mask='00/00/0000' placeholder='00/00/0000' ";
				$class = "form mask";
			}
			elseif($row["tipo"] == "data hora minuto")
			{
				$atributos .= "data-mask='00/00/0000 00:00' placeholder='00/00/0000 00:00' ";
				$class = "form mask";
			}
			elseif($row["tipo"] == "número inteiro")
			{
				$tipoInput = "number";
				$atributos .= "data-mask='0000000000000000000' placeholder='000' ";
				$class = "form mask";
			}
			elseif($row["tipo"] == "número decimal")
			{
				$atributos .= "data-mask='000.000.000.000.000,00' placeholder='000,00' data-mask-reverse='true' ";
				$class = "form mask";
			}
			
			if($row["obrigatorio"] == "1")
			{
				$atributos .= "required ";
				$labelObrigatorio = '<span class="form_obrigatorio">*</span>';
			}
			echo "
			<div class='filtroForm' >
				<label>".$labelObrigatorio.$row["descricao"]."</label> <br>
				<input id='".$row["id"]."' name='".$row["id"]."' tipo='".$row["tipo"]."' ".$atributos." class='".$class."' />
			</div>
			
			";
		}
		echo "<button type=\"button\" class=\"btnSuccess btnSn\"   onclick=\" if(montaTebelaBi('".$nomeForm."','".$seletor."')) { $('#btn_fechar_filtrobi_analise').prop('disabled',false); $('#btn_fechar_filtrobi_analise').click(); }\">Filtrar </button>
		</form>";
		echo '<script src="js/formulario.js"></script>';
		return array();
	}
	function monta_analise($codigo, $post)
	{	
		$camposTotalizar = array();
		$camposMedia = array();
		$totalizador = array();
		$media = array();
		//$camposTotalizarComQuebra  = array(array());
		//$camposMediaComQuebra  = array();
		$camposComQuebraValorAnt = array();
		$somaParcal = array(array());
		$qtdLinhasParcal = array(array());
		/*//totlaizador por quebra
		$sql = "select * from bi_analise b
		join bi_totalizar_por_quebra_linha c on c.analise = b.codigo
		where b.codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			//$sql = $row["query"];
			//echo $row["coluna_quebra"]."-";
			$camposComQuebraValorAnt[$row["coluna_quebra"]] = null;
			$qtdLinhasParcal[$row["coluna_quebra"]][$row["coluna_totalizar"]] = 0;
			if($row["totalizar"] == "1")
			{	
				if(!isset($camposTotalizarComQuebra[$row["coluna_quebra"]]))
				{
					$camposTotalizarComQuebra[$row["coluna_quebra"]] = array();
				}
				array_push($camposTotalizarComQuebra[$row["coluna_quebra"]], $row["coluna_totalizar"]);
				$somaParcal[$row["coluna_quebra"]][$row["coluna_totalizar"]] = 0;
			}	
			if($row["media"] == "1")
			{	
				if(!isset($camposMediaComQuebra[$row["coluna_quebra"]]))
				{
					$camposMediaComQuebra[$row["coluna_quebra"]] = array();
				}
				array_push($camposMediaComQuebra[$row["coluna_quebra"]], $row["coluna_totalizar"]);
				$somaParcal[$row["coluna_quebra"]][$row["coluna_totalizar"]] = 0;
			}
		}*/
		//totalizador geral
		$sql = "select * from bi_analise b
		join bi_colunas_totalizar c on c.analise = b.codigo
		where b.codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			//$sql = $row["query"];
			if($row["totalizar"] == "1")
			{	
				array_push($camposTotalizar, array($row["nome_coluna"], $row["colunas_quebra"]));
			}	
			if($row["media"] == "1")
			{	
				array_push($camposMedia, array($row["nome_coluna"], $row["colunas_quebra"]));
			}
		}
		
		$configAnalise = new ConfigAnalise();
		//configs analise
		$sql = "select b.codigo, b.nome, b.coluna_analise_vertical from bi_analise b
		where b.codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$configAnalise->nome = $row["nome"];
			$configAnalise->codigo = $row["codigo"];
			$configAnalise->coluna_analise_vertical = $row["coluna_analise_vertical"];
		}
		$sql = "select tipo_js, b.codigo from bi_analise b
		join bi_tipo_grafico g on g.codigo = b.grafico
		where b.codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$configAnalise->tipo_charts = $row["tipo_js"];
			$configAnalise->usar_charts = true;
		}
		$jSonRetorno["config"] = $configAnalise;
		
		//ober sql
		$sql = "select * from bi_analise where codigo = ".$codigo;
		$rows = $this->conexao->query($sql);
		foreach($rows as $row){
			$sql = $row["query"];
		}
		//monta filtros
		$aFiltro = explode("#", $sql);
		for($i = 1; $i < count($aFiltro)-1; $i+=2 )
		{
			if(isset($aFiltro[$i]) )
			{
				//echo "-".$aFiltro[$i]."-";
				if(! isset($post[$aFiltro[$i]]))
				{
					$sql = str_replace("IN","in", $sql);
					$sql = str_replace("In","in", $sql);
					$sql = str_replace("iN","in", $sql);
					$sql = str_replace("( ","(", $sql);
					$sql = str_replace(") ",")", $sql);
					$sql = str_replace("in (#".$aFiltro[$i]."#)", "not in (-999)", $sql);
				}
				elseif( is_array($post[$aFiltro[$i]]))//filtro in array
				{
					$in ="";
					foreach($post[$aFiltro[$i]] as $value){
						if($in != "")
						{
							$in .= ",";	
						}
						$in .= "'".$value."'";
					}
					//echo count($post[$aFiltro[$i]])." ".$post[$aFiltro[$i]]."<Br>";
					$sql = str_replace("#".$aFiltro[$i]."#", $in, $sql);
				}
				else
				{
					$sql = str_replace("#".$aFiltro[$i]."#", $post[$aFiltro[$i]], $sql);
				}
			}
		}
		
		//echo "<br>".$sql;
		//$sql = "select * from e-commerce.produto";
		//$rows = $this->conexao->query($sql);
		//cria tabela
		echo '<meta charset="UTF-8">';
		//ajusta análise vertical 
		$sqlColunaVertical  = "SELECT ".$configAnalise->coluna_analise_vertical. " COLUNA ".
		" FROM (".$sql.") COLUNAS_VERTICAL GROUP BY ".
		$configAnalise->coluna_analise_vertical;
		echo $sqlColunaVertical." <Br><br>";
		$stmt = $this->conexao->prepare( $sqlColunaVertical );
		$result = $stmt->execute();
		$rows = $stmt->fetchAll();
		$totalLinhasBanco = $stmt->rowCount();
		$colunasInfo = "`DEC`,EMISSAO";
		$aColunasInfo = explode(",", $colunasInfo);
		$colunasValores = "VLR_TOT,M3,VLR_LIQ";
		$aColunaValores = explode(",", $colunasValores);
		$montaColunaGeral = "";
		$colunasTemp = array();
		foreach($rows as $row){
			foreach($aColunaValores as $colunaVal)
			{
				if($montaColunaGeral != "")
				{
					$montaColunaGeral .= ", ";
				}
				$montaColunaGeral .= "sum(".$row["COLUNA"]."_".$colunaVal.")";
			}
			array_push($colunasTemp, $row["COLUNA"]);
		}
		$montaUnions = "";
		foreach($colunasTemp as $col){
			if($montaUnions != "")
			{
				$montaUnions .= " UNION ";
			}
			$montaUnions .= "SELECT ".$colunasInfo.", ";
			foreach($aColunaValores as $colunaVal)
			{
				$montaUnions .= $colunaVal." ".$col."_".$colunaVal.", ";
			}
			foreach($colunasTemp as $col2){
				if($col2 != $col)
				{
					foreach($aColunaValores as $colunaVal)
					{
						$montaUnions .= "0 ".$col2."_".$colunaVal.",  ";
					}
				}
			}
			$montaUnions .= " 0 TEMP ";
			$montaUnions .= " FROM (".$sql.") VERTICAL ";
		}
		$montaColunaGeral = "SELECT ".$colunasInfo.",".$montaColunaGeral . 
		" FROM (".$montaUnions.") VERTICAL GROUP BY ".$colunasInfo;
		echo $montaColunaGeral;
		//echo "<br>".$sql;
		//$sql = "select * from e-commerce.produto";
		//$rows = $this->conexao->query($sql);
		//cria tabela
		$stmt = $this->conexao->prepare( $sql );
		$result = $stmt->execute();
		$dados = $stmt->fetch(PDO::FETCH_ASSOC);
		$jSonRetorno = array();
		$jSonRetorno["colunas"] = array();
		$jSonRetorno["dados"] = array();
		$jSonRetorno["config"] = array();
		$entrou = false;
		//melgorar essa parte no desempenho
		
		$rows = $stmt->fetchAll();
		foreach($rows as $row){
			$entrou = true;
			break;
		}
		if(! $entrou)
		{
			$colunaAnalise = new ColunaAnalise();
			$colunaAnalise->nome = "Sem dados";
			array_push($jSonRetorno["colunas"], $colunaAnalise);
			//$colunaAnalise = new ColunaAnalise();
			//$colunaAnalise->nome = "";
			//array_push($jSonRetorno["colunas"], $colunaAnalise);
			array_push($jSonRetorno["dados"], array(0) );
			echo json_encode($jSonRetorno);	
			exit();
		}
		
		$columns = array_keys($dados);
		
		foreach($columns as $coluna)
		{
			$colunaAnalise = new ColunaAnalise();
			$colunaAnalise->nome = $coluna;
			//iniciar somadores
			if(in_array_indice($camposTotalizar, $coluna, 0)) //0 procurar na primeira coluna
			{
				$colunaAnalise->totaliza = true;
				$colunaAnalise->campos_quebar_parcial = criar_colunas_quebra_parcial($camposTotalizar, $coluna);
			}
			if(in_array_indice($camposMedia, $coluna, 0))
			{
				$colunaAnalise->media = true;
				$colunaAnalise->campos_quebar_parcial = criar_colunas_quebra_parcial($camposTotalizar, $coluna);
			}
			array_push($jSonRetorno["colunas"], $colunaAnalise);
		}
		
		$result = $stmt->execute();
		$rows = $stmt->fetchAll();
		$totalLinhasBanco = $stmt->rowCount();
		foreach($rows as $row){
			
			$linhas = array();
			foreach($columns as $coluna)
			{
				array_push($linhas, $row[$coluna]);
			}
			array_push($jSonRetorno["dados"], $linhas );
		}
		
		echo json_encode($jSonRetorno);	
		
		//////////////////////////////////////////////////
		
	}
	
}

function in_array_indice($array, $valor_procurar, $indice_procurar)
{
	foreach($array as $colunas)
	{
		if($colunas[$indice_procurar] == $valor_procurar)
		{
			return true;
		}
	}
	return false;
}

function criar_colunas_quebra_parcial($array, $valor_procurar)
{
	foreach($array as $colunas)
	{
		if($colunas[0] == $valor_procurar)
		{
			return explode(",", $colunas[1]);
		}
	}
	return array();
}