<?php
/*

	gfw_reload_full()
	
		Recarrega a página mantendo todos os parâmetros, inclusive POST.
	
	Problema técnico
	
		O navegador só mostra “Confirm form resubmission” se você tentar recarregar a mesma URL que foi carregada via POST.
		
		A solução é:
		
		Transformar o POST em uma nova requisição não-POST (GET ou POST via form invisível), sem reload direto.
	
	Arquitetura da função
	
		gfw_reload_full() vai:
	
		- Capturar o POST atual com $_POST.
		- Criar um formulário invisível via JavaScript.
		- Montar a URL final com:
		- parâmetros adicionados ou removidos
		- forçar HTTPS se quiser
		- hash (#anchor) se quiser
		- Submeter automaticamente, evitando F5/resubmission.
		- Garantir que o POST será preservado na nova requisição.
	
		Com isto vamos:
	
		- manter POST sem gerar “Confirm form resubmission”
		- permitir adicionar/remover parâmetros GET
		- permitir injetar hash (#anchor)
		- permitir forçar HTTPS
		- funcionar em qualquer navegador sem avisos
		- ser 100% seguro (não expõe dados do POST na URL)
		
	Como funciona:
	
		gfw_reload_full([
		    "add"    => ["page" => 2, "sort" => "asc"],
		    "remove" => ["error"],
		    "https"  => true,
		    "anchor" => "secao2"
		]);
		
	Resultados atingidos:
	
		- Remover error da URL
		- Adicionar page=2&sort=asc
		- Redirecionar para HTTPS
		- Ir direto para #secao2
		- Re-submeter POST automaticamente, sem alerta
		- Evitar totalmente o aviso “Confirm form resubmission”
		
	Por que isso evita a mensagem?

		- Porque não existe “reload”.
		- O navegador acredita que a requisição é nova, pois:
		- ela é iniciada por um formulário criado via JS
		- não há uso de location.reload()
		- não há F5
		- não há back/forward
		- não há histórico de POST anterior
		
*/

function gfw_reload_full($config = []) {
    $params_add    = $config['add']    ?? [];
    $params_remove = $config['remove'] ?? [];
    $force_https   = $config['https']  ?? false;
    $anchor        = $config['anchor'] ?? '';

    $post = $_POST;

    $scheme = ($force_https ? "https" : (isset($_SERVER['HTTPS']) ? "https" : "http"));
    $host   = $_SERVER['HTTP_HOST'];
    $uri    = strtok($_SERVER['REQUEST_URI'], '?');

    // GET atual
    $query = $_GET;

    // altera parâmetros
    foreach($params_remove as $p) unset($query[$p]);
    foreach($params_add as $k => $v) $query[$k] = $v;

    // monta querystring
    $qs = http_build_query($query);
    $qs = $qs ? "?$qs" : "";

    // hash
    $hash = $anchor ? "#$anchor" : "";

    $url = "$scheme://$host$uri$qs$hash";

    // gerar formulário invisível
    echo "<form id='gfw_post_reloader' method='POST' action='$url'>";
    foreach($post as $k => $v) {
        $v = htmlspecialchars($v, ENT_QUOTES);
        echo "<input type='hidden' name='$k' value='$v'>";
    }
    echo "</form>";

    // auto-submit seguro
    echo "<script>document.getElementById('gfw_post_reloader').submit();</script>";
    exit;
}

/*
	gfw_reload_full_m($c=[]);
	
	Características preservadas

		- antém POST sem “Confirm form resubmission”
		- ermite add/remove GET params
		- ermite forçar HTTPS
		- ermite anchor (#hash)
		- ão expõe POST na URL
		- ltra rápido e pequeno
		
	Opções disponíveis no $c (ou $config)

		Dentro do array $c, você pode usar as seguintes chaves:

			Chave	Tipo		Descrição
			add		array		Adiciona ou altera parâmetros GET
			remove	array		Remove parâmetros GET
			https	bool/int	Se 1, força HTTPS na URL final
			anchor	string		Adiciona #anchor no final da URL
			
	Como usar
	
		1. Recarregar a página normalmente mantendo POST
		
			gfw_reload_full();
		
		2. Adicionar parâmetros GET na recarga
		
			gfw_reload_full([
			    'add' => ['page' => 2, 'filter' => 'ativos']
			]);
		
		Resultado da URL final:
		
			...?page=2&filter=ativos
		
		3. Remover parâmetros GET existentes
		
			gfw_reload_full([
			    'remove' => ['token', 'p']
			]);
		
			Isso remove ?token=...&p=... da URL.
		
		4. Adicionar e remover ao mesmo tempo
			
			gfw_reload_full([
			    'add' => ['tab' => 'clientes'],
			    'remove' => ['debug']
			]);
		
			Forçar HTTPS
		
			gfw_reload_full([
			    'https' => 1
			]);
		
			Mesmo se o site estiver em HTTP, ele força:
			
				https://...
			
			Adicionar âncora (#anchor)
			
				gfw_reload_full([
				    'anchor' => 'sessao3'
				]);
			
		
		Resultado:
		
			...?x=1#sessao3
	
	Combinação completa
	
		gfw_reload_full([
		    'add'    => ['step' => 3],
		    'remove' => ['debug', 'temp'],
		    'https'  => 1,
		    'anchor' => 'final'
		]);
	
	Resultado típico:
	
		https://site.com/cadastro?step=3#final
		
	Situações práticas:

	- Após salvar formulário, recarregar a página e evitar F5 “Confirm resubmission”

		if ($_POST) {
			salvar_dados();
			gfw_reload_full(['add' => ['ok' => 1]]);
		}

	- Paginação que preserva POST

		gfw_reload_full(['add' => ['page' => $_GET['page'] + 1]]);

	- Limpar parâmetros da URL após ação

		gfw_reload_full(['remove' => ['msg', 'error']]);
		
	Conclusão

		O parâmetro $c transforma a função em um super carregador avançado, permitindo controle completo sobre:
	
			POST
			GET
			HTTPS
			anchors
			parâmetros dinâmicos
	
		Tudo sem “Confirm form resubmission”.
		
*/
function gfw_reload_full_m($c=[]) {
    $a=$c['add']??[];$r=$c['remove']??[];$h=$c['https']??0;$an=$c['anchor']??'';
    $p=$_POST;$sch=$h?"https":(isset($_SERVER["HTTPS"])?"https":"http");
    $ho=$_SERVER["HTTP_HOST"];$u=strtok($_SERVER["REQUEST_URI"],'?');
    $q=$_GET;foreach($r as $k) unset($q[$k]);foreach($a as $k=>$v) $q[$k]=$v;
    $qs=http_build_query($q);$qs=$qs?"?$qs":"";$an=$an?"#$an":"";
    $url="$sch://$ho$u$qs$an";
    echo "<form id=f method=POST action='$url'>";
    foreach($p as $k=>$v){$v=htmlspecialchars($v,ENT_QUOTES);echo "<input type=hidden name='$k' value='$v'>";}
    echo "</form><script>document.getElementById('f').submit();</script>";exit;
}

/*
	gfw_reload_full_u() — ULTRA-MINIFICADA
	
		- versão ultra-minificada sem espaços
		- versão com compactação Base64 do POST
		- versão com assinatura HMAC para segurança do POST
		- versão sem necessidade de JavaScript

*/
function gfw_reload_full_u($c=[]){$a=$c['add']??[];$r=$c['remove']??[];$h=$c['https']??0;$an=$c['anchor']??'';$p=$_POST;$s=$h?"https":((isset($_SERVER["HTTPS"])&&$_SERVER["HTTPS"]!="off")?"https":"http");$ho=$_SERVER["HTTP_HOST"];$u=strtok($_SERVER["REQUEST_URI"],'?');$q=$_GET;foreach($r as $k)unset($q[$k]);foreach($a as $k=>$v)$q[$k]=$v;$qs=http_build_query($q);$qs=$qs?"?$qs":"";$an=$an?"#$an":"";$url="$s://$ho$u$qs$an";echo"<form id=f method=POST action='$url'>";foreach($p as $k=>$v){$v=htmlspecialchars($v,ENT_QUOTES);echo"<input type=hidden name='$k' value='$v'>";}echo"</form><script>f.submit()</script>";exit;}
