/**
 * Nome do Arquivo: Exent Tracking
 * Autor: Felipe Shimada
 */

//Funções auxiliares

	/**
	 * Obtém informações do Cookie.
	 *
	 * @param {string} name - O nome do cookie a ser obtido.
	 * @returns {?string} O valor do cookie ou null se não encontrado.
	 */
	function getCookie(name) {
		var cookies = document.cookie.split(';');
		for (var i = 0; i < cookies.length; i++) {
			var cookie = cookies[i].trim();
			if (cookie.indexOf(name + '=') === 0) {
				return cookie.substring(name.length + 1);
			}
		}
		return null;
	}

	/**
	 * Obtém informações da URL (GET).
	 *
	 * @returns {Object.<string, string>} Um objeto contendo os parâmetros da URL.
	*/
	function getQueryParams() {
		var queryParams = {};
		var queryString = window.location.search.substring(1);
		var params = queryString.split('&');
		for (var i = 0; i < params.length; i++) {
			var param = params[i].split('=');
			var key = decodeURIComponent(param[0]);
			var value = decodeURIComponent(param[1] || '');
			queryParams[key] = value;
		}
		return queryParams;
	}

	/**
	 * Garante a existência de campos UTM em formulários.
	 *
	 * @param {Object} utmzParams - Objeto contendo os parâmetros UTM.
	*/
	function ensureUTMFieldsExist(utmzParams) {
		var utmcsr = utmzParams.utmcsr || '';
		var utmcmd = utmzParams.utmcmd || '';
		var utmccn = utmzParams.utmccn || '';
		var utmctr = utmzParams.utmctr || '';
	
		// Função para verificar e criar os campos em um formulário
		function checkAndCreateFields(form) {
			const fieldMappings = {
				utm_source: utmcsr,
				utm_medium: utmcmd,
				utm_campaign: utmccn,
				utm_term: utmctr
			};
	
			Object.entries(fieldMappings).forEach(([field, value]) => {
				if (value !== '' && !form.querySelector(`[name="${field}"]`)) {
					const input = document.createElement('input');
					input.type = 'hidden';
					input.name = field;
					input.value = value;
					form.appendChild(input);
				}
			});
		}
	
		// Selecionar todos os formulários na página
		const forms = document.querySelectorAll('form');
	
		// Verificar e criar campos em cada formulário
		forms.forEach(form => {
			checkAndCreateFields(form);
		});
	}

/**
 * Salva parâmetros nos cookies.
 *
 * @returns {Promise} Uma promise que resolve quando os cookies são salvos.
*/
function saveParamsToCookies() {

	return new Promise(function(resolve) {
		
		var queryParams = getQueryParams();
		var expirationDate = new Date();
		expirationDate.setTime(expirationDate.getTime() + (24 * 60 * 60 * 1000));
		var allowedKeys = ["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term", "campaignsource", "campaignmedium", "campaignid", "adgroupid", "keyword", "creative", "adposition", "matchtype", "network", "device"];
		for (var key in queryParams) {
			if (queryParams.hasOwnProperty(key) && allowedKeys.includes(key)) {
				var value = queryParams[key];
				document.cookie = key + '=' + value + '; expires=' + expirationDate.toUTCString() + '; path=/';
			}
		}

        resolve();
    });
	
}

/**
 * Adiciona campos de tagueamento no corpo dos formulários.
 *
 * @returns {Promise} Uma promise que resolve quando os campos são adicionados.
*/
function addHiddenInputsToForms() {

	return new Promise(function(resolve) {
		
		//Adiciona campos nos formulários, com base nos dados GET ou dados Cookie
		var queryParams = getQueryParams();
		var allowedKeys = ["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term", "campaignsource", "campaignmedium", "campaignid", "adgroupid", "keyword", "creative", "adposition", "matchtype", "network", "device", "__utmzz"];
		var forms = document.getElementsByTagName('form');
		
		for (var i = 0; i < forms.length; i++) {
			var form = forms[i];
			for (var key of allowedKeys) {
				var value = queryParams[key] || getCookie(key);
				if (value) {
					var input = document.createElement('input');
					input.type = 'hidden';
					input.name = key;
					input.value = value;
					input.classList.add('exent_GetCampaign');
					form.appendChild(input);
				}
			}
		}
		
		//Substitui dados no caso de valores preenchidos no exentUtmZ
		
		
        resolve();

	});

}

/**
 * Cria um input com a mídia Exent Hub adaptada.
*/
function createExentHubMedia() {

    var exhub_media = "Internet"; // Padrão
    
    var utmz = document.querySelector('input[name="__utmzz"]');
    var utmz = utmz.value;
    var utmzPairs = utmz.split('|');
    
    var utmzParams = {};

    utmzPairs.forEach(function(pair) {
        var [key, value] = pair.split('=');
        utmzParams[key] = value;
    });

	//Obtêm dados padrão UTMZ
    var utmcsr = utmzParams.utmcsr || '';
    var utmcmd = utmzParams.utmcmd || '';
    var utmccn = utmzParams.utmccn || '';
	var utmctr = utmzParams.utmctr || '';

	//URL Tracking KeyList
	var URLKeyList = [
        'utm_source',
        'utm_medium',
        'utm_campaign',
        'utm_id',
        'utm_term',
        'utm_content',
        'campaignsource',
        'campaignmedium',
        'campaignid',
        'adgroupid',
        'keyword',
        'creative',
        'adposition',
        'matchtype',
        'network',
        'device'
    ];
    
	var URLKeyValues = {};
	
	// Iterando pelas chaves
	URLKeyList.forEach(function(chave) {
		var inputElement = document.querySelector('input[name="' + chave + '"]');
		if (inputElement) {
			URLKeyValues[chave] = inputElement.value;
		} else {
			var cookieValue = getCookie(chave);
			URLKeyValues[chave] = cookieValue || ''; // Define o valor como em branco caso não exista o cookie
		}
	});

	//Prioridade 1 (UTMZ)

		//UTMZ Orgânico
		var organicMap = {
			'google': 'Google Orgânico',
			'live': 'Bing Orgânico',
			'yahoo': 'Yahoo Orgânico',
			'yandex': 'Yandex Orgânico'
		};

		if (utmcmd === 'organic' && utmcsr in organicMap) {
			exhub_media = organicMap[utmcsr];
		} else if(utmcmd === 'organic') {
			exhub_media = 'Orgânico';
		}

		//UTMZ Direto
		if(utmcsr == 'direct') {
			exhub_media = "Direto";
		}

		//UTMZ Referral
		if(utmcmd == 'referral') {
			exhub_media = "Referência";
		}
	
	//Prioridade 2 (GET Params)
		
		//GET Params
		var getMap = {
			'google': 'Google Ads',
			'facebook': 'Facebook Ads',
			'linkedin': 'Linkedin Ads'
		};
		
		var getSource = URLKeyValues['campaignsource'] || URLKeyValues['utm_source'];
		
		// Verificar se utmcmd não é "organic" antes de verificar em getMap
		if (utmcmd !== 'organic' && utmcmd !== 'referral' && utmcmd !== 'direct') {

			if (getSource in getMap) {
				exhub_media = getMap[getSource];
			} else if (getSource !== '') {
				exhub_media = getSource;
			}

		}

	//Cria campo - Exent Hub Media
	var forms = document.getElementsByTagName('form');
	for (var i = 0; i < forms.length; i++) {
		var form = forms[i];
		var input = document.createElement('input');
		input.type = 'hidden';
		input.name = 'exhub_media'; // Nome do input hidden
		input.value = exhub_media; // Valor da variável exhub_media
		input.classList.add('exent_GetCampaign'); // Se necessário, adicione classes
		
		form.appendChild(input); // Adiciona o input ao formulário
	}
	
	/*
		Verifica se campos utm_source / utm_medium / utm_campaign / utm_term existem.
		Caso não existam, cria e adiciona valores de UTMZ
	*/
	ensureUTMFieldsExist(utmzParams);
	
}

// Executa as funções em sequência usando Promises
saveParamsToCookies()
    .then(addHiddenInputsToForms)
    .then(createExentHubMedia);