<?php 

	header("access-control-allow-origin: https://pagseguro.uol.com.br");

	if (isset($_POST["notificationType"]) and $_POST["notificationType"] == "transaction") {
		import_file(DIR_MODELS."Model.class.php");
		import_file(DIR_LIBRARIES."functions.php");
		import_file(DIR_LIBRARIES."PagSeguro/PagSeguro.class.php");

		$code = filter_input(INPUT_POST, "notificationCode", FILTER_SANITIZE_STRING);
		$id_compra = encrypt_decode(filter_input(INPUT_GET, "compra", FILTER_SANITIZE_STRING));
		$id_compras = explode(",", encrypt_decode(filter_input(INPUT_GET, "compras", FILTER_SANITIZE_STRING)));

		$model = new Model();

		$config = obter_configuracao();

		if ($config->ambiente_teste_pagseguro == "S") {
			$pagseguro = new PagSeguro(false);
		}
		else{
			$pagseguro = new PagSeguro(true);
		}

		$pagseguro->setEmail($config->email_pagseguro);
		$pagseguro->setToken($config->token_pagseguro);

		$notification = $pagseguro->getNotification($code);

		if (intval($notification->status) == 3 or intval($notification->status) == 4) {
			if (!empty($id_compra)) {
				$result = $model->query("
					SELECT 
						usuario.id_indicador AS id_indicador, 
						compra.id_usuario AS id_usuario, 
						plano.porcentagem_valor_plano, 
						plano.porcentagem_comissao_plano, 
						produto.id_produto, 
						produto.valor_produto, 
						produto.id_usuario AS id_usuario_empresa, 
						produto.porcentagem_desc_empresa AS empresa, 
						produto.porcentagem_desc_cliente AS cliente, 
						produto.porcentagem_cashback AS cashback 
					FROM compra 
					INNER JOIN usuario ON (compra.id_usuario = usuario.id_usuario) 
					INNER JOIN produto ON (produto.id_produto = compra.id_produto) 
					INNER JOIN plano ON (plano.id_plano = produto.id_plano) 
					WHERE 
						id_compra = :id
				", [
					":id" => $id_compra
				]);

				$data = $result->fetch();

				$comissao = 0;

				if ($config->comissao_indicacao == "S" and ((ja_comprou($data->id_usuario) == false and $config->tipo_comissao == "P") or $config->tipo_comissao == "T")) {
					$comissao = $data->valor_produto * pct($data->porcentagem_comissao_plano);

					// Cadastra a comissão de venda
					$result = $model->insert("entrada", [
						"id_usuario" => $data->id_indicador,
						"valor_entrada" => $comissao,
						"descricao_entrada" => "Pagamento de Comissão de Venda do Usuário de ID: ".$data->id_usuario,
						"datahora_entrada" => date("Y-m-d H:i:s"),
						"status_entrada" => "S"
					]);

					if ($result == 0) {
						$model->rollback();
						exit();
					}
				}

				$teve_comissao = ($comissao > 0) ? "S" : "N";

				$lucro_empresa = ($data->valor_produto * pct($data->empresa));

				$cashback = !empty($data->cashback) ? (($data->valor_produto - ($data->valor_produto * pct($data->cliente))) * pct($data->cashback)) : 0;

				if (!empty($data->cashback)) {
					// Cadastra de Cashback da Compra
					if ($result == 0) {
						$model->rollback();
						echo json_encode(["status" => false]);
						exit();
					}

					$result = $model->insert("entrada", [
						"id_usuario" => $data->id_usuario,
						"valor_entrada" => $cashback,
						"descricao_entrada" => "Recebimento de Cashback da compra do produto de ID: ".$data->id_produto,
						"datahora_entrada" => date("Y-m-d H:i:s"),
						"status_entrada" => "S"
					]);

					if ($result == 0) {
						$model->rollback();
						echo json_encode(["status" => false]);
						exit();
					}
				}

				$valor_empresa = $data->valor_produto - ($data->valor_produto * pct($data->empresa));

				$result = $model->insert("entrada", [
					"id_usuario" => $data->id_usuario_empresa,
					"valor_entrada" => $valor_empresa,
					"descricao_entrada" => "Pagamento do Valor do Produto para a Empresa",
					"datahora_entrada" => date("Y-m-d H:i:s"),
					"status_entrada" => "S"
				]);

				if ($result > 0) {
					// Gera o histórico da entrada
					$last_query = $model->lastQuery();
					$model->insert("historico", [
						"comando_sql" => $last_query,
						"datahora_acao" => date("Y-m-d H:i:s"),
						"id_usuario" => Session::get("id_usuario")
					]);

					$taxa_pagamento = round(((($data->valor_produto - ($data->valor_produto * pct($data->cliente))) * PAYMENT_RATE) + 0.40), 2);

					$lucro_empresa -= (($data->valor_produto - ($data->valor_produto * pct($data->cliente))) * pct($data->porcentagem_valor_plano));
					$lucro_empresa -= $comissao;
					$lucro_empresa -= $cashback;
					$lucro_empresa -= $taxa_pagamento;
					$lucro_empresa -= ($data->valor_produto * pct($data->cliente));

					$result = $model->insert("distribuicao", [
						"id_compra" => $id_compra,
						"lucro_empresa" => $lucro_empresa,
						"valor_real_produto" => $valor_empresa,
						"taxa_pagamento" => $taxa_pagamento,
						"teve_comissao" => $teve_comissao,
						"comissao_produto" => $comissao,
						"valor_cashback" => $cashback,
						"valor_rede" => (($data->valor_produto - ($data->valor_produto * pct($data->cliente))) * pct($data->porcentagem_valor_plano))
					]);

					if ($result > 0) {
						// Lucro da Empresa 
						$result = $model->insert("entrada", [
							"id_usuario" => 1,
							"valor_entrada" => $lucro_empresa,
							"descricao_entrada" => "Lucro de Venda do Produto: ".$data->id_produto,
							"datahora_entrada" => date("Y-m-d H:i:s"),
							"status_entrada" => "S"
						]);

						if ($result > 0) {
							// Gera o histórico da distribuicao
							$last_query = $model->lastQuery();
							$model->insert("historico", [
								"comando_sql" => $last_query,
								"datahora_acao" => date("Y-m-d H:i:s"),
								"id_usuario" => Session::get("id_usuario")
							]);

							$model->update("compra", [
								"codigo_transacao" => $notification->code,
								"status_compra" => "S"
							], [
								"id_compra" => $id_compra
							]);

							$model->commit();
						}
						else{
							$model->rollback();
						}
					}
					else{
						$model->rollback();
					}
				}
				else{
					$model->rollback();
				}
			}
			else{
				for ($i=0; $i < count($id_compras); $i++) { 
					$result = $model->query("
						SELECT 
							usuario.id_indicador AS id_indicador, 
							compra.id_usuario AS id_usuario, 
							plano.porcentagem_valor_plano, 
							plano.porcentagem_comissao_plano, 
							produto.id_produto, 
							produto.valor_produto, 
							produto.id_usuario AS id_usuario_empresa, 
							produto.porcentagem_desc_empresa AS empresa, 
							produto.porcentagem_desc_cliente AS cliente, 
							produto.porcentagem_cashback AS cashback 
						FROM compra 
						INNER JOIN usuario ON (compra.id_usuario = usuario.id_usuario) 
						INNER JOIN produto ON (produto.id_produto = compra.id_produto) 
						INNER JOIN plano ON (plano.id_plano = produto.id_plano) 
						WHERE 
							id_compra = :id
					", [
						":id" => $id_compras[$i]
					]);

					$data = $result->fetch();

					$comissao = 0;

					if ($config->comissao_indicacao == "S" and ((ja_comprou($data->id_usuario) == false and $config->tipo_comissao == "P") or $config->tipo_comissao == "T")) {
						$comissao = $data->valor_produto * pct($data->porcentagem_comissao_plano);

						// Cadastra a comissão de venda
						$result = $model->insert("entrada", [
							"id_usuario" => $data->id_indicador,
							"valor_entrada" => $comissao,
							"descricao_entrada" => "Pagamento de Comissão de Venda do Usuário de ID: ".$data->id_usuario,
							"datahora_entrada" => date("Y-m-d H:i:s"),
							"status_entrada" => "S"
						]);

						if ($result == 0) {
							$model->rollback();
							exit();
						}
					}

					$teve_comissao = ($comissao > 0) ? "S" : "N";

					$lucro_empresa = ($data->valor_produto * pct($data->empresa));

					$cashback = !empty($data->cashback) ? (($data->valor_produto - ($data->valor_produto * pct($data->cliente))) * pct($data->cashback)) : 0;

					if (!empty($data->cashback)) {
						// Cadastra de Cashback da Compra
						$result = $model->insert("entrada", [
							"id_usuario" => $data->id_usuario,
							"valor_entrada" => $cashback,
							"descricao_entrada" => "Recebimento de Cashback da compra do produto de ID: ".$data->id_produto,
							"datahora_entrada" => date("Y-m-d H:i:s"),
							"status_entrada" => "S"
						]);

						if ($result == 0) {
							$model->rollback();
							echo json_encode(["status" => false]);
							exit();
						}
					}

					$valor_empresa = $data->valor_produto - ($data->valor_produto * pct($data->empresa));

					$result = $model->insert("entrada", [
						"id_usuario" => $data->id_usuario_empresa,
						"valor_entrada" => $valor_empresa,
						"descricao_entrada" => "Pagamento do Valor do Produto para a Empresa",
						"datahora_entrada" => date("Y-m-d H:i:s"),
						"status_entrada" => "S"
					]);

					if ($result > 0) {
						// Gera o histórico da entrada
						$last_query = $model->lastQuery();
						$model->insert("historico", [
							"comando_sql" => $last_query,
							"datahora_acao" => date("Y-m-d H:i:s"),
							"id_usuario" => Session::get("id_usuario")
						]);

						$taxa_pagamento = round(((($data->valor_produto - ($data->valor_produto * pct($data->cliente))) * PAYMENT_RATE) + 0.40), 2);

						$lucro_empresa -= (($data->valor_produto - ($data->valor_produto * pct($data->cliente))) * pct($data->porcentagem_valor_plano));
						$lucro_empresa -= $comissao;
						$lucro_empresa -= $cashback;
						$lucro_empresa -= $taxa_pagamento;
						$lucro_empresa -= ($data->valor_produto * pct($data->cliente));

						$result = $model->insert("distribuicao", [
							"id_compra" => $id_compras[$i],
							"lucro_empresa" => $lucro_empresa,
							"valor_real_produto" => $valor_empresa,
							"taxa_pagamento" => $taxa_pagamento,
							"teve_comissao" => $teve_comissao,
							"comissao_produto" => $comissao,
							"valor_cashback" => $cashback,
							"valor_rede" => (($data->valor_produto - ($data->valor_produto * pct($data->cliente))) * pct($data->porcentagem_valor_plano))
						]);

						if ($result > 0) {
							// Lucro da Empresa 
							$result = $model->insert("entrada", [
								"id_usuario" => 1,
								"valor_entrada" => $lucro_empresa,
								"descricao_entrada" => "Lucro de Venda do Produto: ".$data->id_produto,
								"datahora_entrada" => date("Y-m-d H:i:s"),
								"status_entrada" => "S"
							]);

							if ($result > 0) {
								// Gera o histórico da distribuicao
								$last_query = $model->lastQuery();
								$model->insert("historico", [
									"comando_sql" => $last_query,
									"datahora_acao" => date("Y-m-d H:i:s"),
									"id_usuario" => Session::get("id_usuario")
								]);

								if ($result > 0) {
									$model->update("compra", [
										"codigo_transacao" => $notification->code,
										"status_compra" => "S"
									], [
										"id_compra" => $id_compras[$i]
									]);
								}
								else{
									$model->rollback();
									echo json_encode(["status" => false]);
									exit();
								}
							}
							else{
								$model->rollback();
								echo json_encode(["status" => false]);
								exit();
							}
						}
						else{
							$model->rollback();
							exit();
						}
					}
					else{
						$model->rollback();
						exit();
					}
				}
				$model->commit();
			}
		}
		elseif (intval($notification->status) == 7) {
			if (!empty($id_compra)) {
				$model->update("compra", [
					"codigo_transacao" => $notification->code,
					"status_compra" => "N"
				], [
					"id_compra" => $id_compra
				]);

				$produto = $model->query("
					SELECT * FROM compra 
					INNER JOIN produto ON (compra.id_produto = produto.id_produto)
					WHERE 
						id_compra = :id
				", [
					":id" => $id_compra
				])->fetch();

				$result = $model->update("produto", [
					"quantidade_produto" => ($produto->quantidade_produto + 1)
				], [
					"id_produto" => $produto->id_produto
				]);

				if ($result > 0) {
					// Gera o histórico da compra do produto
					$last_query = $model->lastQuery();
					$model->insert("historico", [
						"comando_sql" => $last_query,
						"datahora_acao" => date("Y-m-d H:i:s"),
						"id_usuario" => Session::get("id_usuario")
					]);
				}
				else{
					$model->rollback();
					exit();
				}

				$model->commit();
			}
			else{
				for ($i=0; $i < count($id_compras); $i++) { 
					$model->update("compra", [
						"codigo_transacao" => $notification->code,
						"status_compra" => "N"
					], [
						"id_compra" => $id_compras[$i]
					]);

					$produto = $model->query("
						SELECT * FROM compra 
						INNER JOIN produto ON (compra.id_produto = produto.id_produto)
						WHERE 
							id_compra = :id
					", [
						":id" => $id_compras[$i]
					])->fetch();

					$result = $model->update("produto", [
						"quantidade_produto" => ($produto->quantidade_produto + 1)
					], [
						"id_produto" => $produto->id_produto
					]);

					if ($result > 0) {
						// Gera o histórico da compra do produto
						$last_query = $model->lastQuery();
						$model->insert("historico", [
							"comando_sql" => $last_query,
							"datahora_acao" => date("Y-m-d H:i:s"),
							"id_usuario" => Session::get("id_usuario")
						]);
					}
					else{
						$model->rollback();
						exit();
					}
				}
				$model->commit();
			}
		}
		else{
			if (!empty($id_compra)) {
				$model->update("compra", [
					"codigo_transacao" => $notification->code
				], [
					"id_compra" => $id_compra
				]);

				$model->commit();
			}
			else{
				for ($i=0; $i < count($id_compras); $i++) { 
					$model->update("compra", [
						"codigo_transacao" => $notification->code
					], [
						"id_compra" => $id_compra
					]);
				}
				$model->commit();
			}
		}
	}

	$file = fopen("log_pagseguro.txt", "a+");

	$text = "CODE: ".$_POST["notificationCode"]." | DATETIME: ".date("Y-m-d H:i:s")." | ID_COMPRA: ".encrypt_decode($_GET["compra"])." | ID_COMPRAS: ".encrypt_decode($_GET["compras"])."\n";

	fwrite($file, $text);

	fclose($file);

?>