/**
 * PufferGo Cookie 同意角标
 *
 * 只在后台启用了 GA4 或 Facebook Pixel 时才会被加载（见 class-analytics.php）。
 * 交互原则：不遮挡内容，默认拒绝非必要 Cookie，用户主动 Accept 后才放行。
 *
 * - GA4：走 Google 官方 Consent Mode v2，denied 状态下脚本已经在跑（gtag 自己
 *   读 consent 参数决定要不要真的写 Cookie/发身份识别数据），Accept 只是把
 *   consent 状态更新为 granted。
 * - Facebook Pixel：没有官方 consent 读取机制，服务端把 fbq 初始化代码渲染成
 *   `type="text/plain"`（浏览器不会执行），Accept 后由本脚本把 type 改回
 *   `text/javascript` 并重新插入 DOM 来激活它。
 *
 * 地区判断：只对欧洲访客弹同意条，其他地区直接放行、什么痕迹都不留（不落
 * Cookie、不弹窗），相当于没有这个功能。判断放在浏览器端做（用系统时区），
 * 不走服务端按 IP 判断——服务端分支会导致同一个 URL 对不同访客吐不同 HTML，
 * 跟站点的边缘缓存直接冲突（参考语言跳转功能踩过的同一个坑，那次也是改成
 * 纯客户端判断解决的）。时区只是粗筛，不是精确地理位置，可接受的误差。
 */
( function () {
	'use strict';

	var config = window.puffergoCookieConsent;
	if ( ! config ) {
		return;
	}

	var COOKIE_NAME = config.cookieName || 'puffergo_cookie_consent';
	var COOKIE_DAYS = 365;

	function getCookie( name ) {
		var match = document.cookie.match(
			new RegExp( '(?:^|; )' + name.replace( /([.$?*|{}()[\]\\/+^])/g, '\\$1' ) + '=([^;]*)' )
		);
		return match ? decodeURIComponent( match[ 1 ] ) : null;
	}

	function setCookie( name, value, days ) {
		var expires = new Date( Date.now() + days * 24 * 60 * 60 * 1000 ).toUTCString();
		document.cookie = name + '=' + encodeURIComponent( value ) + '; expires=' + expires + '; path=/; SameSite=Lax';
	}

	function activateGatedScripts() {
		var gated = document.querySelectorAll( 'script[type="text/plain"][data-puffergo-consent="marketing"]' );
		gated.forEach( function ( oldScript ) {
			var newScript = document.createElement( 'script' );
			newScript.type = 'text/javascript';
			if ( oldScript.src ) {
				newScript.src = oldScript.src;
			} else {
				newScript.text = oldScript.text;
			}
			oldScript.parentNode.replaceChild( newScript, oldScript );
		} );
	}

	function updateGtagConsent( granted ) {
		if ( typeof window.gtag !== 'function' ) {
			return;
		}
		var state = granted ? 'granted' : 'denied';
		window.gtag( 'consent', 'update', {
			ad_storage: state,
			ad_user_data: state,
			ad_personalization: state,
			analytics_storage: state,
		} );
	}

	function applyConsent( granted ) {
		updateGtagConsent( granted );
		if ( granted ) {
			activateGatedScripts();
		}
	}

	/**
	 * 粗筛访客是否在欧洲（含英国/瑞士等非欧盟但适用类似规则的国家）。
	 * 用系统时区判断，拿不到时区信息时保守按"欧洲"处理，不冒风险。
	 */
	function isLikelyEuropeVisitor() {
		try {
			var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || '';
			return /^Europe\//.test( timeZone ) ||
				[ 'Atlantic/Faroe', 'Atlantic/Canary', 'Atlantic/Reykjavik', 'Atlantic/Madeira' ].indexOf( timeZone ) !== -1;
		} catch ( e ) {
			return true;
		}
	}

	if ( ! isLikelyEuropeVisitor() ) {
		// 非欧洲访客：直接放行，不落 Cookie、不弹窗，等同于完全没有这个功能。
		if ( document.readyState === 'loading' ) {
			document.addEventListener( 'DOMContentLoaded', function () {
				applyConsent( true );
			} );
		} else {
			applyConsent( true );
		}
		return;
	}

	// 已有存量选择：直接按选择生效，不再弹面板。这段脚本本身在页脚早于被
	// 门控的追踪脚本标签打印（wp_footer 优先级差异），所以要等 DOM 就绪、
	// 门控标签已经在页面上之后再去激活，否则 activateGatedScripts 会扑空。
	var stored = getCookie( COOKIE_NAME );
	if ( stored === 'granted' || stored === 'denied' ) {
		if ( document.readyState === 'loading' ) {
			document.addEventListener( 'DOMContentLoaded', function () {
				applyConsent( stored === 'granted' );
			} );
		} else {
			applyConsent( stored === 'granted' );
		}
		return;
	}

	// 未做过选择：渲染左下角小角标，等用户操作。
	function renderBanner() {
		var root = document.createElement( 'div' );
		root.className = 'puffergo-cookie-consent';
		root.setAttribute( 'role', 'region' );
		root.setAttribute( 'aria-label', config.strings.ariaLabel || 'Cookie consent' );

		root.innerHTML =
			'<div class="puffergo-cookie-consent__badge">' +
				'<span class="puffergo-cookie-consent__icon" aria-hidden="true">🍪</span>' +
				'<span class="puffergo-cookie-consent__text">' + config.strings.message + '</span>' +
				'<span class="puffergo-cookie-consent__actions">' +
					'<button type="button" class="puffergo-cookie-consent__btn puffergo-cookie-consent__btn--reject">' + config.strings.reject + '</button>' +
					'<button type="button" class="puffergo-cookie-consent__btn puffergo-cookie-consent__btn--accept">' + config.strings.accept + '</button>' +
				'</span>' +
			'</div>';

		document.body.appendChild( root );

		function dismiss( granted ) {
			setCookie( COOKIE_NAME, granted ? 'granted' : 'denied', COOKIE_DAYS );
			applyConsent( granted );
			root.parentNode.removeChild( root );
		}

		root.querySelector( '.puffergo-cookie-consent__btn--accept' ).addEventListener( 'click', function () {
			dismiss( true );
		} );
		root.querySelector( '.puffergo-cookie-consent__btn--reject' ).addEventListener( 'click', function () {
			dismiss( false );
		} );
	}

	if ( document.readyState === 'loading' ) {
		document.addEventListener( 'DOMContentLoaded', renderBanner );
	} else {
		renderBanner();
	}
} )();
