<?php 
	
	function arvore_cheia($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$config = obter_configuracao();

			$result = $model->query("
				SELECT * FROM arvore 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			if ($result->rowCount() >= $config->matrix_arvore) {
				return true;
			}
			else{
				return false;
			}
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_proximo_id($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT * FROM arvore 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			$filhos = [];

			if (arvore_cheia($id)) {
				foreach ($result->fetchAll() as $dados) {
					$filhos[] = $dados->id_filho;
					if (!arvore_cheia($dados->id_filho)) {
						return $dados->id_filho;
					}
				}
				
				for ($i = 0; $i <= count($filhos); $i++) {
					$aux = obter_proximo_id($filhos[$i]);

					if ($aux != false and is_numeric($aux)) {
						return $aux;
					}
				}
		
				return false;
			}
			else{
				return $id;
			}
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function tem_filho($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT * FROM arvore 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			if ($result->rowCount() > 0) {
				return true;
			}
			else{
				return false;
			}
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function tem_descendencia_qualificada($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			if (tem_filho($id)) {
				$model = new Model();

				$result = $model->query("
					SELECT 
						id_pai, 
						id_filho, 
						a.nome_usuario AS nome_pai, 
						b.nome_usuario AS nome_filho, 
						a.sexo_usuario AS sexo_pai, 
						b.sexo_usuario AS sexo_filho 
					FROM arvore 
					INNER JOIN usuario a ON (arvore.id_pai = a.id_usuario) 
					INNER JOIN usuario b ON (arvore.id_filho = b.id_usuario) 
					WHERE 
						id_pai = :id
				", [
					":id" => $id
				]);

				$lista = $result->fetchAll();

				foreach ($lista as $dados) {
					if (qualificado($dados->id_filho)) {
						return true;
					}
					else if (tem_filho($dados->id_filho)) {
						$aux = tem_descendencia_qualificada($dados->id_filho);
						if ($aux == true) {
							return true;
						}
					}
				}
			}
			return false;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_json_arvore($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$json = [];

			$result = $model->query("
				SELECT 
					id_pai, 
					id_filho, 
					a.nome_usuario AS nome_pai, 
					b.nome_usuario AS nome_filho, 
					a.sexo_usuario AS sexo_pai, 
					b.sexo_usuario AS sexo_filho 
				FROM arvore 
				INNER JOIN usuario AS a ON (arvore.id_pai = a.id_usuario) 
				INNER JOIN usuario AS b ON (arvore.id_filho = b.id_usuario) 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			if ($result->rowCount() > 0) {
				$lista = $result->fetchAll();

				$json["id"] = $lista[0]->id_pai;
				$json["name"] = "<img src='".(($lista[0]->sexo_pai == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($lista[0]->nome_pai)."</span>";

				foreach ($lista as $dados) {
					if (tem_filho($dados->id_filho)) {
						$aux[] = obter_json_arvore($dados->id_filho);
					}
					else{
						$aux[] = ["id" => $dados->id_filho, "name" => "<img src='".(($dados->sexo_filho == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($dados->nome_filho)."</span>"];
					}
				}

				$json["children"] = $aux;
			}
			else{
				$result = $model->query("
					SELECT * FROM usuario 
					WHERE 
						id_usuario = :id
				", [
					":id" => $id
				]);

				$dados = $result->fetch();

				$json["id"] = $dados->id_usuario;
				$json["name"] = "<img src='".(($dados->sexo_usuario == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($dados->nome_usuario)."</span>";
			}

			return $json;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_json_pasta($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$json = [];

			$result = $model->query("
				SELECT 
					id_pai, 
					id_filho, 
					a.nome_usuario AS nome_pai, 
					b.nome_usuario AS nome_filho
				FROM arvore 
				INNER JOIN usuario AS a ON (arvore.id_pai = a.id_usuario) 
				INNER JOIN usuario AS b ON (arvore.id_filho = b.id_usuario) 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			if ($result->rowCount() > 0) {
				$lista = $result->fetchAll();

				$json["id"] = $lista[0]->id_pai;
				$json["name"] = $lista[0]->nome_pai;

				foreach ($lista as $dados) {
					if (tem_filho($dados->id_filho)) {
						$aux[] = obter_json_pasta($dados->id_filho);
					}
					else{
						$aux[] = [
							"id" => $dados->id_filho, 
							"name" => $dados->nome_filho
						];
					}
				}

				$json["children"] = $aux;
			}
			else{
				$result = $model->query("
					SELECT * FROM usuario WHERE id_usuario = :id
				", [
					":id" => $id
				]);

				$dados = $result->fetch();

				$json["id"] = $dados->id_usuario;
				$json["name"] = $dados->nome_usuario;
			}

			return $json;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_nivel($id, $count=0, $array=[]){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT id_filho FROM arvore WHERE id_pai = :id
			", [
				":id" => $id
			]);

			$lista = $result->fetchAll();

			$array[strval($count)] += 1;

			foreach ($lista as $dados) {
				if (tem_filho($dados->id_filho)) {
					$array = obter_nivel($dados->id_filho, $count+1, $array);
				}
				else{
					$array[strval($count+1)] += 1;
				}
			}

			return $array;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function qualificado($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT * FROM usuario 
				WHERE 
					id_usuario = :id AND 
					status_usuario = 'S'
			", [
				":id" => $id
			]);

			$usuario = $result->fetch();

			$result = $model->query("
				SELECT * FROM compra 
				WHERE 
					id_usuario = :id AND 
					status_compra = 'S' AND 
					datahora_compra BETWEEN :data_inicio AND :data_fim
			", [
				":id" => $id, 
				":data_inicio" => date("Y-m-01 00:00:00"), 
				":data_fim" => date("Y-m-t 23:59:59")
			]);

			$compras = $result->rowCount();

			$result = $model->query("
				SELECT * FROM usuario 
				WHERE 
					id_indicador = :id AND 
					status_usuario = 'S'
			", [
				":id" => $id
			]);

			$indicados = $result->rowCount();

			$result = $model->query("
				SELECT * FROM lancamento_compra 
				WHERE 
					id_usuario = :id AND 
					data_hora_lancamento_compra BETWEEN :data_inicio AND :data_fim
			", [
				":id" => $id, 
				":data_inicio" => date("Y-m-01 00:00:00"), 
				":data_fim" => date("Y-m-t 23:59:59")
			]);

			$lancamento_compra = $result->rowCount();

			$result = $model->query("SELECT * FROM configuracao");
			$config = $result->fetch();

			if ((($compras >= 1 or $lancamento_compra >= 1) and $indicados >= $config->num_indicado and $usuario->usuario_ativo == "S") or $usuario->id_tipo_usuario == 1) {
				return true;
			}
			else{
				return false;
			}
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function seu_plano($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					pl1.id_plano AS id_plano, 
					pl1.porcentagem_valor_plano AS porcentagem_valor_plano, 
					pl1.nome_plano AS nome_plano, 
					pl1.cor_plano AS cor_plano 
				FROM compra c1 
				INNER JOIN produto pr1 ON (c1.id_produto = pr1.id_produto) 
				INNER JOIN plano pl1 ON (pl1.id_plano = pr1.id_plano) 
				WHERE 
					c1.id_usuario = :id AND 
					status_compra = 'S' AND 
					pl1.porcentagem_valor_plano = (
						SELECT 
							MAX(pl2.porcentagem_valor_plano) 
						FROM compra c2 
						INNER JOIN produto pr2 ON (c2.id_produto = pr2.id_produto) 
						INNER JOIN plano pl2 ON (pl2.id_plano = pr2.id_plano) 
						WHERE 
							c2.id_usuario = :id
					) AND 
					datahora_compra BETWEEN :data_inicio AND :data_fim
			", [
				":id" => $id, 
				":data_inicio" => date("Y-m-01 00:00:00"), 
				":data_fim" => date("Y-m-t 23:59:59")
			]);

			$dados = $result->fetch();

			return (!empty($dados->id_plano)) ? [
				"id_plano" => $dados->id_plano, 
				"nome_plano" => $dados->nome_plano, 
				"porcentagem_valor_plano" => $dados->porcentagem_valor_plano, 
				"cor_plano" => $dados->cor_plano
			] : [];
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_arvore_comprimida($id, $count=0, $array=[]){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT id_filho FROM arvore WHERE id_pai = :id
			", [
				":id" => $id
			]);

			$lista = $result->fetchAll();

			if (qualificado($id)) {
				$array[strval($count)][] = [$id, seu_plano($id)["id_plano"]];
			}

			foreach ($lista as $dados) {
				if (tem_filho($dados->id_filho)) {
					if (qualificado($id)) {
						$array = obter_arvore_comprimida($dados->id_filho, $count+1, $array);
					}
					else{
						$array = obter_arvore_comprimida($dados->id_filho, $count, $array);
					}
				}
				else{
					if (qualificado($dados->id_filho)) {
						if (qualificado($id)) {
							$array[strval($count+1)][] = [$dados->id_filho, seu_plano($dados->id_filho)["id_plano"]];
						}
						else{
							$array[strval($count)][] = [$dados->id_filho, seu_plano($dados->id_filho)["id_plano"]];
						}
					}
				}
			}

			return $array;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_arvore_incomprimida($id, $count=0, $array=[]){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					id_filho 
				FROM arvore 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			$lista = $result->fetchAll();

			if (qualificado($id)) {
				$array[strval($count)][] = [$id, seu_plano($id)["id_plano"]];
			}
			
			if (count($array[strval($count)]) == 0) {
				$array[strval($count)][] = [0, 0];
			}
			
			foreach ($lista as $dados) {
				if (tem_filho($dados->id_filho)) {
					$array = obter_arvore_incomprimida($dados->id_filho, ($count+1), $array);
				}
				else{
					if (qualificado($dados->id_filho)) {
						$array[strval($count+1)][] = [$dados->id_filho, seu_plano($dados->id_filho)["id_plano"]];
					}
				}
			}

			return $array;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_json_arvore_comprimida($id, $json=[], $nivel=0){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					id_pai, 
					id_filho, 
					a.nome_usuario AS nome_pai, 
					b.nome_usuario AS nome_filho, 
					a.sexo_usuario AS sexo_pai, 
					b.sexo_usuario AS sexo_filho 
				FROM arvore 
				INNER JOIN usuario a ON (arvore.id_pai = a.id_usuario) 
				INNER JOIN usuario b ON (arvore.id_filho = b.id_usuario) 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			if ($result->rowCount() > 0) {
				$lista = $result->fetchAll();

				if (qualificado($id)) {
					$json["id"] = $lista[0]->id_pai;
					$json["name"] = "<div style='background-color: ".seu_plano($lista[0]->id_pai)["cor_plano"]."; width: 50px; height: 50px;'><img src='".(($lista[0]->sexo_pai == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($lista[0]->nome_pai)."</span></div>";
				}

				foreach ($lista as $dados) {
					if (tem_filho($dados->id_filho)) {
						$aux[] = obter_json_arvore_comprimida($dados->id_filho, $json);
					}
					else{
						if (qualificado($dados->id_filho)) {
							$aux[] = ["id" => $dados->id_filho, "name" => "<div style='background-color: ".seu_plano($dados->id_filho)["cor_plano"]."; width: 50px; height: 50px;'><img src='".(($dados->sexo_filho == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($dados->nome_filho)."</span></div>"];
							
						}
					}
				}

				$json["children"] = $aux;
			}
			else{
				if (qualificado($id)) {
					$result = $model->query("
						SELECT * FROM usuario 
						WHERE 
							id_usuario = :id
					", [
						":id" => $id
					]);

					$dados = $result->fetch();

					$json["id"] = $dados->id_usuario;
					$json["name"] = "<div style='background-color: ".seu_plano($dados->id_usuario)["cor_plano"]."; width: 50px; height: 50px;'><img src='".(($dados->sexo_usuario == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($dados->nome_usuario)."</span></div>";
				}
			}

			return $json;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_json_pasta_comprimida($id, $json=[], $nivel=0){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					id_pai, 
					id_filho, 
					pai.nome_usuario AS nome_pai, 
					filho.nome_usuario AS nome_filho
				FROM arvore 
				INNER JOIN usuario pai ON (arvore.id_pai = pai.id_usuario) 
				INNER JOIN usuario filho ON (arvore.id_filho = filho.id_usuario) 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			$aux = [];

			if ($result->rowCount() > 0) {
				$lista = $result->fetchAll();

				if (qualificado($id)) {
					$json["id"] = $lista[0]->id_pai;
					$json["name"] = $lista[0]->nome_pai;
					$json["color"] = seu_plano($lista[0]->id_pai)["cor_plano"];
				}

				foreach ($lista as $i) {
					if (tem_filho($i->id_filho)) {
						$x = obter_json_pasta_comprimida($i->id_filho);

						if (!empty($x)) {
							if (!empty($x[0])) {
								$aux[] = $x[0];
							}
							else{
								$aux[] = $x;
							}
						}
					}
					else{
						if (qualificado($i->id_filho)) {
							$aux[] = [
								"id" => $i->id_filho, 
								"name" => $i->nome_filho,
								"color" => seu_plano($i->id_filho)["cor_plano"]
							];
						}
					}
				}

				if (qualificado($id)) {
					$json["children"] = $aux;
				}
				else{
					$json = $aux;
				}
			}
			else {
				if (qualificado($id)) {
					$result = $model->query("
						SELECT * FROM usuario 
						WHERE 
							id_usuario = :id
					", [
						":id" => $id
					]);

					$i = $result->fetch();

					$json["id"] = $i->id_usuario;
					$json["name"] = $i->nome_usuario;
					$json["color"] = seu_plano($i->id_usuario)["cor_plano"];
				}
			}

			return $json;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_nivel_arvore_comprimida($id, $count=0, $array=[]){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					id_filho 
				FROM arvore 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			if (qualificado($id)) {
				$array[$count] += 1;
			}

			foreach ($result->fetchAll() as $i) {
				if (tem_filho($i->id_filho)) {
					if (qualificado($id)) {
						$array = obter_nivel_arvore_comprimida($i->id_filho, $count+1, $array);
					}
					else{
						$array = obter_nivel_arvore_comprimida($i->id_filho, $count, $array);
					}
				}
				else{
					if (qualificado($i->id_filho)) {
						if (qualificado($id)) {
							$array[$count+1] += 1;
						}
						else{
							$array[$count] += 1;
						}
					}
				}
			}

			return $array;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_json_arvore_incomprimida($id, $json=[]){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					id_pai, 
					id_filho, 
					a.nome_usuario AS nome_pai, 
					b.nome_usuario AS nome_filho, 
					a.sexo_usuario AS sexo_pai, 
					b.sexo_usuario AS sexo_filho 
				FROM arvore 
				INNER JOIN usuario a ON (arvore.id_pai = a.id_usuario) 
				INNER JOIN usuario b ON (arvore.id_filho = b.id_usuario) 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			if ($result->rowCount() > 0) {
				$lista = $result->fetchAll();

				if (qualificado($id)) {
					$json["id"] = $lista[0]->id_pai;
					$json["name"] = "<div style='background-color: ".seu_plano($lista[0]->id_pai)["cor_plano"]."; width: 50px; height: 50px;'><img src='".(($lista[0]->sexo_pai == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($lista[0]->nome_pai)."</span></div>";
				}
				else{
					$json["id"] = $lista[0]->id_pai;
					$json["name"] = "";
				}
				
				if (tem_descendencia_qualificada($id)) {
					foreach ($lista as $dados) {
						if (tem_filho($dados->id_filho)) {
							$aux[] = obter_json_arvore_incomprimida($dados->id_filho);
						}
						else{
							if (qualificado($dados->id_filho)) {
								$aux[] = ["id" => $dados->id_filho, "name" => "<div style='background-color: ".seu_plano($dados->id_filho)["cor_plano"]."; width: 50px; height: 50px;'><img src='".(($dados->sexo_filho == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($dados->nome_filho)."</span></div>"];
							}
						}
					}

					$json["children"] = $aux;	
				}
			}
			else{
				$result = $model->query("
					SELECT * FROM usuario WHERE id_usuario = :id
				", [
					":id" => $id
				]);

				$dados = $result->fetch();

				if (qualificado($id)) {
					$json["id"] = $dados->id_usuario;
					$json["name"] = "<div style='background-color: ".seu_plano($dados->id_usuario)["cor_plano"]."; width: 50px; height: 50px;'><img src='".(($dados->sexo_usuario == "M") ? show_link("/assets/img/user_icon_male.png") : show_link("/assets/img/user_icon_feminine.png"))."' width='50px' height='50px'><br><span>".first_name($dados->nome_usuario)."</span></div>";
				}
				else{
					$json["id"] = $dados->id_usuario;
					$json["name"] = "";
				}
			}

			return $json;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_json_pasta_incomprimida($id, $json=[]){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					id_pai, 
					id_filho, 
					a.nome_usuario AS nome_pai, 
					b.nome_usuario AS nome_filho
				FROM arvore 
				INNER JOIN usuario a ON (arvore.id_pai = a.id_usuario) 
				INNER JOIN usuario b ON (arvore.id_filho = b.id_usuario) 
				WHERE 
					id_pai = :id
			", [
				":id" => $id
			]);

			if ($result->rowCount() > 0) {
				$lista = $result->fetchAll();

				if (qualificado($id)) {
					$json["id"] = $lista[0]->id_pai;
					$json["name"] = $lista[0]->nome_pai;
					$json["color"] = seu_plano($lista[0]->id_pai)["cor_plano"];
				}
				else{
					$json["id"] = $lista[0]->id_pai;
					$json["name"] = "";
				}
				
				if (tem_descendencia_qualificada($id)) {
					foreach ($lista as $dados) {
						if (tem_filho($dados->id_filho)) {
							$aux[] = obter_json_pasta_incomprimida($dados->id_filho);
						}
						else{
							if (qualificado($dados->id_filho)) {
								$aux[] = [
									"id" => $dados->id_filho, 
									"name" => $dados->nome_filho,
									"color" => seu_plano($dados->id_filho)["cor_plano"]
								];
							}
						}
					}

					$json["children"] = $aux;	
				}
			}
			else{
				$result = $model->query("
					SELECT * FROM usuario WHERE id_usuario = :id
				", [
					":id" => $id
				]);

				$dados = $result->fetch();

				if (qualificado($id)) {
					$json["id"] = $dados->id_usuario;
					$json["name"] = $dados->nome_usuario;
					$json["color"] = seu_plano($dados->id_usuario)["cor_plano"];
				}
				else{
					$json["id"] = $dados->id_usuario;
					$json["name"] = "";
				}
			}

			return $json;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_nivel_arvore_incomprimida($id, $count=0, $array=[]){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT id_filho FROM arvore WHERE id_pai = :id
			", [
				":id" => $id
			]);

			$lista = $result->fetchAll();

			if (qualificado($id)) {
				$array[strval($count)] += 1;
			}

			foreach ($lista as $dados) {
				if (tem_filho($dados->id_filho)) {
					$array = obter_nivel_arvore_incomprimida($dados->id_filho, $count+1, $array);
				}
				else{
					if (qualificado($dados->id_filho)) {
						$array[strval($count+1)] += 1;
					}
				}
			}

			return $array;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_saldo($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					SUM(valor_entrada) AS valor_total 
				FROM entrada 
				WHERE 
					id_usuario = :id AND 
					status_entrada = 'S'
			", [
				":id" => $id
			]);

			$entrada = $result->fetch();

			$result = $model->query("
				SELECT 
					SUM(valor_saida) AS valor_total 
				FROM saida 
				WHERE 
					id_usuario = :id AND 
					status_saida = 'S'
			", [
				":id" => $id
			]);

			$saida = $result->fetch();

			return ($entrada->valor_total - $saida->valor_total);
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_configuracao(){
		import_file(DIR_MODELS."Model.class.php");

		$model = new Model();

		$result = $model->query("SELECT * FROM configuracao");

		return $result->fetch();
	}

	function ja_comprou($id){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id)) {
			$model = new Model();

			$result = $model->query("
				SELECT * FROM compra 
				WHERE 
					id_usuario = :id AND 
					status_compra = 'S'
			", [
				":id" => $id
			]);

			if ($result->rowCount() > 0) {
				return true;
			}
			else{
				return false;
			}
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_valor_por_nivel($id_usuario, $pos){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id_usuario)) {
			$model = new Model();

			$result = $model->query("
				SELECT
					TRUNCATE((IFNULL(total_1, 0) + IFNULL(total_2, 0)), 2) AS total
				FROM (
					SELECT 
						SUM((cp.valor_compra * (pl.porcentagem_valor_plano / 100)) * (nv.porcentagem_nivel / 100)) AS total_1,
						IFNULL((
							SELECT
								SUM(lcp.valor_rede * (nvl.porcentagem_nivel_loja / 100))
							FROM lancamento_compra lcp 
							INNER JOIN plano_loja pll ON (pll.id_plano_loja = lcp.id_plano_loja) 
							INNER JOIN nivel_loja nvl ON (nvl.id_plano_loja = pll.id_plano_loja) 
							WHERE 
								pll.status_plano_loja = 'S' AND 
								lcp.id_usuario = :id AND 
								nvl.nome_nivel_loja = :nome AND 
								lcp.data_hora_lancamento_compra BETWEEN :data_inicio AND :data_fim 
						), 0) AS total_2
					FROM produto pt
					INNER JOIN plano pl ON (pt.id_plano = pl.id_plano) 
					INNER JOIN nivel nv ON (nv.id_plano = pl.id_plano) 
					INNER JOIN compra cp ON (cp.id_produto = pt.id_produto) 
					WHERE 
						cp.id_usuario = :id AND  
						pl.status_plano = 'S' AND 
						cp.status_compra = 'S' AND 
						nv.nome_nivel = :nome  AND 
						cp.datahora_compra BETWEEN :data_inicio AND :data_fim 
				) tbv
			", [
				":id" => $id_usuario,
				":data_inicio" => date("Y-m-01 00:00:00"), 
				":data_fim" => date("Y-m-t 23:59:59"), 
				":nome" => "Nível ".$pos
			]);

			if ($result->rowCount() > 0) {
				$i = $result->fetch();

				return $i->total;
			}
			else{
				return 0;
			}
		}
		else{
			show_500("ID do plano inválido. Digite apenas números inteiros!");
		}
	}

	function obter_valor_total_por_nivel($id_usuario, $nivel){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id_usuario)) {
			$model = new Model();

			$result = $model->query("
				SELECT 
					SUM((cp.valor_compra * (pl.porcentagem_valor_plano / 100)) * (nv.porcentagem_nivel / 100)) AS total 
				FROM produto pt
				INNER JOIN plano pl ON (pt.id_plano = pl.id_plano) 
				INNER JOIN nivel nv ON (nv.id_plano = pl.id_plano) 
				INNER JOIN compra cp ON (cp.id_produto = pt.id_produto) 
				WHERE 
					cp.id_usuario = :id AND  
					pl.status_plano = 'S' AND 
					cp.status_compra = 'S' AND 
					nv.nome_nivel = :nome  AND 
					cp.datahora_compra BETWEEN :data_inicio AND :data_fim 
			", [
				":id" => $id_usuario, 
				":nome" => "Nível ".$nivel, 
				":data_inicio" => date("Y-m-01 00:00:00"), 
				":data_fim" => date("Y-m-t 23:59:59")
			]);
			
			if ($result->rowCount() > 0) {
				return floatval($result->fetch()->total);
			}
			else{
				return 0;
			}
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_valor_total_rede_loja(){
		import_file(DIR_MODELS."Model.class.php");

		$model = new Model();

		$total = $model->query("
			SELECT 
				SUM(a.valor_rede) AS total
			FROM lancamento_compra a
			INNER JOIN plano_loja b ON (a.id_plano_loja = b.id_plano_loja) 
			WHERE 
				b.status_plano_loja = 'S' AND 
				a.data_hora_lancamento_compra BETWEEN :data_inicio AND :data_fim
		", [
			":data_inicio" => date("Y-m-01 00:00:00"), 
			":data_fim" => date("Y-m-t 23:59:59")
		])->fetch()->total;

		return floatval($total);
	}

	function obter_valor_total_rede(){
		import_file(DIR_MODELS."Model.class.php");

		$model = new Model();

		$total = 0;

		$planos = $model->query("
			SELECT 
				id_plano 
			FROM plano 
			WHERE 
				status_plano = 'S' 
			ORDER BY 
				id_plano ASC
		");

		foreach ($planos->fetchAll() as $plano) {
			$result = $model->query("
				SELECT 
					pl1.id_plano AS id_plano, 
					c1.id_usuario AS id_usuario, 
					((pr1.valor_produto - (pr1.valor_produto * (pr1.porcentagem_desc_cliente/100))) * (pl1.porcentagem_valor_plano/100)) AS valor_plano 
				FROM compra c1 
				INNER JOIN produto pr1 ON (c1.id_produto = pr1.id_produto) 
				INNER JOIN plano pl1 ON (pl1.id_plano = pr1.id_plano) 
				WHERE 
					pl1.id_plano = :id AND 
					status_compra = 'S' AND 
					pl1.porcentagem_valor_plano = (
						SELECT 
							MAX(pl2.porcentagem_valor_plano) 
						FROM compra c2 
						INNER JOIN produto pr2 ON (c2.id_produto = pr2.id_produto) 
						INNER JOIN plano pl2 ON (pl2.id_plano = pr2.id_plano) 
						WHERE 
							pl2.id_plano = :id
					) AND 
					datahora_compra BETWEEN :data_inicio AND :data_fim
			", [
				":id" => $plano->id_plano, 
				":data_inicio" => date("Y-m-01 00:00:00"), 
				":data_fim" => date("Y-m-t 23:59:59")
			]);

			foreach ($result->fetchAll() as $dados) {
				$total += $dados->valor_plano;
			}
		}

		return $total;
	}

	function obter_valor_rede_usuario($id_usuario, $nivel){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id_usuario)) {
			$model = new Model();

			$result = $model->query("				
				SELECT 
					(cp.valor_compra * (pl.porcentagem_valor_plano / 100)) * (nv.porcentagem_nivel / 100) AS total, 
					(cp.valor_compra * (pl.porcentagem_valor_plano / 100)) AS valor_plano
				FROM produto pt
				INNER JOIN plano pl ON (pt.id_plano = pl.id_plano) 
				INNER JOIN nivel nv ON (nv.id_plano = pl.id_plano) 
				INNER JOIN compra cp ON (cp.id_produto = pt.id_produto) 
				WHERE 
					cp.id_usuario = :id AND  
					pl.status_plano = 'S' AND 
					cp.status_compra = 'S' AND 
					nv.nome_nivel = :nome  AND 
					cp.datahora_compra BETWEEN :data_inicio AND :data_fim 
				ORDER BY 
					valor_plano DESC
			", [
				":id" => $id_usuario, 
				":nome" => "Nível ".$nivel, 
				":data_inicio" => date("Y-m-01 00:00:00"), 
				":data_fim" => date("Y-m-t 23:59:59")
			]);
			
			$data = [];

			foreach ($result->fetchAll() as $i) {
				$data[] = [
					floatval($i->total),
					floatval($i->valor_plano)
				];
			}

			return $data;
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	function obter_valor_rede_loja_usuario($id_usuario, $nivel){
		import_file(DIR_MODELS."Model.class.php");

		if (is_numeric($id_usuario)) {
			$model = new Model();

			$total = $model->query("
				SELECT
					SUM(lcp.valor_rede * (nvl.porcentagem_nivel_loja / 100)) AS total
				FROM lancamento_compra lcp 
				INNER JOIN plano_loja pll ON (pll.id_plano_loja = lcp.id_plano_loja) 
				INNER JOIN nivel_loja nvl ON (nvl.id_plano_loja = pll.id_plano_loja) 
				WHERE 
					pll.status_plano_loja = 'S' AND 
					lcp.id_usuario = :id AND 
					nvl.nome_nivel_loja = :nome AND 
					lcp.data_hora_lancamento_compra BETWEEN :data_inicio AND :data_fim 
			", [
				":id" => $id_usuario, 
				":nome" => "Nível ".$nivel, 
				":data_inicio" => date("Y-m-01 00:00:00"), 
				":data_fim" => date("Y-m-t 23:59:59")
			])->fetch()->total;

			return floatval($total);
		}
		else{
			show_500("ID do usuário inválido. Digite apenas números inteiros!");
		}
	}

	// function obter_valor_previsto($id_usuario){
	// 	import_file(DIR_LIBRARIES."functions.php");

	// 	$config = obter_configuracao();
	// 	$total = 0;
	// 	$total_cashback = 0;

	// 	if (is_numeric($id_usuario)) {
	// 		if ($config->tipo_pagamento_rede == 1) {
	// 			if (qualificado($id_usuario)) {
	// 				$arvore = obter_arvore_comprimida($id_usuario);

	// 				if ($config->tipo_comissao_rede == 1) {
	// 					for ($i=1; $i <= count($arvore); $i++) {
	// 						for ($j=0; $j < count($arvore[$i]); $j++) {
	// 							$total += obter_valor_total_por_nivel($arvore[$i][$j][0], $i);
	// 						}
	// 					}
	// 				}
	// 				else{
	// 					for ($i=1; $i <= count($arvore); $i++) {
	// 						for ($j=0; $j < count($arvore[$i]); $j++) {
	// 							$result = obter_valor_rede_usuario($arvore[$i][$j][0], $i);
	// 							$total += $result[0][0];
	// 						}
	// 					}

	// 					$result = obter_valor_rede_usuario($id_usuario, 1);

	// 					for ($k=1; $k < count($result); $k++) {
	// 						$total += ($result[$k][1]/2);
	// 					}
	// 				}

	// 				for ($i=1; $i <= count($arvore); $i++) {
	// 					for ($j=0; $j < count($arvore[$i]); $j++) {
	// 						$total_cashback += obter_valor_rede_loja_usuario($arvore[$i][$j][0], $i);
	// 					}
	// 				}
	// 			}

	// 			return ($total + $total_cashback);
	// 		}
	// 		else{
	// 			if (qualificado($id_usuario)) {
	// 				$arvore = obter_arvore_incomprimida($id_usuario);

	// 				if ($config->tipo_comissao_rede == 1) {
	// 					for ($i=1; $i <= count($arvore); $i++) {
	// 						for ($j=0; $j < count($arvore[$i]); $j++) {
	// 							$total += obter_valor_total_por_nivel($arvore[$i][$j][0], $i);
	// 						}
	// 					}
	// 				}
	// 				else{
	// 					for ($i=1; $i <= count($arvore); $i++) {
	// 						for ($j=0; $j < count($arvore[$i]); $j++) {
	// 							$result = obter_valor_rede_usuario($arvore[$i][$j][0], $i);
	// 							$total += $result[0][0];
	// 						}
	// 					}

	// 					$result = obter_valor_rede_usuario($id_usuario, 1);

	// 					for ($k=1; $k < count($result); $k++) {
	// 						$total += ($result[$k][1]/2);
	// 					}
	// 				}

	// 				for ($i=1; $i <= count($arvore); $i++) {
	// 					for ($j=0; $j < count($arvore[$i]); $j++) {
	// 						$total_cashback += obter_valor_rede_loja_usuario($arvore[$i][$j][0], $i);
	// 					}
	// 				}
	// 			}

	// 			return ($total + $total_cashback);
	// 		}
	// 	}
	// 	else{
	// 		show_500("ID do usuário inválido. Digite apenas números inteiros!");
	// 	}
	// }

	function obter_valor_previsto($id_usuario){
		import_file(DIR_MODELS."Model.class.php");
		import_file(DIR_LIBRARIES."functions.php");

		$model = new Model();

		$config = obter_configuracao();

		$total_pago = 0;

		if ($config->tipo_pagamento_rede == 1) {			
			if (qualificado($id_usuario)) {
				$arvore = obter_arvore_comprimida($id_usuario);
				$total = 0;

				if ($config->tipo_comissao_rede == 1) {
					for ($i=1; $i <= count($arvore); $i++) {
						for ($j=0; $j < @count($arvore[$i]); $j++) {
							$total += obter_valor_total_por_nivel($arvore[$i][$j][0], $i);
						}
					}
				}
				else{
					for ($i=1; $i <= count($arvore); $i++) {
						for ($j=0; $j < count($arvore[$i]); $j++) {
							$total_cashback = 0;
							$result = obter_valor_rede_usuario($arvore[$i][$j][0], $i);

							$total += $result[0][0];

							for ($k=1; $k < count($result); $k++) {
								$total_cashback += ($result[$k][1]/2);
							}

							$total_pago += $total_cashback;	
						}
					}
				}

				$total_pago += $total;

				// Pagamento de Plano de Rede de compra de nas loja física
				$total_rede_loja = 0;

				for ($i=1; $i <= count($arvore); $i++) {
					for ($j=0; $j < @count($arvore[$i]); $j++) {
						$total_rede_loja += obter_valor_rede_loja_usuario($arvore[$i][$j][0], $i);
					}
				}
			}

			return ($total + $total_rede_loja);
			
		}
		else{
			if (qualificado($id_usuario)) {
				$arvore = obter_arvore_incomprimida($id_usuario);
				$total = 0;

				if ($config->tipo_comissao_rede == 1) {
					for ($i=1; $i <= count($arvore); $i++) {
						for ($j=0; $j < count($arvore[$i]); $j++) {
							$total += obter_valor_total_por_nivel($arvore[$i][$j][0], $i);
						}
					}
				}
				else{
					for ($i=1; $i <= count($arvore); $i++) {
						for ($j=0; $j < count($arvore[$i]); $j++) {
							$total_cashback = 0;
							$result = obter_valor_rede_usuario($arvore[$i][$j][0], $i);

							$total += $result[0][0];

							for ($k=1; $k < count($result); $k++) {
								$total_cashback += ($result[$k][1]/2);
							}

							$total_pago += $total_cashback;	
						}
					}
				}

				$total_pago += $total;

				// Pagamento de Plano de Rede de compra de nas loja física
				$total_rede_loja = 0;

				for ($i=1; $i <= count($arvore); $i++) {
					for ($j=0; $j < count($arvore[$i]); $j++) {
						$total_rede_loja += obter_valor_rede_loja_usuario($arvore[$i][$j][0], $i);
					}
				}

				return ($total + $total_rede_loja);
			}
		}
	}

	function encrypt_encode_url($string){
		$dictionary = [
			"1" => "Y",
			"2" => "N",
			"3" => "s",
			"4" => "q",
			"5" => "B",
			"6" => "8",
			"7" => "U",
			"8" => "l",
			"9" => "C",
			"0" => "f",
			"," => "j",
			"@" => "W"
		];

		$new_string = "";
		for ($i = 0; $i < strlen($string); $i++) {
			$new_string .= $dictionary[$string[$i]];
		}

		return $new_string;
	}

	function encrypt_decode_url($string){
		$dictionary = [
			"Y" => "1",
			"N" => "2",
			"s" => "3",
			"q" => "4",
			"B" => "5",
			"8" => "6",
			"U" => "7",
			"l" => "8",
			"C" => "9",
			"f" => "0",
			"j" => ",",
			"W" => "@"
		];

		$new_string = "";
		for ($i = 0; $i < strlen($string); $i++) {
			$new_string .= $dictionary[$string[$i]];
		}

		return $new_string;
	}
	
?>