/* ==========================================================================
 * INTEGRACÃO ATR B2B (Contact Form 7 Webhook)
 * ========================================================================== */

if ( ! defined( 'ATR_B2B_LOG_ATIVO' ) ) {
	define( 'ATR_B2B_LOG_ATIVO', true );
}

if ( ! defined( 'ATR_B2B_WEBHOOK_URL' ) ) {
	define( 'ATR_B2B_WEBHOOK_URL', 'https://mip.aquiatuaremodelacao.pt/api/1.0/acquisition/general/b2b-webhook' );
}

if ( ! defined( 'ATR_B2B_LEAD_GENERATOR_CODE' ) ) {
	define( 'ATR_B2B_LEAD_GENERATOR_CODE', 'lg-others-unknown' );
}

/**
 * Mapeamento de formulários do Contact Form 7
 */
function atr_b2b_mapa_formularios() {
	return array(
		'Franchisado - Int' => array(
			'lead_generator_code' => 'lg-franchise-direct',
			'name'                => 'NomeCompleto',
			'phone'               => 'Telefone',
			'email'               => 'email',
			'zipcode'             => 'CodigoPostal',
			'region'              => '',
			'privacy'             => 'acceptance-140',
			'marketing'           => 'acceptance-725',
			'cp'                  => 'CodigoPostal',
			'tel'                 => 'Telefone',
			'comment'             => array(),
		),

		'Fomulário Franqueado Digital' => array(
			'lead_generator_code' => 'lg-organic',
			'name'                => 'your-name',
			'phone'               => 'tel-309',
			'email'               => 'your-email',
			'zipcode'             => 'codigo-postal',
			'region'              => 'text-201',   // Zona de atuação
			'privacy'             => 'acceptance-140',
			'marketing'           => '',
			'cp'                  => 'codigo-postal',
			'tel'                 => 'tel-309',
			'comment'             => array(
				'Perfil'     => 'text-665',
				'Capacidade' => 'checkbox-378',
				'Zona'       => 'text-201',
			),
		),

		'Fomulário Franqueado Loja' => array(
			'lead_generator_code' => 'lg-showrooms',
			'name'                => 'your-name',
			'phone'               => 'tel-309',
			'email'               => 'your-email',
			'zipcode'             => 'codigo-postal',
			'region'              => 'text-201',
			'privacy'             => 'acceptance-140',
			'marketing'           => '',
			'cp'                  => 'codigo-postal',
			'tel'                 => 'tel-309',
			'comment'             => array(
				'Perfil'     => 'text-665',
				'Capacidade' => 'checkbox-378',
				'Zona'       => 'text-201',
			),
		),
	);
}

/* -------------------------------------------------------------------------
 * Normalização de telefone
 * ---------------------------------------------------------------------- */
function atr_b2b_normalizar_telefone( $bruto ) {
	$original = trim( (string) $bruto );

	$tem_mais = ( '' !== $original && '+' === $original[0] );
	$digitos  = preg_replace( '/\D+/', '', $original );

	if ( '' === $digitos ) {
		return array( '', 'telefone vazio apos limpeza (original: "' . $original . '")' );
	}

	if ( $tem_mais ) {
		$numero = '+' . $digitos;
		if ( 0 === strpos( $digitos, '351' ) ) {
			$nacional = substr( $digitos, 3 );
			$numero   = '+351' . $nacional;
		}
	} elseif ( 0 === strpos( $digitos, '00351' ) ) {
		$numero = '+351' . substr( $digitos, 5 );
	} elseif ( 0 === strpos( $digitos, '351' ) && strlen( $digitos ) === 12 ) {
		$numero = '+351' . substr( $digitos, 3 );
	} else {
		$numero = $digitos;
	}

	$aviso         = '';
	$so_digitos    = ltrim( $numero, '+' );
	$e_pt_nacional = ( preg_match( '/^9\d{8}$/', $so_digitos ) || preg_match( '/^2\d{8}$/', $so_digitos ) );
	$e_pt_inter    = ( 0 === strpos( $so_digitos, '351' ) && preg_match( '/^351[29]\d{8}$/', $so_digitos ) );

	if ( ! $e_pt_nacional && ! $e_pt_inter ) {
		$aviso = 'telefone com formato inesperado (original: "' . $original . '" -> "' . $numero . '")';
	}

	return array( $numero, $aviso );
}

/* -------------------------------------------------------------------------
 * Registo em ficheiro
 * ---------------------------------------------------------------------- */
function atr_b2b_log( $linha ) {
	if ( ! defined( 'ATR_B2B_LOG_ATIVO' ) || ! ATR_B2B_LOG_ATIVO ) {
		return;
	}

	$uploads = wp_upload_dir();
	$pasta   = trailingslashit( $uploads['basedir'] ) . 'atr-b2b-logs';

	if ( ! is_dir( $pasta ) ) {
		if ( ! wp_mkdir_p( $pasta ) ) {
			error_log( '[ATR B2B] Nao foi possivel criar a pasta de log: ' . $pasta );
			return;
		}
		@file_put_contents( $pasta . '/.htaccess', "Require all denied\nDeny from all\n" );
		@file_put_contents( $pasta . '/index.html', '' );
	}

	$ficheiro = $pasta . '/atr-b2b-' . gmdate( 'Y-m' ) . '.log';
	$ok       = @file_put_contents( $ficheiro, $linha . PHP_EOL, FILE_APPEND | LOCK_EX );

	if ( false === $ok ) {
		error_log( '[ATR B2B] Falha a escrever no log (' . $ficheiro . '): ' . $linha );
	}
}

function atr_b2b_log_bloco( $linhas ) {
	$separador = str_repeat( '=', 70 );
	atr_b2b_log( $separador . PHP_EOL . implode( PHP_EOL, $linhas ) );
}

/* -------------------------------------------------------------------------
 * Validação do Código Postal (servidor)
 * ---------------------------------------------------------------------- */
add_filter( 'wpcf7_validate_text*', 'atr_validar_codigo_postal', 20, 2 );
add_filter( 'wpcf7_validate_text', 'atr_validar_codigo_postal', 20, 2 );

function atr_validar_codigo_postal( $result, $tag ) {
	$campos_cp = array();
	foreach ( atr_b2b_mapa_formularios() as $cfg ) {
		if ( ! empty( $cfg['cp'] ) ) {
			$campos_cp[] = $cfg['cp'];
		}
	}

	if ( ! in_array( $tag->name, $campos_cp, true ) ) {
		return $result;
	}

	$valor = isset( $_POST[ $tag->name ] ) ? trim( wp_unslash( $_POST[ $tag->name ] ) ) : '';

	if ( ! preg_match( '/^\d{4}-\d{3}$/', $valor ) ) {
		$result->invalidate( $tag, 'Indique um código postal válido no formato XXXX-XXX.' );
	}

	return $result;
}

/* -------------------------------------------------------------------------
 * Validação do Telefone (servidor)
 * ---------------------------------------------------------------------- */
add_filter( 'wpcf7_validate_tel*', 'atr_validar_telefone', 20, 2 );
add_filter( 'wpcf7_validate_tel', 'atr_validar_telefone', 20, 2 );

function atr_validar_telefone( $result, $tag ) {
	$campos_tel = array();
	foreach ( atr_b2b_mapa_formularios() as $cfg ) {
		if ( ! empty( $cfg['tel'] ) ) {
			$campos_tel[] = $cfg['tel'];
		}
	}

	if ( ! in_array( $tag->name, $campos_tel, true ) ) {
		return $result;
	}

	$valor = isset( $_POST[ $tag->name ] ) ? trim( wp_unslash( $_POST[ $tag->name ] ) ) : '';

	$tem_mais = ( '' !== $valor && '+' === $valor[0] );
	$digitos  = preg_replace( '/\D+/', '', $valor );

	if ( 0 === strpos( $digitos, '00351' ) ) {
		$digitos = substr( $digitos, 5 );
	} elseif ( $tem_mais && 0 === strpos( $digitos, '351' ) && strlen( $digitos ) === 12 ) {
		$digitos = substr( $digitos, 3 );
	} elseif ( ! $tem_mais && 0 === strpos( $digitos, '351' ) && strlen( $digitos ) === 12 ) {
		$digitos = substr( $digitos, 3 );
	}

	if ( ! preg_match( '/^[29]\d{8}$/', $digitos ) ) {
		$result->invalidate( $tag, 'Indique um número de telefone português válido (9 dígitos).' );
	}

	return $result;
}

/* -------------------------------------------------------------------------
 * Máscaras no cliente (JS no Footer)
 * ---------------------------------------------------------------------- */
add_action( 'wp_footer', 'atr_mascaras_campos', 99 );

function atr_mascaras_campos() {
	$campos_cp  = array();
	$campos_tel = array();
	foreach ( atr_b2b_mapa_formularios() as $cfg ) {
		if ( ! empty( $cfg['cp'] ) ) {
			$campos_cp[] = $cfg['cp'];
		}
		if ( ! empty( $cfg['tel'] ) ) {
			$campos_tel[] = $cfg['tel'];
		}
	}
	$campos_cp  = array_values( array_unique( $campos_cp ) );
	$campos_tel = array_values( array_unique( $campos_tel ) );

	if ( empty( $campos_cp ) && empty( $campos_tel ) ) {
		return;
	}

	$json_cp  = wp_json_encode( $campos_cp );
	$json_tel = wp_json_encode( $campos_tel );

	echo '<script>
	( function () {
		var CAMPOS_CP  = ' . $json_cp . ';
		var CAMPOS_TEL = ' . $json_tel . ';

		function formatarCP( campo ) {
			var v = campo.value.replace( /\D/g, "" ).slice( 0, 7 );
			if ( v.length > 4 ) {
				v = v.slice( 0, 4 ) + "-" + v.slice( 4 );
			}
			campo.value = v;
		}
		function bloquearLetrasCP( e ) {
			if ( e.ctrlKey || e.metaKey || e.altKey ) { return; }
			if ( e.key && e.key.length === 1 && /\D/.test( e.key ) ) {
				e.preventDefault();
			}
		}

		function formatarTel( campo ) {
			var bruto = campo.value;
			var temMais = bruto.trim().charAt( 0 ) === "+";
			var digitos = bruto.replace( /\D/g, "" ).slice( 0, 15 );
			campo.value = ( temMais ? "+" : "" ) + digitos;
		}
		function bloquearLetrasTel( e ) {
			if ( e.ctrlKey || e.metaKey || e.altKey ) { return; }
			if ( e.key && e.key.length === 1 ) {
				if ( /\d/.test( e.key ) ) { return; }
				if ( e.key === "+" && e.target.selectionStart === 0 ) { return; }
				e.preventDefault();
			}
		}

		function inicializarCP( campo ) {
			if ( campo.dataset.atrCp ) { return; }
			campo.dataset.atrCp = "1";
			campo.setAttribute( "inputmode", "numeric" );
			campo.addEventListener( "keydown", bloquearLetrasCP );
			campo.addEventListener( "input", function () { formatarCP( campo ); } );
		}
		function inicializarTel( campo ) {
			if ( campo.dataset.atrTel ) { return; }
			campo.dataset.atrTel = "1";
			campo.setAttribute( "inputmode", "tel" );
			campo.addEventListener( "keydown", bloquearLetrasTel );
			campo.addEventListener( "input", function () { formatarTel( campo ); } );
		}

		function aplicar() {
			CAMPOS_CP.forEach( function ( nome ) {
				document.querySelectorAll( \'input[name="\' + nome + \'"]\' ).forEach( inicializarCP );
			} );
			CAMPOS_TEL.forEach( function ( nome ) {
				document.querySelectorAll( \'input[name="\' + nome + \'"]\' ).forEach( inicializarTel );
			} );
		}

		function alvo( el, lista ) {
			return el && el.name && lista.indexOf( el.name ) !== -1;
		}

		document.addEventListener( "DOMContentLoaded", aplicar );
		document.addEventListener( "wpcf7init", aplicar );
		document.addEventListener( "input", function ( e ) {
			if ( alvo( e.target, CAMPOS_CP ) ) {
				formatarCP( e.target );
			} else if ( alvo( e.target, CAMPOS_TEL ) ) {
				formatarTel( e.target );
			}
		} );
	} )();
	</script>';
}

/* -------------------------------------------------------------------------
 * Encaminhamento / Webhook
 * ---------------------------------------------------------------------- */
add_action( 'wpcf7_submit', 'atr_b2b_processar_submissao', 10, 2 );

function atr_b2b_processar_submissao( $contact_form, $result ) {

	if ( ! defined( 'ATR_B2B_WEBHOOK_URL' ) || empty( ATR_B2B_WEBHOOK_URL ) ) {
		return;
	}

	$estado  = isset( $result['status'] ) ? $result['status'] : '?';
	$titulo  = $contact_form->title();
	$carimbo = gmdate( 'Y-m-d H:i:s' );

	$mapa = atr_b2b_mapa_formularios();

	if ( ! isset( $mapa[ $titulo ] ) ) {
		return;
	}
	$cfg = $mapa[ $titulo ];

	$linhas = array(
		'[' . $carimbo . ' UTC] SUBMIT    | form="' . $titulo . '" | estado=' . $estado,
	);

	if ( ! in_array( $estado, array( 'mail_sent', 'mail_failed' ), true ) ) {
		atr_b2b_log_bloco( $linhas );
		return;
	}

	$submission = WPCF7_Submission::get_instance();
	if ( ! $submission ) {
		$linhas[] = '[' . $carimbo . ' UTC] ERRO      | sem instancia de submissao';
		atr_b2b_log_bloco( $linhas );
		return;
	}

	$data = $submission->get_posted_data();

	$ler = function ( $chave ) use ( $cfg, $data ) {
		$nome_campo = $cfg[ $chave ] ?? '';
		if ( '' === $nome_campo || ! isset( $data[ $nome_campo ] ) ) {
			return '';
		}
		$valor = $data[ $nome_campo ];
		if ( is_array( $valor ) ) {
			$valor = implode( ', ', $valor );
		}
		return trim( (string) $valor );
	};

	$campo_privacy = $cfg['privacy'] ?? '';
	if ( '' === $campo_privacy || empty( $data[ $campo_privacy ] ) ) {
		$linhas[] = '[' . $carimbo . ' UTC] IGNORADO  | privacidade nao aceite | email=' . ( $ler( 'email' ) ?: '-' );
		atr_b2b_log_bloco( $linhas );
		return;
	}

	list( $telefone, $aviso_tel ) = atr_b2b_normalizar_telefone( $ler( 'phone' ) );
	if ( '' !== $aviso_tel ) {
		$linhas[] = '[' . $carimbo . ' UTC] AVISO     | ' . $aviso_tel;
	}

	$partes_comment = array();
	if ( ! empty( $cfg['comment'] ) && is_array( $cfg['comment'] ) ) {
		foreach ( $cfg['comment'] as $etiqueta => $nome_campo ) {
			$valor = isset( $data[ $nome_campo ] ) ? $data[ $nome_campo ] : '';
			if ( is_array( $valor ) ) {
				$valor = implode( ', ', $valor );
			}
			$valor = trim( (string) $valor );
			if ( '' !== $valor ) {
				$partes_comment[] = $etiqueta . ': ' . $valor;
			}
		}
	}
	$comment = implode( ' | ', $partes_comment );

	$lead_code = ! empty( $cfg['lead_generator_code'] ) ? $cfg['lead_generator_code'] : ( defined( 'ATR_B2B_LEAD_GENERATOR_CODE' ) ? ATR_B2B_LEAD_GENERATOR_CODE : 'lg-others-unknown' );

	$payload = array(
		'name'                    => sanitize_text_field( $ler( 'name' ) ),
		'phone'                   => sanitize_text_field( $telefone ),
		'email'                   => sanitize_email( $ler( 'email' ) ),
		'zipcode'                 => sanitize_text_field( $ler( 'zipcode' ) ),
		'leadGeneratorCode'       => $lead_code,
		'privacy'                 => true,
		'marketingCommunications' => ! empty( $cfg['marketing'] ) ? ! empty( $data[ $cfg['marketing'] ] ) : false,
		'lead_type'               => 'B2B',
	);

	$region = sanitize_text_field( $ler( 'region' ) );
	if ( '' !== $region ) {
		$payload['region'] = $region;
	}
	if ( '' !== $comment ) {
		$payload['comment'] = sanitize_textarea_field( $comment );
	}

	$corpo_json = wp_json_encode( $payload );
	$linhas[]   = '[' . $carimbo . ' UTC] ENVIO     | ' . $corpo_json;

	$resposta = wp_remote_post(
		ATR_B2B_WEBHOOK_URL,
		array(
			'timeout' => 20,
			'headers' => array( 'Content-Type' => 'application/json' ),
			'body'    => $corpo_json,
		)
	);

	if ( is_wp_error( $resposta ) ) {
		$linhas[] = '[' . gmdate( 'Y-m-d H:i:s' ) . ' UTC] RESPOSTA  | ERRO de ligacao: ' . $resposta->get_error_message();
		atr_b2b_log_bloco( $linhas );
		return;
	}

	$codigo       = (int) wp_remote_retrieve_response_code( $resposta );
	$corpo        = wp_remote_retrieve_body( $resposta );
	$estado_envio = ( $codigo >= 200 && $codigo < 300 ) ? 'OK' : 'FALHA';

	$linhas[] = '[' . gmdate( 'Y-m-d H:i:s' ) . ' UTC] RESPOSTA  | ' . $estado_envio . ' | HTTP ' . $codigo . ' | ' . $corpo;

	atr_b2b_log_bloco( $linhas );
}<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="//aquiatuaremodelacao.pt/main-sitemap.xsl"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/b2b/</loc>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/b2c/</loc>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/ecoeficiencia-es/</loc>
		<lastmod>2026-07-10T14:39:48+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/empresas-de-remodelacoes-pt/</loc>
		<lastmod>2026-07-10T13:48:43+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/ca-fachadas-ca/</loc>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/fachadas/</loc>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/ideias-para-remodelar-pt/</loc>
		<lastmod>2026-07-10T11:58:24+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/design-de-interiores-pt/</loc>
		<lastmod>2026-07-10T13:15:41+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/main-web-en/</loc>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/orcamentos-pt/</loc>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/remodelacao-casa-de-banho-pt/</loc>
		<lastmod>2026-07-09T10:37:45+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/remodelacao-cozinha-pt/</loc>
		<lastmod>2026-07-10T12:49:17+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/remodelacao-integral-pt/</loc>
		<lastmod>2026-07-13T08:21:33+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/reformas-en-un-piso-de-alquiler-es/</loc>
		<lastmod>2026-07-08T09:42:48+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/shop-pages/</loc>
		<lastmod>2026-06-17T14:03:45+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/blog/ajudas-beneficios-pt/</loc>
		<lastmod>2026-07-10T09:25:54+00:00</lastmod>
	</url>
	<url>
		<loc>https://aquiatuaremodelacao.pt/blog/category/sem-categoria-pt/</loc>
		<lastmod>2026-07-10T15:07:55+00:00</lastmod>
	</url>
</urlset>
<!-- XML Sitemap generated by Rank Math SEO Plugin (c) Rank Math - rankmath.com -->