// ! foot.js =========================
//Estas son variables para saber si salio
var salio = true;
//Arreglo de los id de las pestañas
var pestanasLLenas = [];
// Esto lo usa Alan
var widthTmp = 0;
// Esta bandera controla si puede poner en la pantalla el texto
var puedoPoner = true;
//Esto te dice si la llamada es de saliente o entrante
var tipoLlamada = 'OUTBOUND';
//Esta variable guarda los logs para ser enviados o impresos
var logs = [];
///Esta bandera controla cuando empezar a obtener el status del agente
var flagStatus = true;
///Esta variable guarda el telefono del ultimo registro llamado
var dialvoxCRM;
///Este es el vendor_lead_code de la ultima llamada
var ultimoVendor = '';

///Esto lleva la cuenta de peticiones muertas
var contadorDePeticiones = 0;

//No tengo idea por el momento de para que es estas variables
var banderitaCRM = false;
var vuelveCheck = -1;
var aPasado = false;

// Resolviendo cruce de llamadas
let login_llamadaInicial = true;

var agente_bloqueado = false;

var flag = true;
var btnActual;

// Autopausa ==========
let _FORZAR_PAUSA_SONANDO = false;
let intervalReadyAutopausa = -1;
const audioAutopausa = new Audio();
audioAutopausa.src =
	'/' +
	RUTA_MAESTRA +
	'/public/audio/autopausa' +
	_FORZAR_PAUSA_TONO +
	'.wav';
audioAutopausa.volume =
	_FORZAR_PAUSA_VOLUMEN && !isNaN(_FORZAR_PAUSA_VOLUMEN)
		? _FORZAR_PAUSA_VOLUMEN / 100
		: 0.5;

const audioLagged = new Audio();
audioLagged.src = '/' + RUTA_MAESTRA + '/public/audio/lagged.mp3';

let audioAutopausaReproducido = false;
let audioAutopausaAnterior = 0;

const audioAutopausaColgado = new Audio();
audioAutopausaColgado.src = '/' + RUTA_MAESTRA + '/public/audio/colgado.mp3';
// ====================

let lanzaDispoFlag = 0; // Desconocido
let presionaEstados = -1; // Desconocido
let idAnterior = null; // Desconocido
let ultimoLeadId = ''; // Desconocido
let preventAction = -1; // Desconocido
let bln_hangup_block = false; // Esta bandera bloquea el colgado del agente
let bln_dial_block = false;
let timeout_queue = -1;
// ^ Esta bandera bloquea la accion de marcacion
// | del agente

// Reconexion por condiciones especiales
let enLagged = false;
let dispositivoCambiado = false;


function dvBodyTheme(target) {
	const allClasses = [
		'dv-theme-success',
		'dv-theme-info',
		'dv-theme-danger',
		'dv-theme-warning',
		'dv-theme-ready',
		'dv-theme-paused',
		'dv-theme-dispo',
		'dv-theme-incall',
		'dv-theme-dead',
		'dv-theme-error',
	];

	if (!$('.dv-body').hasClass(target)) {
		$('.dv-body').addClass(target);

		allClasses
			.filter((v) => v !== target)
			.forEach((v) => $('.dv-body').removeClass(v));
	}
}

const btnPlayIcon_answer = 'fa-check-circle';
const btnPlayIcon_icon = 'fa-play-circle';

function btnPlayIcon_Play(btn) {
	if (btn.hasClass(btnPlayIcon_answer)) {
		btn.removeClass(btnPlayIcon_answer);
	}
	if (!btn.hasClass(btnPlayIcon_icon)) {
		btn.addClass(btnPlayIcon_icon);
	}
}

function btnPlayIcon_Answer(btn) {
	if (btn.hasClass(btnPlayIcon_icon)) {
		btn.removeClass(btnPlayIcon_icon);
	}
	if (!btn.hasClass(btnPlayIcon_answer)) {
		btn.addClass(btnPlayIcon_answer);
	}
}
// Objeto para controlar el estado del agente
// en el reporte en tiempo real
let st_store = {
	get status() {
		// Nunca es leido el status, por lo que
		// no hace falta este getter
	},
	_status: 'PAUSED', // Atributo 'privado' que contiene el estado
	_contenidoControles: '', // Atributo 'privado' que contiene el contenido
	_pause_code: '',
	// del contenedor de controles, para saber si tiene que cambiar
	set status(newVal) {
		// Setter para el estado
		// Este setter recibe un areglo, es decir que siempre
		// sera utilizado de la siguiente forma:
		//      st_store.status = [valor1, valor2]
		// El primer indice del arreglo contiene
		// el estado del agente y el segundo un subestado
		// en caso de tenerlo
		let [status, substatus, pause_code] = newVal;

		// Revisar para un cambio de estado
		const contenidoControles = controlesCanales();
		if (this._contenidoControles !== contenidoControles) {
			const contenedorControles = document.getElementById(
				'channel-control-dropdown-container'
			);
			this._contenidoControles = contenidoControles;
			contenedorControles.innerHTML = this._contenidoControles;
		}

		// Esta variable sera mostrada al agente
		// en la navbar
		let status_text = traducirFrase('DESCONOCIDO');
		$('#agent_status').removeClass();
		this._pause_code = pause_code;

		const btnPlayIcon = $('#btnPlay i');

		switch (status) {
			case 'PAUSED':
				clearTimeout(timeout_queue);
				$('#agent_status').addClass('text-info');
				dvBodyTheme('dv-theme-paused');

				switch (substatus) {
					case 'DISPO':
						$('#phone-calling-label').text('');
						status_text = traducirFrase('CALIFICANDO');
						dvBodyTheme('dv-theme-dispo');
						btnPlayIcon_Play(btnPlayIcon);
						break;
					default:
						switch (pause_code) {
							case _FORZAR_PAUSA_CODIGO:
								if (_FORZAR_PAUSA) {
									clearTimeout(timeout_queue);
									clearTimeout(idTimeoutTiempoLimite);
									$('#agent_status').removeClass('text-info');
									$('#agent_status').addClass('text-success');
									btnPlayIcon_Answer(btnPlayIcon);

									dvBodyTheme('dv-theme-ready');
									// $("")
									status_text = traducirFrase('DISPONIBLE');
									break;
								}
							case 'LAGGED':
								$('#agent_status').addClass('text-danger');
								dvBodyTheme('dv-theme-error');

								if (!enLagged) {
									enLagged = true;
									mensajePorPosibleDesconexion();
									audioLagged.play();
								}
							default:
								status_text = `${traducirFrase(
									'PAUSADO'
								)} - ${pause_code}`;
								$('#phone-calling-label').text('');
								btnPlayIcon_Play(btnPlayIcon);
								break;
						}
				}
				break;

			case 'DIAL':
			case 'INCALL':
				clearTimeout(timeout_queue);
				clearTimeout(idTimeoutTiempoLimite);
				$('#phone-calling-label').text('');
				btnPlayIcon_Play(btnPlayIcon);
				if (substatus === 'DEAD') {
					$('#agent_status').addClass('text-danger');
					dvBodyTheme('dv-theme-dead');
					status_text = traducirFrase('LLAMADA CORTADA');
				} else {
					$('#agent_status').addClass('text-success');
					dvBodyTheme('dv-theme-incall');
					status_text = traducirFrase('EN LLAMADA');
				}
				break;
			case 'CLOSER':
			case 'READY':
				clearTimeout(timeout_queue);
				clearTimeout(idTimeoutTiempoLimite);
				btnPlayIcon_Play(btnPlayIcon);
				$('#agent_status').addClass('text-success');
				dvBodyTheme('dv-theme-ready');
				status_text = traducirFrase('DISPONIBLE');
				break;
			case 'QUEUE':
				$('#phone-calling-label').text('');
				clearTimeout(idTimeoutTiempoLimite);
				$('#agent_status').addClass('text-warning');
				btnPlayIcon_Play(btnPlayIcon);
				dvBodyTheme('dv-theme-paused');
				status_text = traducirFrase('EN COLA');
				timeout_queue = setTimeout(() => {
					const dispoBox = document
						.getElementById('my_iframe')
						.contentWindow.document.getElementById(
							'DispoSelectBox'
						);
					let log = '';
					if (localStorage.getItem('QUEUE_LOG')) {
						log = localStorage.getItem('QUEUE_LOG');
					}

					if (!dispoBox) {
						log += '\nNo hay dispoBox';
					} else {
						log += `\nVisibilidad dispoBox: ${dispoBox.style.visibility}`;
					}
					log += `\nBandera colgado: ${bln_dial_block}`;

					if (dispoBox && dispoBox.style.visibility !== 'hidden') {
						bln_hangup_block = false;
						enviaCalificacion('NOCAL', 1);
					}

					localStorage.setItem('QUEUE_LOG', log);
				}, 4000);
				break;
			case 'DEAD':
				$('#phone-calling-label').text('');
				clearTimeout(timeout_queue);
				clearTimeout(idTimeoutTiempoLimite);
				$('#agent_status').addClass('text-danger');
				btnPlayIcon_Play(btnPlayIcon);
				dvBodyTheme('dv-theme-error');
				status_text = traducirFrase('LLAMADA CORTADA');
				break;
			default:
				clearTimeout(timeout_queue);
				status_text = `${status}/${substatus}`;
				break;
		}

		$('#agent_status').text(status_text);
		$('#estado-telefono').text(status_text);
		//$('#pause_time_left').text(status_text);
		// Casos especiales para bloquear
		// la marcacion o el colgado
		if (
			this._status === 'DISPO' &&
			((status === 'PAUSED' && substatus !== 'DISPO') ||
				status !== 'PAUSED')
		) {
			ocultaCalificacion();
			bln_dial_block = false;
		}

		if (status === 'PAUSED') {
			if (substatus === 'DISPO') {
				if (this._status !== 'DISPO') {
					$('#btnPause').addClass('disabled');
					$('#btnPause').addClass('d-none');
					$('#btnPlay').addClass('disabled');
					$('#btnPlay').addClass('d-none');
					$('#btnStop').addClass('disabled');
					$('#btnllama').addClass('disabled');
					bln_dial_block = false;
					if (enGrabacion) grabaMaster();
					if (enLlamada || enDispo || enDead || enQueue) {
						if (cronometro === null) {
							cronometro = 0;
							lanzaCalificacion();
						}
					}

					// Esto tambien pretende bloaquear todas las acciones
					// posibles

					/* Verificar que estas banderas sean utilizadas */

					bloquearPlay = false;
					bloquearRedial = false;
					enLlamada = false;
					enGrabacion = false;
					enTransferido = false;
					//enEspera = false;
					aTransferir = -1;
					aPasado = false;
					cantidad++;

					if (cantidad == 2) {
						bloquearCuelga = true;
						setTimeout(() => {
							bloquearCuelga = false;
						}, 10000);
					}
				}
				llamadas_map = {};
				this._status = 'DISPO';
			} else {
				this._status = 'PAUSED';
			}
		} else if (status === 'DIAL') {
			this._status = 'DIAL';
		} else if (typeof status !== 'undefined') {
			if (status === 'INCALL' || status === 'DIAL') {
				bln_hangup_block = false;
				if (this._status !== status) {
					// ! Reproducir audios?
					Object.keys(dispositivosAudio ?? { default: true }).forEach(
						(dispositivo) => {
							if (dispositivosAudio[dispositivo]) {
								const audio = new Audio();
								audio.src = '/' + RUTA_MAESTRA + '/index.php/AudioCliente/getAudioFromSession';

								audio.setSinkId(dispositivo).then(() => {
									audio.play();
								});
							}
						}
					);
				}
			}
			this._status = status;
		} else {
			this._status = 'NONE';
		}
	},
};

///Esto esconde el recuadro de los comentarios de los logs
$('#hideThis').hide();
//Esta variable controla la bandera que se pone en el idioma
var a = document.getElementById('idioma');
// if (a.value == 'es') {
// 	if (window.DIALVOX_BANDERA_ES) {
// 		document.getElementById('banderaPais').innerHTML =
// 			'<span class="flag-icon flag-icon-' +
// 			window.DIALVOX_BANDERA_ES +
// 			'"></span>&nbsp;';
// 	} else {
// 		document.getElementById('banderaPais').innerHTML =
// 			'<span class="flag-icon flag-icon-mx"></span>&nbsp;';
// 	}
// } else {
// 	document.getElementById('banderaPais').innerHTML =
// 		'<span class="flag-icon flag-icon-um"></span>&nbsp;';
// }
///Se supone que esto cierra la sesion antes de que la persona se vaya, aunque no siempre funciona
window.addEventListener('beforeunload', function (e) {
	document
		.getElementById('my_iframe')
		.contentWindow.dialedcall_send_hangup('', '', '', '', 'YES');
	$.get('/' + RUTA_MAESTRA + '/index.php/homeAgente/logout');
	window.location.assign('/' + RUTA_MAESTRA + '/index.php/homeAgente/logout');
});
/**
 * El siguiente codigo no se que haga, lo hizo Abdiel, seria bueno que lo revise o Alan o Enrique
 */
setTimeout(function () {
	document.body.scrollTop = document.documentElement.scrollTop = 0;
}, 1000);
//Supongo que esta cosa es el interval que usa Alan para agregar la barra de carga
var intervalProgressBar = setInterval(function () {
	if (widthTmp < 94) {
		widthTmp += (Math.random() * 100) % 10;
	}
	$('.progress-bar-hidden').css({ width: widthTmp + '%' });
}, 100);
/**
 * Esta funcion convierte el tiempo en segundos y lo deja como cadena
 * Formateada en HH:mm:ss
 */
function dameHora(tiempo) {
	var horas = Math.floor(tiempo / 3600);
	var minutos = Math.floor((tiempo % 3600) / 60);
	var segundos = (tiempo % 3600) % 60;
	return addZero(horas) + ':' + addZero(minutos) + ':' + addZero(segundos);
}
/**
 * Esto hace que en el reporte en tiempo real se muestre una alerta de que el agente
 * que este en la sesion
 */
function solicitaAyudaPorQueSoyUnInutil() {
	$.post('/' + RUTA_MAESTRA + '/index.php/homeAgente/ayudaSoyUnInutil')
		.then(function (data) {
			if (data.Estado === 'ok') {
				$('#ListaAlert').html(
					i18n.gettext(
						'Se ha avisado a los supervisores que solicitas ayuda'
					)
				);
				crearTooltip();
			} else {
				$('#ListaAlert').html(
					i18n.gettext('Ya se ha informado a su supervisor')
				);
				crearTooltip();
			}
		})
		['catch'](function (err) {
			console.error(err);
		});
}
//Esto reproduce el sonido de la campana que le indica al agente cuando el tiempo ha pasado
function PlaySound() {
	document.getElementById('beep').play();
}
//Esta es una funcion de sleep
function sleep(ms) {
	return new Promise(function (resolve) {
		return setTimeout(resolve, ms);
	});
}
/**
 * Esta funcion es la que empieza la magia, manda a llamar la funcion lanza
 * y obtiene los permisos para el audio
 */
function demo() {
	setTimeout(() => {
		lanza();
	}, 2500);
	navigator.getMedia =
		navigator.getUserMedia ||
		navigator.webkitGetUserMedia ||
		navigator.mozGetUserMedia;
	navigator.getMedia(
		{
			audio: true,
		},
		function (localMediaStream) {
			$('#my_iframe').attr('allow', 'microphone');
		},
		function (err) {
			console.error('Ocurrió el siguiente error: ' + err);
		}
	);
}
//Esto es lo que se ejecuta cuando el iframe
document.getElementById('my_iframe').onload = function () {
	setTimeout(function () {
		demo();
		ocultaCalificacion();
		otraFlag = true;
		ocultapausa();
		$('.spinner').css({ display: 'none' });
		$('.main-hidden-content').css({ opacity: 1 });
		clearInterval(intervalProgressBar);
		document.body.scrollTop = document.documentElement.scrollTop = 0;
	}, 5000);
};
//Esta funcion manda a llamar al telefono para que inicie la sesion del agente
function lanza() {
	var parametros = {};
	$.ajax({
		url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/llamadaInicial',
		type: 'POST',
		data: parametros,
		dataType: 'text',
		success: function (result) {
			var res = JSON.parse(result);
			if (res.Estado === 'ok') {
				if (login_llamadaInicial) {
					login_llamadaInicial = false;

					console.log('Colgado en llamada inicial');
					document
						.getElementById('my_iframe')
						.contentWindow.dialedcall_send_hangup(
							'',
							'',
							'',
							'',
							'YES'
						);

						setTimeout(() => {
							enviaCalificacion('NOCAL', 1);

							setTimeout(() => {
								document
									.getElementById('my_iframe')
									.contentWindow.AutoDial_ReSume_PauSe(
										'VDADpause',
										'',
										'',
										'',
										'',
										'',
										'',
										'YES'
									);

									setTimeout(() => {
										enviaPausa("LOGIN", 1, -1, '0');
									}, 1500)
							}, 1000)
						}, 1000)

				}
				

				console.log('Todo bien');
				salio = false;
			} else {
				console.error(res);
				console.error('AY Drake se murio esto');
				salio = true;
			}
		},
	});
}
//Esta funcion pone los numeros en la pantalla
function pon(num) {
	var dtmf = num;
	if (num == 10) dtmf = '+';
	else if (num == 11) dtmf = '#';
	else if (num == 12) dtmf = '*';
	if (enLlamada && (aTransferir == -1 || enTransferido)) {
		if (puedoEnviarDTMF) {
			if (num == 10) dtmf = '+';
			else if (num == 11) dtmf = 'P';
			else if (num == 12) dtmf = 'S';
			sendDTMF(dtmf);
		}
	} else {
		//phone_missed
		if (puedoPoner) $('#pantalla').val($('#pantalla').val() + dtmf);
	}
}
///Esta funcion valida que sea un numero lo que se pone en la pantalla
function validaNum(e) {
	var keynum;
	if (window.event) {
		// IE
		keynum = e.keyCode;
	} else if (e.which) {
		// Netscape/Firefox/Opera
		keynum = e.which;
	}
	if (keynum >= 96 && keynum <= 105) {
		// Numpad keys
		keynum -= 48;
	}

	return (
		keynum == 13 ||
		keynum == 37 ||
		e.key === '-' ||
		e.key === 'v' ||
		e.key === 'V' ||
		keynum == 46 ||
		keynum == 39 ||
		keynum == 8 ||
		/[0-9]/.test(String.fromCharCode(keynum))
	);
}
//Esta funcion muestra la ventana que se pase por parametro
function muestraCont(idCont) {
	if (idCont != btnActual) {
		$('#cont' + idCont).show();
		$('#cont' + btnActual).hide();
		$('#tab' + idCont).addClass('active');
		$('#tab' + btnActual).removeClass('active');
		btnActual = idCont;
		document.body.scrollTop = document.documentElement.scrollTop = 0;
	}
}
///Esta funcion borra la pestaña
function borrarPestana(n) {
	$('#cont' + n).remove();
	$('#titleTab' + n).remove();
	$('#tab' + 1).addClass('active');
	$('#cont' + 1).show();
	btnActual = 1;
	pestanasLLenas = pestanasLLenas.filter(function (val) {
		return val != n;
	});
}

// =================================================
// Funciones para agregar e iniciar los tabs para
// las ventanas del agente
let primerCargaTabs = true;
const tabsActuales = {};

function generarTab(tab, title, content) {
	const idTab = `${tab}-tab`;
	const strContent = content
		? `
		<iframe 
			id="${tab}_iframe" 
			name="${tab}_iframe" 
			src="${content}" 
			frameborder="0" 
			scrolling="yes" 
			style="overflow-y:scroll;overflow-x:scroll; height: 75vh;width: 100%;"
		></iframe>
	`
		: '';
	const strTab = `
		<li class="nav-item">
			<a 
				class="nav-link" 
				id="${idTab}" 
				href="#${tab}" 
				role="tab" 
				aria-controls="${tab}" 
				data-toggle="tab"
			>
				${title}
				${
					tab === 'contConts'
						? ''
						: `<button id='${idTab}_close_button' type="button" class="mx-2 close" aria-label="Close">
							<span aria-hidden="true">&times;</span>
			  			</button>`
				}
			</a>
		</li>
	`;
	const strTabPane = `
		<div id="${tab}" class='tab-pane fade' role="tabpanel" aria-labelledby="${idTab}">
			${strContent}
		</div>
	`;
	$('#tabVentanas').append(strTab);
	$('#tabContentVentanas').append(strTabPane);

	const r = {
		tab: $('#' + idTab),
		pane: $('#' + tab),
		iframe: $('#' + tab + '_iframe'),
	};

	if (tab !== 'contConts') {
		$(`#${idTab}_close_button`).on('click', (e) => {
			e.preventDefault();
			r.tab.remove();
			r.pane.remove();
			const someFrame = Object.keys(tabsActuales).pop();
			tabsActuales[someFrame].tab.trigger('click');
			primerCargaTabs = true;
			delete tabsActuales[tab];
		});
	}
	return r;
}

function defaultTabs() {
	const obj = generarTab('contConts', 'CRM');
	tabsActuales['default'] = {
		estatico: true,
		tab: obj.tab,
		pane: obj.pane,
		iframe: obj.iframe,
	};
}

function obtenerVentanas() {
	$.ajax({
		url: MODULOS + 'homeAgente/getFrames',
		type: 'GET',
		data: {},
		dataType: 'text',
		success: function (result) {
			const res = JSON.parse(result);
			if (!tabsActuales['default'] && (res.webForm || res.webFormTwo)) {
				defaultTabs();
			}

			res.Frames.forEach((frame, i) => {
				const tabId = frame.Titulo.replace(/[ ]/gi, '_');
				if (!tabsActuales[tabId]) {
					const tab = generarTab(tabId, frame.Titulo, frame.Url);
					tabsActuales[tabId] = {
						estatico: frame.Estatico === '1' ? true : false,
						tab: tab.tab,
						pane: tab.pane,
						iframe: tab.iframe,
					};
				} else if (!tabsActuales[tabId].estatico) {
					tabsActuales[tabId].iframe.attr('src', frame.Url);
				}
			});

			if (Object.keys(tabsActuales).length > 0 && primerCargaTabs) {
				const someFrame = Object.keys(tabsActuales).pop();
				tabsActuales[someFrame].tab.trigger('click');
				primerCargaTabs = false;
			}
		},
		error: function (data) {
			console.log(data);
			return 'error';
		},
	});
}

// =================================================

///Esta funcion crea la pestaña con el id y el numero que quieras mostrar
function crearPestana(id, numero) {
	obtenerVentanas();
	$('#contConts').append(
		'\n\t\t<div class="container row frameBox col-sm-12" id="cont' +
			id +
			'">\n\t\t\t\t<iframe src="" id="crm1' +
			id +
			'" class="ifrLeft col-sm-6" frameborder="1" scrolling="yes" style="overflow-y:scroll;overflow-x:scroll;"></iframe>\n\t\t\t\t<iframe src="" id="crm2' +
			id +
			'" class="ifrRight col-sm-6" frameborder="1" scrolling="yes" style="overflow-y:scroll;overflow-x:scroll;"></iframe>\n\t\t\t</div>\n\t\t'
	);
	$('#barraNav').append(
		'\n\t\t<li class="nav-item" id="titleTab' +
			id +
			'">\n\t\t\t<a onclick="muestraCont(\'' +
			id +
			'\')"  class="nav-link " href="#" id="tab' +
			id +
			'">' +
			numero +
			'<i ' +
			(ventanas == 1 ? 'onclick="borrarPestana(\'' + id + '\')"' : '') +
			'class="float-right fas fa-times align-middle"></i></a>\n\t\t</li>\n\t\t'
	);
	pestanasLLenas.push(id);
	muestraCont(id);
	document.body.scrollTop = document.documentElement.scrollTop = 0;
}
///Esta funcion ya esta deprecada, pero aun sirve para mostrar el estado actual del agente
function test() {
	console.log(
		'TiempoDispo,ventanas,allow_beep,pestanasLLenas,Manual,conCallBack,btnActual,time_beep,time_repeat,salio,otraFlag,puedoPoner,flag,flagStatus,banderitaCRM,vuelveCheck,aPasado,dialvoxCRM,Usuario,statusCalificacion,cronometro,TiempoTot,statusPausa,enGrabacion,enLlamada,puedoEnviarDTMF,otraFlag,enEspera,enTransferido,aTransferir,banderaCRM,banderaCRM2'
	);
	console.log(test);
}
//Esta funcion manda el texto a una notificacion
function crearTooltip() {
	/*
		var x = document.getElementById("snackbar");
		x.className = "show";
		setTimeout(function(){ x.className = x.className.replace("show", ""); }, 10000);
	*/
	var options = {
		body: $('#ListaAlert').html().replace(new RegExp('<br>', 'gi'), '\n'),
	};
	Notification.requestPermission()
		.then(function (permission) {
			if (permission == 'granted') {
				new Notification('Aviso', options);
			} else {
				alert(options.body);
			}
		})
		['catch'](function (err) {
			console.error(err);
		});
}
///Esto muestra el recuadro de los comentarios para los logs
function prepareLogs() {
	$('#hideThis').show();
}
//Esta funcion manda los logs para su revision
function sendLogs() {
	var data = {
		logs: logs,
		texto: $('#notasLogs').val(),
	};
	$.ajax({
		url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/makeLOG',
		type: 'POST',
		data: data,
		dataType: 'text',
		success: function (response) {
			$('#hideThis').hide();
			$('#notasLogs').val('');
			var data = JSON.parse(response);
			if (data.Estado === 'ok') {
				$('#ListaAlert').html(
					i18n.gettext('Los datos han sido enviados')
				);
				crearTooltip();
			} else {
				$('#ListaAlert').html(i18n.gettext(resp.Descripcion));
				crearTooltip();
			}
		},
		error: function (err) {
			console.error(err);
			$('#ListaAlert').html(
				i18n.gettext('Hubo un problema al guardar el log')
			);
			crearTooltip();
		},
	});
}

// ============== Cambio en dispositivos
let _devices_initialGroupId = '';
function dispositivosIniciales(h) {
	navigator.mediaDevices.enumerateDevices().then((d) => {
		const initialDefault = d.find((v) => v.deviceId === 'default') ?? {
			groupId: '',
		};
		_devices_initialGroupId = initialDefault.groupId;

		h();
	});
}

function listenerDeDispositivos() {
	setTimeout(() => {
		dispositivosIniciales(() => {
			navigator.mediaDevices.addEventListener('devicechange', () => {
				navigator.mediaDevices.enumerateDevices().then((devices) => {
					const current = devices.find(
						(v) => v.deviceId === 'default'
					);

					if (_devices_initialGroupId !== current.groupId) {
						dispositivoCambiado = true;
						dispositivosIniciales(() => {});
						mensajePorPosibleDesconexion();
					}
				});
			});
		});
	}, 5000);
}
listenerDeDispositivos();
// ============== Cambio en dispositivos

function mensajePorPosibleDesconexion() {
	const textos = {
		lagged: {
			title: traducirFrase('LAGGED'),
			text: traducirFrase(
				"Atención. Se ha perdido la conexión con el servidor. Por seguridad su sesión ha quedado en pausa. Por favor, revise su pantalla. Reintente conectarse con el botón 'Reconectar' o cierre sesión y vuelva a ingresar."
			),
		},
		dispositivo: {
			title: traducirFrase('Micrófono/altavoz desconectado'),
			text: traducirFrase(
				"Se detectó que tu micrófono o altavoz ha sido desconectado. Su sesión puede haber sido interrumpida. Reintente conectarse con el botón 'Reconectar' o cierre sesión y vuelva a ingresar."
			),
		},
	};

	const seleccion = enLagged ? textos.lagged : textos.dispositivo;

	return Swal.fire({
		title: seleccion.title,
		text: seleccion.text,
		icon: 'warning',
		showCancelButton: true,
		showConfirmButton: true,
		confirmButtonText: traducirFrase('Reconectar'),
		cancelButtonText: traducirFrase('Cerrar sesión'),
		allowOutsideClick: false,
	}).then((result) => {
		if (result.value) {
			enLagged = false;
			dispositivoCambiado = false;
			reconnect();
		} else {
			// TODO: Cerrar sesión
			salir();
		}

		Swal.close();
	});
}

function reconnect() {
	const mensajeErrorConferencia = 'ERROR 123: Hubo un problema con tu conexión a internet, no fue posible reestablecer tu sesión automaticamente.';
	$.get('/' + RUTA_MAESTRA + '/index.php/homeAgente/actualizarConferencia')
		.then(function (d) {
			const data = JSON.parse(d)

			console.log(data)
			if (data.Estado === 'ok') {
				document.getElementById('my_iframe').contentWindow.ReconnectWEBPHONE();
				setTimeout(() => {
					Swal.close();
					demo();
				}, 750)
			} else {
				$('#ListaAlert').html(
					i18n.gettext(mensajeErrorConferencia)
				);
				crearTooltip();
				salir();
			}
		})
		.catch(function (err) {
			console.log(err)
			$('#ListaAlert').html(
				i18n.gettext(mensajeErrorConferencia)
			);
			crearTooltip();
			salir();
		});
}

function getStatus() {
	if (flagStatus && !salio) {
		flagStatus = false;

		var parametros = {
			idReportePausa: localStorage.getItem('idReportePausa'),
		};
		$.ajax({
			url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/getStatus',
			type: 'POST',
			data: parametros,
			dataType: 'text',
			success: function (result) {
				try {
					if (contadorDePeticiones != 0) {
						reconnect();
						contadorDePeticiones = 0;
					}
					$('#tiempoLlamada').hide();
					flagStatus = true;
					//Esto solo parsea los datos
					var res = JSON.parse(result);
					if (res.reportePausa == 1) {
						$('#modalTiempoLimitePausa').modal('hide');
						localStorage.removeItem('idReportePausa');
					}
					if (res.status != 'INCALL') {
						enEspera = false;
						$('#btnesperao').removeClass(
							'btn btn-info phone-tecla active'
						);
						$('#btnesperao').addClass('btn btn-info phone-tecla');
					}
					st_store.status = [
						res.status,
						res.real_time_sub_status,
						res.pause_code,
					];
					//Obtiene los elementos del crm solo para que despues se obtenga su url
					var crm1 = document.getElementById('crm1' + res.call_id);
					var crm2 = document.getElementById('crm2' + res.call_id);
					//Esto lo agrega en el arreglo de logs
					var nuevo = new Array(
						TiempoDispo,
						ventanas,
						allow_beep,
						Manual,
						btnActual,
						time_beep,
						time_repeat,
						salio,
						otraFlag,
						puedoPoner,
						flag,
						flagStatus,
						banderitaCRM,
						vuelveCheck,
						aPasado,
						dialvoxCRM,
						Usuario,
						statusCalificacion,
						cronometro,
						TiempoTot,
						statusPausa,
						enGrabacion,
						enLlamada,
						puedoEnviarDTMF,
						otraFlag,
						enEspera,
						enTransferido,
						aTransferir,
						banderaCRM,
						banderaCRM2,
						res.status,
						res.real_time_sub_status,
						crm1 ? crm1.src : '',
						crm2 ? crm2.src : '',
						new Date().toString()
					);
					logs.push(nuevo);
					if (logs.length > 100) {
						logs.shift();
					}
					if (res.Estado === 'ok' && res.campActiva === 'Y') {
						$('#ringing_calls').text(res.llamadasSonando);

						$('#agent_campana').text(res.Campana);
						if (bloquearCuelga) {
							$('#btncuelga').addClass('disabled');
						} else {
							$('#btncuelga').removeClass('disabled');
						}
						if (res.status === 'PAUSED' && res.pause_code !== '') {
							if (
								dialvoxCRM == null ||
								res.real_time_sub_status === 'DISPO'
							) {
								$('#btnotro').addClass('disabled');
							} else {
								$('#btnotro').removeClass('disabled');
							}
						} else {
							if (
								res.status === 'READY' ||
								res.status === 'CLOSER'
							) {
								$('#btnotro').removeClass('disabled');
							} else {
								$('#btnotro').addClass('disabled');
							}
						}

						scheduler.str_leadId = res.lead_id;

						/*
						if (res.Cuelga)
							cuelga();
						*/
						if (res.status != 'INCALL') {
							$('#btnesperao').removeClass(
								'btn btn-info phone-tecla active'
							);
							$('#btnesperao').addClass(
								'btn btn-info phone-tecla'
							);
						}
						if (res.status == 'QUEUE') {
							scheduler.int_status = -1;
							if (res.Tiempo > 10) enQueue = true;
							else enQueue = false;
						}
						if (res.status === 'PAUSED') {
							if (res.real_time_sub_status == 'DISPO') {
								enDispo = true;
								if (!bloquearCuelga) {
									$('#btncuelga').removeClass('disabled');
								}
							} else {
								$('#btncuelga').addClass('disabled');
								enDispo = false;
								TiempoTot = 0;
								clearInterval(cronometro);
							}
							if (
								res.real_time_sub_status === 'DISPO' ||
								res.pause_code === ''
							) {
								$('#btnPause').addClass('disabled');
								$('#btnPause').addClass('d-none');
								$('#btnPlay').addClass('disabled');
								$('#btnPlay').addClass('d-none');
								$('#btnStop').addClass('disabled');
								$('#btnllama').addClass('disabled');
								$('#pantalla').attr('disabled', true);
								puedoPoner = false;
							} else {
								$('#pantalla').attr('disabled', false);

								$('#btnPause').addClass('disabled');
								$('#btnPause').addClass('d-none');
								if (res.pause_code === _FORZAR_PAUSA_CODIGO) {
									$('#btnPause').removeClass('disabled');
									$('#btnPause').removeClass('d-none');
								}

								if (!agente_bloqueado) {
									$('#btnPlay').removeClass('disabled');
									$('#btnPlay').removeClass('d-none');
								}
								$('#btnStop').removeClass('disabled');
								puedoPoner = true;
							}
							if (
								(Manual === 'MANUAL' ||
									Manual === 'INBOUND_MAN') &&
								res.real_time_sub_status === '' &&
								res.pause_code === ''
							) {
								$('#pantalla').attr('disabled', true);
								$('#btnPause').addClass('disabled');
								$('#btnPause').addClass('d-none');
								if (!agente_bloqueado) {
									$('#btnPlay').removeClass('disabled');
									$('#btnPlay').removeClass('d-none');
								}
								$('#btnStop').removeClass('disabled');
								$('#btnllama').removeClass('disabled');
								if (dialvoxCRM == null) {
									$('#btnotro').addClass('disabled');
								} else {
									$('#btnotro').removeClass('disabled');
								}
								puedoPoner = true;
							}
						} else {
							if (
								Manual === 'MANUAL' &&
								(res.status === 'READY' ||
									res.status === 'CLOSER')
							) {
								$('#btnPause').addClass('disabled');
								$('#btnPause').addClass('d-none');
								if (!agente_bloqueado) {
									$('#btnPlay').removeClass('disabled');
									$('#btnPlay').removeClass('d-none');
								}
								$('#btnStop').removeClass('disabled');
								puedoPoner = true;
							} else {
								if (res.status !== 'INCALL') {
									if (
										res.status === 'READY' ||
										res.status === 'CLOSER'
									) {
										puedoPoner = true;
									} else {
										puedoPoner = false;
									}
									$('#dtmfSender').hide();
									$('#encuestaSender').hide();
								} else {
									$('#dtmfSender').show();
									$('#encuestaSender').show();
									puedoPoner = true;
								}
								$('#btnPlay').addClass('disabled');
								$('#btnPlay').addClass('d-none');
								$('#btnPause').removeClass('disabled');
								$('#btnPause').removeClass('d-none');
							}
							$('#pause_time_left').text('');
						}
						if (res.real_time_sub_status == 'DEAD') {
							if (!enDead) {
								ultimoLeadId = res.lead_id;
								enDead = true;
								/*
								setTimeout(() => {
									if (enDead && ultimoLeadId === res.lead_id) {
										$("#ListaAlert").html(i18n.gettext("Ocurrio un error fatal en la llamada telefonica por parte del carrier. Favor de volver a iniciar sesion."));
										crearTooltip();
										salir(true)
									}
								}, 30000);
								*/
							}

							// cuelga(true);
							// scheduler.int_status = -1;
						} else {
							enDead = false;
						}
						if (
							res.status === 'READY' ||
							res.status === 'CLOSER' ||
							res.status === 'PAUSED'
						) {
							if (
								(res.status === 'READY' ||
									res.status === 'CLOSER') &&
								mamadasPendejas != 2
							) {
								mamadasPendejas = 1;
							} else {
								mamadasPendejas = 0;
							}
							if (res.real_time_sub_status === 'DISPO') {
								$('#btnStop').addClass('disabled');
							} else {
								$('#btnStop').removeClass('disabled');
							}
						} else {
							mamadasPendejas = 0;
							$('#btnStop').addClass('disabled');
						}
						if (
							res.status === 'DIAL' ||
							res.real_time_sub_status === 'DIAL'
						) {
							cantidad = 0;
							bloquearCuelga = false;
							scheduler.int_status = -1;
						}
						if (res.status == 'INCALL') {
							Enpausa = false;
							$('#pause_time_left').text('');
							if (!leads_idDeLlamadas[res.phone_number]) {
								leads_idDeLlamadas[res.phone_number] =
									res.lead_id;
							}
							ultimoLeadId = res.lead_id;
							ultimoVendor = res.vendor_lead_code;
							$('#dtmfSender').show();
							$('#encuestaSender').show();
							scheduler.int_status = -1;
							if (campaign_recording === 'ONDEMAND') {
								$('#btnRecord').removeClass('disabled');
							} else {
								$('#btnRecord').removeClass('disabled');
							}
							cantidad = 0;
							bloquearCuelga = false;
							$('#btntransfer').show();
							$('#btnotro').hide();
							dialvoxCRM =
								res.phone_number.length > TELEFONO_LIMITE ||
								res.phone_number.length < 1
									? null
									: res.phone_number;
							tipoLlamada = res.tipoLlamada;
							if (tipoLlamada == 'Inbound') {
								document.getElementById(
									'avisoEstado'
								).innerHTML =
									'<i class="fas fa-phone fa-sm"></i> <i class="fas fa-level-down-alt fa-sm"></i>';
							} else {
								document.getElementById(
									'avisoEstado'
								).innerHTML =
									'<i class="fas fa-phone fa-sm"></i> <i class="fas fa-level-up-alt fa-sm"></i>';
							}
							if (res.Tiempo >= time_beep && allow_beep == 1) {
								if (
									(res.Tiempo - time_beep) % time_repeat ==
									0
								) {
									PlaySound();
								}
							}
							$('#btnPause').addClass('disabled');
							$('#btnPause').addClass('d-none');
							$('#btntrans1').removeClass('disabled');
							$('#btntrans2').removeClass('disabled');
							$('#btnespera').removeClass('disabled');
							$('#btnotro').addClass('disabled');
							enLlamada = true;
							puedoEnviarDTMF = true;
							if (ventanas == 1) {
								if (!pestanasLLenas.includes(res.call_id)) {
									crearPestana(
										res.call_id,
										res.phone_number.length >
											TELEFONO_LIMITE
											? traducirFrase('Desconocido')
											: res.phone_number
									);
									if (pestanasLLenas.length >= 20) {
										$('#ListaAlert').html(
											i18n.gettext(
												'Tienes demasiadas pestañas abiertas, deberias cerrarlas'
											)
										);
										crearTooltip();
									}
									cambiaCRM(res.call_id);
									cambiaCRM2(res.call_id);
								}
							} else {
								if (!pestanasLLenas.includes(res.call_id)) {
									crearPestana(
										res.call_id,
										res.phone_number.length >
											TELEFONO_LIMITE
											? 'Desconocido'
											: res.phone_number
									);
									pestanasLLenas.forEach(function (item) {
										if (
											res.call_id != item &&
											item !== 'WAM'
										) {
											borrarPestana(item);
										}
									});
									cambiaCRM(res.call_id);
									cambiaCRM2(res.call_id);
								}
							}
							$('#tiempoLlamada').show();
							$('#tiempoLlamada').html(dameHora(res.Tiempo));
							if (res.real_time_sub_status === '3-WAY') {
								enTransferido = true;
							}
							if (aTransferir == -1 || enTransferido) {
								aPasado = false;
								$('#pantalla').attr('disabled', true);
								if (
									res.phone_number.length > TELEFONO_LIMITE ||
									res.phone_number < 1
								) {
									$('#pantalla').val('Desconocido');
								} else {
									$('#pantalla').val(res.phone_number);
								}
								if (
									llamadas_map &&
									!llamadas_map[res.phone_number]
								) {
									llamadas.push({
										telefono: res.phone_number,
										fecha: new Date(),
										tipo: 'Entrante',
									});
									llamadas_map[res.phone_number] = true;
								}
								$('#btnllama').addClass('disabled');
							} else {
								if (!aPasado) {
									aPasado = true;
									$('#pantalla').attr('disabled', false);
									$('#pantalla').val('');
									$('#btnllama').removeClass('disabled');
								}
							}
						} else {
							$('#dtmfSender').hide();
							$('#encuestaSender').hide();
							$('#btnRecord').addClass('disabled');
							$('#btntransfer').hide();
							$('#btnotro').show();
							if (
								res.status === 'READY' ||
								res.status === 'CLOSER'
							) {
								if (Manual === 'INBOUND_MAN') {
									$('#pantalla').attr('disabled', false);
									$('#btnllama').removeClass('disabled');
								} else {
									$('#pantalla').attr('disabled', false);
									$('#btnllama').removeClass('disabled');
									// $('#pantalla').attr('disabled', true);
									// $('#btnllama').addClass('disabled');
								}
								document.getElementById(
									'avisoEstado'
								).innerHTML = '';
								$('#btncuelga').addClass('disabled');
							} else {
								if (
									!(
										res.real_time_sub_status === 'DISPO' ||
										res.pause_code === ''
									)
								) {
									$('#btnllama').removeClass('disabled');
								}
							}
							aPasado = false;
							$('#btntrans1').addClass('disabled');
							$('#btntrans2').addClass('disabled');
							$('#btnespera').addClass('disabled');

							enLlamada = false;
							enGrabacion = false;
							enTransferido = false;
							//enEspera = false;
							aTransferir = -1;
							$('#tiempoLlamada').hide();
							puedoEnviarDTMF = false;
						}
						if (enTransferido) {
							$('#btntrans1').attr(
								'title',
								i18n.gettext('Abandonar llamada de 3 vias')
							);
							$('#btntrans2').attr(
								'title',
								i18n.gettext('Colgar llamada transferida')
							);
							$('#btntrans1').addClass('btn-danger');
							$('#btntrans2').addClass('btn-danger');
							$('#btntrans1').removeClass('btn-primary');
							$('#btntrans2').removeClass('btn-warning');
						} else {
							$('#btntrans2').attr(
								'title',
								i18n.gettext('Marcar con el cliente')
							);
							$('#btntrans1').attr(
								'title',
								i18n.gettext('Marcación ciega')
							);
							$('#btntrans1').removeClass('btn-danger');
							$('#btntrans2').removeClass('btn-danger');
							$('#btntrans1').addClass('btn-primary');
							$('#btntrans2').addClass('btn-warning');
						}

						if (
							res.status === 'PAUSED' &&
							res.pause_code !== '' &&
							res.real_time_sub_status !== 'DISPO' &&
							res.real_time_sub_status !== 'DEAD'
						) {
							scheduler.int_status = 1;
						} else {
							if (
								res.status === 'READY' ||
								res.status === 'CLOSER'
							) {
								scheduler.int_status = 0;
							} else {
								scheduler.int_status = -1;
							}
						}

						// Codigo para poner el grupo de entrada
						if (res.actual_call_type === 'INBOUND') {
							$('#actual-ingroup-name').text(res.ingroup_name);
						} else {
							$('#actual-ingroup-name').text('');
						}
						// Codigo para poner el grupo de entrada

						// ? Autopausa
						if (_FORZAR_PAUSA) {
							if (
								res.status === 'READY' ||
								res.status === 'CLOSER'
							) {
								if (intervalReadyAutopausa < 0) {
									intervalReadyAutopausa = setTimeout(() => {
										console.log(
											'Ejecutando pausa automatica'
										);

										audioAutopausaColgado.play();

										document
											.getElementById('my_iframe')
											.contentWindow.AutoDial_ReSume_PauSe(
												'VDADpause',
												'',
												'',
												'',
												'',
												'',
												'',
												'YES'
											);

										setTimeout(() => {
											enviaPausa(
												_FORZAR_PAUSA_CODIGO,
												1,
												-1,
												'0'
											);
										}, 500);

										clearTimeout(intervalReadyAutopausa);
										intervalReadyAutopausa = -1;
									}, 3 * 1000);
								}
							} else {
								clearTimeout(intervalReadyAutopausa);
								intervalReadyAutopausa = -1;
							}
						}

						const llamadasSonando = parseInt(res.llamadasSonando);
						const autopausaTimbrar = res.autopausaTimbrar;
						// console.log(
						// 	_FORZAR_PAUSA,
						// 	llamadasSonando,
						// 	st_store._status,
						// 	audioAutopausaAnterior
						// );
						if (_FORZAR_PAUSA) {
							if (!isNaN(llamadasSonando)) {
								_FORZAR_PAUSA_SONANDO = llamadasSonando > 0;
								if (
									st_store._status === 'PAUSED' &&
									st_store._pause_code ===
										_FORZAR_PAUSA_CODIGO
								) {
									try {
										if (
											llamadasSonando > 0 &&
											autopausaTimbrar !== undefined &&
											autopausaTimbrar
										) {
											$('#btnPlay').removeClass(
												'disabled'
											);
											$('#btnPlay').removeClass('d-none');

											if (
												autopausaTimbrar !==
													undefined &&
												autopausaTimbrar
											) {
												audioAutopausa.play();
												let texto =
													'Llamada de ' +
													res.primerLlamadaSonando;
												if (res.transferenciaAlAgente) {
													texto =
														'Transferencia de ' +
														res.primerLlamadaSonando;
												} else if (
													res.multiplesLlamadas
												) {
													text =
														llamadasSonando +
														' llamadas entrantes';
												}

												$('#phone-calling-label').text(
													texto
												);

												// Vaciar texto y bloquear
												$('#pantalla').val('');
												$('#pantalla').prop(
													'disabled',
													true
												);
											} else {
												$('#phone-calling-label').text(
													''
												);
												$('#pantalla').prop(
													'disabled',
													false
												);
											}
										} else {
											$('#btnPlay').addClass('disabled');
											$('#btnPlay').addClass('d-none');

											$('#phone-calling-label').text('');
											audioAutopausa.pause();
											audioAutopausa.currentTime = 0;
											$('#pantalla').prop(
												'disabled',
												false
											);
										}
									} catch (e) {
										console.log(e);
									}
								}
							}
						}
					} else {
						if (res.Estado === 'error') {
							enLlamada = false;
							console.error(res);
							$('#ListaAlert').html(
								i18n.gettext('Ha sido expulsado de su sesión') +
									'<br>' +
									res.Descripcion
							);
							crearTooltip();
							salir();
						} else {
							enLlamada = false;
							console.error(res);
							$('#ListaAlert').html(
								i18n.gettext('La campaña ha sido desactivada')
							);
							crearTooltip();
							salir();
						}
					}
				} catch (error) {
					console.error(error);
					enLlamada = false;
					console.error(result);
					$('#ListaAlert').html(
						i18n.gettext(
							'Ha sido expulsado de su sesión o se perdio conexion con el servidor'
						)
					);
					crearTooltip();
					salir();
				}
			},
			error: function (err) {
				contadorDePeticiones++;
				if (contadorDePeticiones === 1) {
					Swal.fire({
						title: i18n.gettext('¡Conexión perdida! Reconectando'),
						allowOutsideClick: false,
						allowEscapeKey: false,
						allowEnterKey: false,
						showConfirmButton: false,
						onBeforeOpen: () => Swal.showLoading(),
						icon: 'warning',
					});
				}
				if (contadorDePeticiones >= LIMITE_PETICIONES_AGENTE) {
					console.error(err);
					enLlamada = false;
					$('#ListaAlert').html(
						i18n.gettext('Se perdio conexión con el servidor')
					);
					crearTooltip();
					salir();
				} else {
					flagStatus = true;
				}
			},
		});
	}
}
//Esto muestra el boton extra solo cuando el tipo de marcacion es entrada manual
if (Manual === 'INBOUND_MAN') {
	$('#btnStop').show();
}

//Esto se encarga de recargar la peticion para obtener el status del agente todo el tiempo
obtenerVentanas();
setInterval(function () {
	getStatus();
}, 1750);

// ====================================================
// Funciones para los controles de los canales

// Estado del canal del agente sobre que tiene que hacer
let estadoCanalAgente = { estado: 'MUTING', volumen: 6 };
let estadoCanales = {};
let cambioEnCanales = false;
let telefonoActualCanal = '';
let telefonoActualTripartita = '';

$('#channel-control-dropdown-button').click((e) => {
	$('#channel-control-dropdown-container').toggle('show');
});

function controlesCanales() {
	try {
		const user = document
			.getElementById('agent-user-container')
			.textContent.trim();
		const channelsContainer = document.getElementById(
			'channel-control-dropdown-container'
		);
		const vicidialIFrame = document.getElementById('my_iframe');
		const vicidialDocument = vicidialIFrame.contentDocument;
		const vicidialWindow = vicidialIFrame.contentWindow;
		const rawChannelCells = [];
		const idChannels = [];
		let channels = [];

		vicidialWindow.conf_channels_detail('SHOW');

		const tableContainer =
			vicidialDocument.getElementById('outboundcallsspan');

		tableContainer.querySelectorAll('tr').forEach((elem, index) => {
			if (index !== 0) {
				rawChannelCells.push(elem.querySelectorAll('td'));
			}
		});

		rawChannelCells.forEach((cells) => {
			const rawName = cells[1].textContent;
			const hangup = cells[2].textContent.toLowerCase();
			if (hangup === 'hangup') {
				if (rawName.indexOf(user) !== -1) {
					channels.push({
						name: traducirFrase('Tu canal'),
						raw: rawName,
						id: 0,
						tipo: 1,
					});
				} else if (rawName.indexOf('SIP') === -1) {
					const id = rawName.split('-').pop().split(';').shift();
					idChannels.push(parseInt(id, 16));
					channels.push({
						name: '',
						raw: rawName,
						id: parseInt(id, 16),
						tipo: 0,
					});
				}
			}
		});

		const canalesActuales = Object.assign({}, estadoCanales);
		estadoCanales = {};

		channels = channels.sort((a, b) => a.id - b.id);

		switch (channels.length) {
			case 0:
				break;
			case 1:
				break;
			case 2:
				channels[1].name = $('#pantalla').val();
				break;
			case 3:
				break;
			default:
				channels.slice(3).forEach((channel) => {
					for (let i = 0; i < canalesExtras.length; i++) {
						const canalExtra = canalesExtras[i];
						if (
							canalExtra.id === -1 &&
							!canalesExtras.find((v) => v.id === channel.id)
						) {
							channel.name = canalExtra.telefono;
							canalExtra.id = channel.id;
							break;
						}
					}
				});
				break;
		}

		channels.forEach((channel) => {
			if (canalesActuales[channel.raw]) {
				const canalActual = canalesActuales[channel.raw];
				estadoCanales[channel.raw] = canalActual;

				if (canalActual.name !== '') {
					channel.name = canalActual.name;
				} else {
					estadoCanales[channel.raw].name = channel.name;
				}
			} else {
				// Esto inicializa el canal si es de tripartita
				// al agregarse
				if (channel.name === '' && telefonoActualTripartita !== '') {
					channel.name = telefonoActualTripartita;
				}
				estadoCanales[channel.raw] = {
					volumen: 6,
					mute: true,
					name: channel.name,
				};
			}
		});

		return [
			enTransferido && aTransferir === 1
				? `
				<div class='d-flex justify-content-around px-3 py-2'>
					<button type="button" class="btn btn-info flex-grow-1" onclick="abrirModalNuevoCanal()" >Agregar canal</button>
				</div>
			`
				: '',
			...channels.map(generarCanal),
		].join('');
	} catch (err) {
		console.log(err);
		return '';
	}
}

function generarCanal(channel) {
	const idBotones = channel.name + '-button';
	const idVolumen = channel.name + '-volumen';
	// Bandera para saber si poner MUTING
	const estadoMuting =
		channel.tipo === 1
			? estadoCanalAgente.estado === 'MUTING'
				? true
				: false
			: estadoCanales[channel.raw].mute;
	return `
		<h6 class='dropdown-header'>${channel.name}</h6>
		<div class='d-flex justify-content-around px-3 py-2'>
			<i 
				class="fas fa fa-volume-down mx-1" 
				style="cursor: pointer;"
				id='${idBotones}-down'
				onclick="controlCanales('${channel.raw}', 'DOWN', '${idBotones}-down', '${
		channel.tipo
	}', '${idVolumen}')"
			></i>
			<div class='progress flex-grow-1'>
				<div class='progress-bar col-${
					channel.tipo === 1
						? estadoCanalAgente.volumen
						: estadoCanales[channel.raw].volumen
				}' role='progressbar' id='${idVolumen}'></div>
			</div>
			<i 
				class="fas fa fa-volume-up mx-1" 
				style="cursor: pointer;"
				id='${idBotones}-up'
				onclick="controlCanales('${channel.raw}', 'UP', '${idBotones}-up', '${
		channel.tipo
	}', '${idVolumen}')"
			></i>
			<i 
				class="mx-1 fas fa ${
					estadoMuting
						? 'fa-microphone text-primary'
						: 'fa-microphone-slash text-danger'
				}" 
				style="cursor: pointer;"
				id='${idBotones}-muting'
				onclick="controlCanales('${channel.raw}', '${
		estadoMuting ? 'MUTING' : 'UNMUTE'
	}', '${idBotones}-muting', '${channel.tipo}', '${idVolumen}')"
			></i>
			${
				canalesExtras.find((v) => v.id === channel.id)
					? `<i 
				class="mx-1 fas fa fa-phone-slash text-danger" 
				style="cursor: pointer;"
				id='${idBotones}-hangup'
				onclick="colgarCanal('${channel.raw}', ${channel.id})"
			></i>`
					: ''
			}
		</div>
	`;
}

function controlCanales(channel, action, idButton, cambiarEstado, idVolumen) {
	const vicidialIFrame = document.getElementById('my_iframe');
	const vicidialWindow = vicidialIFrame.contentWindow;
	const volumen = document.getElementById(idVolumen);

	const button = document.getElementById(idButton);

	if (action === 'MUTING' || action === 'UNMUTE') {
		let mutingAction = action;
		if (button.classList.contains('fa-microphone-slash')) {
			mutingAction = 'UNMUTE';
			button.classList.remove('fa-microphone-slash');
			button.classList.add('fa-microphone');
			button.classList.remove('text-danger');
			button.classList.add('text-primary');
		} else {
			mutingAction = 'MUTING';
			button.classList.remove('fa-microphone');
			button.classList.add('fa-microphone-slash');
			button.classList.remove('text-primary');
			button.classList.add('text-danger');
		}
		if (cambiarEstado === '1') {
			estadoCanalAgente.estado =
				mutingAction === 'MUTING' ? 'UNMUTE' : 'MUTING';
		} else {
			estadoCanales[channel].mute = !estadoCanales[channel].mute;
		}
		vicidialWindow.volume_control(mutingAction, channel, '');
	} else {
		const aumento = action === 'UP' ? 1 : -1;
		volumen.classList.forEach((cssclass) => {
			if (cssclass.indexOf('col-') !== -1) {
				let volumenActual = parseInt(cssclass.split('-').pop());
				volumenActual += aumento;
				if (volumenActual >= 1 && volumenActual <= 12) {
					if (cambiarEstado === '1') {
						estadoCanalAgente.volumen = volumenActual;
					} else estadoCanales[channel].volumen = volumenActual;
					volumen.classList.remove(cssclass);
					volumen.classList.add('col-' + volumenActual);
				}
			}
		});
		vicidialWindow.volume_control(action, channel, '');
		button.classList.add('text-primary');
		setTimeout(() => button.classList.remove('text-primary'), 327);
	}
}

function colgarCanal(canal, id) {
	const vicidialIFrame = document.getElementById('my_iframe');
	const vicidialWindow = vicidialIFrame.contentWindow;
	vicidialWindow.livehangup_send_hangup(canal);
}

// ====================================================
// Evento para reconectar del boton
$('#reconnectButton').click(() => {
	Swal.fire({
		icon: 'warning',
		title: traducirFrase('¿Esta seguro que quiere intentar reconectar?'),
		text: traducirFrase(
			'Esto puede requerir varios intentos para tomar efecto. Nota: Solo debe usar este boton, cuando el circulo rojo de la pestaña se apaga o desaparece.'
		),
		showCancelButton: true,
		cancelButtonText: traducirFrase('Cancelar'),
		confirmButtonText: traducirFrase('Reconectar'),
	}).then((r) => {
		if (r.value) {
			reconnect();
		}
	});
});
// Evento para reconectar del boton

// Modificaciones al frame de vicidieal =================================

(function () {
	function initializeVicidialIFrameUntilFullLoad() {
		var vicidialIFrame = document.getElementById('my_iframe');
		var vicidialIFrameDocument =
			vicidialIFrame.contentDocument ||
			vicidialIFrame.contentWindow.document;

		if (vicidialIFrameDocument.readyState == 'complete') {
			console.log('El vicidialIFrame esta cargado');
			initializeIFrameVicidial(vicidialIFrame.contentWindow);
			return;
		}

		setTimeout(initializeVicidialIFrameUntilFullLoad, 100);
	}

	function initializeIFrameVicidial(w = window) {
		w.PETICIONES_ACTIVAS = new Map();
		w.LIMITE_TIEMPO_PETICION_ACTIVA = 1000 * 60;
		w.LIMITE_PETICIONES_ACTIVAS = 6;

		const originalXMLHttpRequestSendFunction =
			w.XMLHttpRequest.prototype.send;

		w.XMLHttpRequest.prototype.send = function (...args) {
			const ESTA_AL_LIMITE_PETICIONES_ACTIVAS =
				w.PETICIONES_ACTIVAS.size >= w.LIMITE_PETICIONES_ACTIVAS;
			if (ESTA_AL_LIMITE_PETICIONES_ACTIVAS) {
				return;
			}

			w.PETICIONES_ACTIVAS.set(
				this,
				setTimeout(() => {
					const SIGUE_LA_PETICION_ACTIVA =
						w.PETICIONES_ACTIVAS.has(this);

					if (SIGUE_LA_PETICION_ACTIVA) {
						w.PETICIONES_ACTIVAS.delete(this);
					}
				}, w.LIMITE_TIEMPO_PETICION_ACTIVA)
			);

			originalXMLHttpRequestSendFunction.call(this, ...args);

			this.addEventListener('load', () => {
				if (w.PETICIONES_ACTIVAS.has(this)) {
					clearTimeout(w.PETICIONES_ACTIVAS.get(this));
					w.PETICIONES_ACTIVAS.delete(this);
				}
			});
		};
	}

	initializeVicidialIFrameUntilFullLoad();
})();

// ======================================================================

// Dispositivos de audio
if (!localStorage.getItem('dispositivosAudio')) {
	localStorage.setItem(
		'dispositivosAudio',
		JSON.stringify({
			default: true,
		})
	);
}
const dispositivosAudio = JSON.parse(localStorage.getItem('dispositivosAudio'));
(function () {
	const audio = new Audio();
	audio.src =
		'/' + RUTA_MAESTRA + '/index.php/AudioCliente/getAudioFromSession';
	//commondatastorage.googleapis.com/codeskulptor-assets/jump.ogg';

	new Promise((solve, reject) => {
		$.ajax({
			method: 'GET',
			url: audio.src,
			dataType: 'text',
			success: function (response) {
				try {
					JSON.parse(response);
					reject();
				} catch (e) {
					console.log('Error obteniendo audio', e);
					solve();
				}
			},
			error: function (err) {
				reject();
			},
		});
	})
		.then((r) => {
			$('#dispositivosDeAudio').click(() => {
				$('#dispositivos-container').html('');

				navigator.mediaDevices
					.enumerateDevices()
					.then((devices) => {
						const d = devices.filter(
							(v) => v.kind === 'audiooutput'
						);

						d.forEach((device) => {
							$('#dispositivos-container').append(
								`<div class="audio-item d-flex" style="flex-direction: column; gap: 0.2rem;">
									<div class="d-flex" style="align-items: center; gap: 0.2rem;">
										<input type="checkbox" id="${device.deviceId}-check" />
										<span style="flex: 1" for="${device.deviceId}-check">${device.label}</span>
										<i class="btn btn-link fas fa-phone-volume" id="${device.deviceId}-test"></i>
									</div>
								</div>`
							);
						});

						d.forEach(device => {
							if (dispositivosAudio[device.deviceId]) {
								$(`#${device.deviceId}-check`).prop(
									'checked',
									true
								);
							}

							$(`#${device.deviceId}-check`).click(function (e) {
								dispositivosAudio[device.deviceId] =
									$(this).prop('checked');

								console.log(dispositivosAudio)
									
								localStorage.setItem(
									'dispositivosAudio',
									JSON.stringify(dispositivosAudio)
								);
							});

							$(`#${device.deviceId}-test`).click((e) => {
								// console.log('Iniciando test de ', device.label);
								audio
									.setSinkId(device.deviceId)
									.then((r) => {
										console.log('Sinkid exitoso', r);
										audio.play();
									})
									.catch((e) => {
										console.log('Sinkid no exitoso', e);
									});
							});
						})

						$('.dropdown-menu .audio-item').click((e) =>
							e.stopPropagation()
						);
					})
					.catch((e) => {
						console.log('Error obteniendo los dispositivos', e);
					});
			});
		})
		.catch((err) => {
			$('#dispositivosDeAudio').hide();
		});
})();

// ! foot.js =========================
// ! callbacks.js =========================
const SweetToast = Swal.mixin({
	backdrop: false,
	allowOutsideClick: true,
	position: "bottom-end",
	timer: 8000,
	timerProgressBar: true,
	onOpen: toast => {
		toast.addEventListener("mouseenter", Swal.stopTimer);
		``;
		toast.addEventListener("mouseleave", Swal.resumeTimer);
	}
});

const SweetToaster = Swal.mixin({
	toast: true,
	position: "bottom-end",
	timer: 8000,
	timerProgressBar: true,
	showConfirmButton: false,
	onOpen: toast => {
		toast.addEventListener("mouseenter", Swal.stopTimer);
		toast.addEventListener("mouseleave", Swal.resumeTimer);
	}
});
function Scheduler() {
	this.str_leadId = "-1";
	this.int_status = 0;
	this.bln_anyone = false;
	this.arr_notifications = [];
	this.prm_swal = new Promise((solve, reject) => {
		solve();
	});
	// Status:
	// 1 para PAUSED
	// 0 para READY o CLOSER
	// <0 para CUALQUIER OTRO

	this._fn_swalMixin = function(html, confirm, cancel) {
		if (typeof confirm === "undefined") {
			confirm = "Llamar ahora";
		}

		if (typeof cancel === "undefined") {
			cancel = "Recordarmelo mas tarde";
		}

		return {
			confirmButtonText: confirm,
			cancelButtonText: cancel,
			html: html,
			showConfirmButton: true,
			showCancelButton: true,
			backdrop: false,
			allowOutsideClick: true,
			position: "bottom-end",
			timerProgressBar: true
		};
	};

	this.fn_schedule = function(
		str_year,
		str_month,
		str_date,
		str_hours,
		str_minutes,
		str_comments,
		str_phoneNumber,
		bln_recipientAnyOne
	) {
		let str_strdate = this._fn_strdateFormatter(
			str_year,
			str_month,
			str_date,
			str_hours,
			str_minutes
		);
		let obj_self = this;
		let str_leadId = this.str_leadId;
		this.bln_anyone = bln_recipientAnyOne;
		this._fn_saveCallback(
			str_strdate,
			str_comments,
			bln_recipientAnyOne,
			res => {
				if (!bln_recipientAnyOne) {
					obj_self._fn_notify(
						obj_self._fn_milliRemaining(str_strdate),
						str_comments,
						str_phoneNumber,
						res.CallbackId,
						str_leadId
					);
				}
			},
			str_leadId
		);
	};

	// Convierte la fecha por separador en un formato de fecha
	// aceptado por el constructor de Date
	this._fn_strdateFormatter = function(
		str_year,
		str_month,
		str_date,
		str_hours,
		str_minutes
	) {
		return `${str_year}-${str_month}-${str_date} ${str_hours}:${str_minutes}:00`;
	};

	// Recide una fecha en formato correcto
	// y devuelve un objecto Date
	this._fn_strToDate = function(str_date, bln_fix) {
		let dte_tmpDate = new Date(str_date);
		if (
			typeof bln_fix !== "boolean" ||
			(typeof bln_fix === "boolean" && bln_fix)
		) {
			// Arreglar la fecha por zonas horarias
			// de ser necesario
		}
		return dte_tmpDate;
	};

	// Calcula los milisegundos restante entre
	// una fecha de inicio y una de final
	this._fn_milliRemaining = function(var_endDate, var_startDate) {
		if (typeof var_startDate === "undefined") {
			var_startDate = new Date();
		} else if (typeof var_startDate === "string") {
			var_startDate = this._fn_strToDate(var_endDate);
		}

		if (typeof var_endDate === "undefined") {
			var_endDate = new Date();
		} else if (typeof var_endDate === "string") {
			var_endDate = this._fn_strToDate(var_endDate);
		}

		return var_endDate.getTime() - var_startDate.getTime();
	};

	// Guarda el callback en la tabla
	// vicidial_callbacks como 'INACTIVE'
	this._fn_saveCallback = function(
		str_date,
		str_comments,
		bln_recipientAnyOne,
		fn_handler,
		str_leadId
	) {
		let str_recipient = "USERONLY";

		if (typeof bln_recipientAnyOne === "boolean" && bln_recipientAnyOne) {
			str_recipient = "ANYONE";
		}

		$.post(`/${RUTA_MAESTRA}/index.php/homeAgente/saveCallback`, {
			callback_time: str_date,
			comments: str_comments,
			recipient: str_recipient,
			lead_id: str_leadId || this.str_leadId
		})
			.then(res => {
				if (res.Estado !== "ok") {
					console.error(res);
				} else if (typeof fn_handler === "function") {
					console.log(res);
					fn_handler(res);
				}
			})
			.catch(err => {
				console.error(err);
			});
	};

	// Elimina el callback de la tabla
	// vicidial_callbacks
	this._fn_deleteCallback = function(str_callbackId, fn_handler) {
		$.post(`/${RUTA_MAESTRA}/index.php/homeAgente/deleteCallback`, {
			id: str_callbackId
		})
			.then(res => {
				if (res.Estado !== "ok") {
					console.error(res);
				} else if (typeof fn_handler === "function") {
					console.log(res);
					fn_handler(res);
				}
			})
			.catch(err => {
				console.error(err);
			});
	};

	// Obtiene un callback, si existen. Globales.
	this._fn_getCallback = function(fn_handler) {
		$.post(`/${RUTA_MAESTRA}/index.php/homeAgente/assignCallback`)
			.then(res => {
				if (res.Estado !== "ok") {
					console.error(res);
				} else if (typeof fn_handler === "function") {
					console.log(res);
					fn_handler(res);
				}
			})
			.catch(err => {
				console.error(err);
			});
	};

	this._fn_getOwnCallbacks = function(fn_handler) {
		$.post(`/${RUTA_MAESTRA}/index.php/homeAgente/getCallbacks`)
			.then(res => {
				if (res.Estado !== "ok") {
					console.error(res);
				} else if (typeof fn_handler === "function") {
					console.log(res);
					fn_handler(res);
				}
			})
			.catch(err => {
				console.error(err);
			});
	};

	// Genera el Timeout para notificar al agente
	// del callback
	this._fn_notify = function(
		int_milliRem,
		str_comments,
		str_phoneNumber,
		str_callbackId,
		str_leadId
	) {
		let obj_self = this;
		let int_timeoutId = setTimeout(function() {
			obj_self.prm_swal = obj_self.prm_swal.then(slv => {
				return new Promise((solve, reject) => {
					setTimeout(function() {
						solve(
							obj_self._fn_askCallback(
								str_comments,
								str_phoneNumber,
								str_callbackId,
								str_leadId
							)
						);
						console.log("Timeout promise ejecuted")
					}, 30000);
				});
			});
		}, int_milliRem);
		console.log(int_milliRem);
		this.arr_notifications.push({
			phone: str_phoneNumber,
			timeoutId: int_timeoutId
		});
		return int_timeoutId;
	};

	// Genera un callback para dentro de tres
	// minutos. Sirve si el agente no puede
	// o no quiere volver a llamar en este momento
	this._fn_remindLater = function(str_comments, str_phoneNumber, str_leadId) {
		let int_newTime = 2 * 60 * 1000;
		let date_tmp = new Date(Date.now() + int_newTime);
		let str_tmpDate = this._fn_strdateFormatter(
			date_tmp.getFullYear(),
			date_tmp.getMonth() + 1,
			date_tmp.getDate(),
			date_tmp.getHours(),
			date_tmp.getMinutes()
		);
		let obj_self = this;
		this._fn_saveCallback(
			str_tmpDate,
			str_comments,
			false,
			res => {
				obj_self._fn_notify(
					obj_self._fn_milliRemaining(str_tmpDate),
					str_comments,
					str_phoneNumber,
					res.CallbackId,
					str_leadId
				);
			},
			str_leadId
		);
	};

	// Preguna si se llamara en este momento
	// el callback. Si no lo quiere o lo quiere
	// para despues se reagendara el callback
	this._fn_askCallback = function(
		str_comments,
		str_phoneNumber,
		str_callbackId,
		str_leadId
	) {
		let obj_self = this;
		obj_self._fn_deleteCallback(str_callbackId);
		return Swal.fire(
			this._fn_swalMixin(`
		<div style="min-height: 8rem; min-width: 15rem;text-align: left;padding: 0.8rem;">
			<span style='font-weight: bold;'>${traducirFrase("Recuerda llamar a")} ${str_phoneNumber}</span><br>
			<span>${str_comments}</span><br><br>
			<p style="font-size: 0.8rem;font-variant: petite-caps;">
				${traducirFrase("Nota: Selecciona una opcion para eliminar este recordatorio.Si hay mas recordatorios, estos se mostraran despues de seleccionar la accion de este recordatorio.Si seleccionas 'Recordar mas tarde', se reagendara el recordatorio para despues.")}
			</p>
		</div>`)
		).then(res => {
			if (res.value) {
				if (obj_self.int_status === 1) {
					// Si esta pausado llama
					$("#pantalla").val(str_phoneNumber);
					$("#btnllama").click();
				} else if (obj_self.int_status === 0) {
					// Si esta en ready, pero no esta
					// en llamada pone al agente en pausa
					// y llama
					enviaPausa("PAUSA", 1);
					setTimeout(function() {
						$("#pantalla").val(str_phoneNumber);
						$("#btnllama").click();
					}, 3000);
				} else {
					// Si esta en llamada genera un callback
					// para dentro de tres minutos
					SweetToaster.fire({
						icon: "success",
						text: traducirFrase("No puedes llamar en este momento, se te recordara mas tarde")
					});
					obj_self._fn_remindLater(str_comments, str_phoneNumber, str_leadId);
				}
			} else if (res.dismiss === "cancel") {
				obj_self._fn_remindLater(str_comments, str_phoneNumber, str_leadId);
			}
			return res;
		});
	};

	// Revisa si on hay callbacks globales
	// para agendar una notificacion
	this.fn_checkCallback = function() {
		let obj_self = this;
		this._fn_getCallback(res => {
			if (res.CallbackId !== "none") {
				if (obj_self._fn_milliRemaining(res.CallbackTime) <= 0) {
					obj_self._fn_notify(
						10,
						res.CallbackComments,
						res.CallbackPhoneNumber,
						res.CallbackId,
						res.CallbackLead
					);
				} else {
					obj_self._fn_notify(
						obj_self._fn_milliRemaining(res.CallbackTime),
						res.CallbackComments,
						res.CallbackPhoneNumber,
						res.CallbackId,
						res.CallbackLead
					);
				}
			}
		});
	};

	// Consulta todos los callbacks que tiene el agente
	// y les agenda una notificacion
	this.fn_getCallbacks = function() {
		let obj_self = this;
		this._fn_getOwnCallbacks(res => {
			res.Callbacks.forEach(elem => {
				if (obj_self._fn_milliRemaining(elem.Time) <= 0) {
					obj_self._fn_notify(
						10,
						elem.Comments,
						elem.PhoneNumber,
						elem.Id,
						elem.Lead
					);
				} else {
					obj_self._fn_notify(
						obj_self._fn_milliRemaining(elem.Time),
						elem.Comments,
						elem.PhoneNumber,
						elem.Id,
						elem.Lead
					);
				}
			});
		});
	};
}
// ! callbacks.js =========================
// ! transferencia.js =========================
function sweetToast(type, title, timer) {
	let toast = Swal.mixin({
		toast: true,
		position: 'center',
		showConfirmButton: false,
		timer: timer ? timer : 3000,
		timerProgressBar: true,
		onOpen: (toast) => {
			toast.addEventListener('mouseenter', Swal.stopTimer);
			toast.addEventListener('mouseleave', Swal.resumeTimer);
		},
	});
	toast.fire({
		icon: type,
		title: title,
	});
}

function swalStepped(type, title, html, steps) {
	Swal.fire({
		icon: type,
		title: title,
		html: html,
		cancelButtonText: traducirFrase('Cancelar'),
		showCancelButton: true,
		showConfirmButton: false,
		onOpen: steps,
		customContainerClass: 'bg-light',
	});
}

async function transferirModales() {
	await cargaIngroupsYAgentes();
	swalStepped(
		'question',
		traducirFrase('Como quieres transferir'),
		'<br><div class="row"><div class="col-sm-12 d-flex justify-content-around"><button class="grupoTransfer btn btn-info p-3 col mx-2">' +
			'Grupo de entrada' +
			'</button><button class="agentesTransfer btn btn-info p-3 col mx-2">' +
			traducirFrase('Agente') +
			'</button></div></div>',
		function () {
			$('.grupoTransfer').click(function () {
				let cadena = ``; // se debe generar la string con los grupos de entrada
				IngroupsTransfer.forEach((val, index) => {
					cadena = cadena.concat(`
							<button class="grupoTransferId${
								index + 1
							} grupoTransferButtons font-weight-bold btn btn-light col" style="font-size: 0.9rem;font-weight: bold !important;">
								${val.Nombre}
							</button>
						`);
				});
				cadena = cadena.concat(`
					<button class="grupoTransferIdES grupoTransferButtons font-weight-bold btn btn-light col" style="font-size: 0.9rem;font-weight: bold !important;">
						${traducirFrase(
							'Transferir a grupo default (Si no tiene uno seleccionado esto hara que la llamada se cuelge)'
						)}
					</div>
					`);
				swalStepped(
					'question',
					'Que grupo de entrada',
					`'	<br>
							<div class="row px-4" style="width: 100%; height: auto; max-height: 20rem !important;overflow: auto;margin: 0px;">
								${cadena}
							</div>`,
					function () {
						// Cada boton tendra la clase .grupoTransferID donde ID es el id del
						// grupo de entrada
						// Aqui se iteran los ids o lo que sea de los grupos de entrada
						IngroupsTransfer.forEach((val, index) => {
							$(`.grupoTransferId${index + 1}`).click(
								function () {
									if ($(this).hasClass('btn-light')) {
										$('.grupoTransferButtons').addClass(
											'btn-light'
										);
										$('.grupoTransferButtons').removeClass(
											'btn-info'
										);
										$(this).removeClass('btn-light');
										$(this).toggleClass('btn-info');
									} else {
										transfiereLocalCloser(1, val.id);
										Swal.close();
									}
								}
							);
						});
						$(`.grupoTransferIdES`).click(function () {
							if ($(this).hasClass('btn-light')) {
								$('.grupoTransferButtons').addClass(
									'btn-light'
								);
								$('.grupoTransferButtons').removeClass(
									'btn-info'
								);
								$(this).removeClass('btn-light');
								$(this).toggleClass('btn-info');
							} else {
								transfiereLocalCloser(3);
								Swal.close();
							}
						});
					}
				);
				//
			});

			if (window.initTransferenciaAgentes) {
				window.initTransferenciaAgentes();
			} else {
				$('.agentesTransfer').click(function () {
					let cadena = ``; // se debe generar la string con los grupos de entrada
					AgentesTransfer.forEach((val, index) => {
						cadena = cadena.concat(`
							<button class="grupoTransferId${
								index + 1
							} grupoTransferButtons font-weight-bold btn btn-light col" style="font-size: 0.9rem;font-weight: bold !important;">
								${val}
							</button>
						`);
					});

					swalStepped(
						'question',
						traducirFrase('A que agente se transferira'),
						`'	<br>
							<div class="row px-4" style="width: 100%; height: auto; max-height: 20rem !important;overflow: auto;margin: 0px;">
								${cadena}
							</div>`,
						function () {
							AgentesTransfer.forEach((val, index) => {
								$(`.grupoTransferId${index + 1}`).click(
									function () {
										if ($(this).hasClass('btn-light')) {
											$('.grupoTransferButtons').addClass(
												'btn-light'
											);
											$(
												'.grupoTransferButtons'
											).removeClass('btn-info');
											$(this).removeClass('btn-light');
											$(this).toggleClass('btn-info');
										} else {
											transfiereLocalCloser(2, val);
											Swal.close();
										}
									}
								);
							});
						}
					);
					//
				});
			}
		}
	);
}
// ! transferencia.js =========================
// ! encuestas.js =========================

function mandarEncuesta(){
    $.ajax({
        url: MODULOS + 'Encuestas/getEncuestasByCampaign?campaign_id=' + campanaActual, 
        type: 'GET', 
        contentType: 'text',
        success: function(result) {
            const registros = {};
            let defaultValue = "";

            result.Registros.forEach(r => {
                registros[r.id_encuesta] = r.nombre;
                if (r.id_default == "1") {
                    defaultValue = r.id_encuesta
                }
            })

            Swal.fire({
                title: traducirFrase("Transferir Encuestas"),
                confirmButtonText: traducirFrase("Mandar Transferencia"),
                input: 'select',
                inputValue: defaultValue,
                inputOptions: registros,
                inputPlaceholder: traducirFrase("Selecciona una encuesta"),
                showCancelButton: true,
            }).then(result => {
                if (result && result.value !== '' && registros[result.value]) {

                    let encuesta = "" + result.value;
                    let campana = "" + campanaActual;

                    while (encuesta.length < 4) {
                        encuesta = "0" + encuesta;
                    }

                    while (campana.length < 4) {
                        campana = "0" + campana;
                    }

                    if (enTransferido && num_tipoTransferencia !== -1) {
                        transfiere(num_tipoTransferencia);
                        setTimeout(() => {
                            transfiere(2, '6969' + encuesta + campana + Usuario, true);
                        }, 3000)
                    } else {
                        transfiere(2, '6969' + encuesta + campana + Usuario, true);
                    }
                }
            })
        },
        error: console.log,
    });
}
// ! encuestas.js =========================
// ! telefono.js =========================
function borra() {
	if (enLlamada) return false;
	$("#pantalla").val(($("#pantalla").val()).substring(0, ($("#pantalla").val()).length - 1));
	return false;
}

function addZero(i) {
	if (i < 10) {
		i = "0" + i;
	}
	return i;
}

function cambiaHora() {
	var d = new Date();
	var x = document.getElementById("demo");
	var h = addZero(d.getHours());
	var m = addZero(d.getMinutes());
	var s = addZero(d.getSeconds());
	$("#reloj").html(h + ":" + m + ":" + s);
}
setInterval(function () {
	cambiaHora();
}, 100);
$(function () {
	$("#tiempoLlamada").hide();
});

// ! telefono.js =========================
// ! califica.js =========================
var statusCalificacion = false;
var conCallBack = [];
var cronometro = null;
var TiempoTot = 0;

function addZero(val) {
	if (parseInt(val) < 10) {
		val = '0'.concat(val);
	}
	return val;
}

function conviertePM(val) {
	val = parseInt(val) + 12;
	return val.toString();
}

function lanzaCalificacion(id) {
	if (idAnterior !== id) {
		idAnterior = id;
		presionaEstados = -1;
	}

	presionaEstados++;
	if (!statusCalificacion && presionaEstados <= 2) {
		statusCalificacion = true;

		$.ajax({
			url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/getDispoSelect',
			type: 'POST',
			data: {},
			dataType: 'text',
			success: function (result) {
				if (!bln_hangup_block) {
					$('#calif').show();
				}
				var resp = JSON.parse(result);
				if (resp.Estado == 'ok') {
					conCallBack = [];
					$('#codigosCalif').html('');
					if (resp.Horario === '24hours') {
						$('#cbTime').removeAttr('min');
						$('#cbTime').removeAttr('max');
					} else {
						var arregloasd = resp.Horario.split('-');
						arregloasd = arregloasd.map((val) => {
							val =
								val.indexOf('pm') != -1
									? conviertePM(val.replace('pm', ''))
									: val.replace('am', '');
							return val;
						});
						$('#cbTime').attr(
							'min',
							`${addZero(arregloasd[0])}:00:00`
						);
						$('#cbTime').attr(
							'max',
							`${addZero(arregloasd[1])}:00:00`
						);
					}
					for (var i = 0; i < resp.Registros.length; i++) {
						if (resp.Registros[i].status == id) {
							$('#codigosCalif').append(
								"<a href='#'style='padding:3px;' class='  letraSize col-sm-3  bg-success text-white text-center list-group-item list-group-item-secondary text-wrap' onclick='enviaCalificacion(\"" +
									resp.Registros[i].status +
									'",1)\'>' +
									resp.Registros[i].status +
									'-' +
									resp.Registros[i].status_name +
									'</a>'
							);
						} else {
							$('#codigosCalif').append(
								"<a href='#' style='padding:3px;' class=' letraSize col-sm-3 botonCalificar text-center list-group-item-action text-wrap' onclick='enviaCalificacion(\"" +
									resp.Registros[i].status +
									'",0)\'>' +
									resp.Registros[i].status +
									'-' +
									resp.Registros[i].status_name +
									'</a>'
							);
						}

						if (resp.Registros[i].scheduled_callback == 'Y') {
							conCallBack.push(resp.Registros[i].status);
						}
					}
					if (id == null) {
						// document.getElementById("my_iframe").contentWindow.dialedcall_send_hangup('', '', '', '', 'YES');
						TiempoTot = TiempoDispo;
						disminuyeTiempo(TiempoDispo);
						cronometro = setInterval(function () {
							if (TiempoTot == 0) {
								enviaCalificacion('NOCAL', 1);
								clearInterval(cronometro);
								setTimeout(() => (cronometro = null), 5000);
							} else {
								disminuyeTiempo(TiempoTot);
								TiempoTot--;
							}
						}, 1000);
					}
				} else {
					$('#ListaAlert').html(i18n.gettext(resp.Descripcion));
					crearTooltip();
				}
				if (conCallBack.indexOf(id) == -1) {
					$('#callback').hide();
				}
			},
			error: function (error) {
				console.log(error);
				statusCalificacion = false;
			},
		});
	}
	return false;
}

function disminuyeTiempo(tiempo) {
	$('#TiempoCal').html(
		i18n.gettext('Tiempo restante') + ': <b>' + tiempo + '</b>'
	);
}

function ocultaCalificacion() {
	$('#calif').hide();
	statusCalificacion = false;
	$('#botonCalificar').attr('disabled', false);
	$('#cbComments').val('');
	$('#cbTipo').val('USERONLY');
	$('#cbDate').val('');
	$('#cbTime').val('');
}

function buscaCB(id) {
	if (conCallBack.indexOf(id) != -1) {
		$('#callback').show();
		let dt = new Date();
		let dt_date = ('0' + dt.getDate()).slice(-2);
		let dt_month = ('0' + (dt.getMonth() + 1)).slice(-2);
		let dt_hours = ('0' + dt.getHours()).slice(-2);
		let dt_minutes = ('0' + dt.getMinutes()).slice(-2);
		let dt_years = dt.getFullYear();
		$('#cbDate').val(`${dt_years}-${dt_month}-${dt_date}`);
		$('#cbTime').val(`${dt_hours}:${dt_minutes}`);
	} else {
		$('#callback').hide();
	}
}

function dameFecha() {
	return $('#cbDate').val() + ' ' + $('#cbTime').val();
}

function comentaLead(comentario, lead_id) {
	$.ajax({
		url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/commentLead',
		type: 'POST',
		data: { comment: comentario, lead_id: lead_id },
		dataType: 'text',
		success: function (result) {
			console.log('Todo bien');
		},
		error: function (err) {
			console.log(err);
		},
	});
}

function revisaListas(numero, calificacion, campana, vendor_lead_code) {
	$.ajax({
		url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/checkBlackList',
		type: 'POST',
		data: {
			numero: numero,
			calificacion: calificacion,
			campana: campana,
			vendor_lead_code: vendor_lead_code,
		},
		dataType: 'text',
		success: function (result) {
			console.log('Todo bien');
		},
		error: function (err) {
			console.log(err);
		},
	});
}

function enviaCalificacion(id, cant) {
	if (cant == 0) {
		statusCalificacion = false;
		lanzaCalificacion(id);
		$('#cbDate').val('');
		$('#cbTime').val('');
		$('#cbComments').val('');
		$('#cbTipo').val('USERONLY');
		buscaCB(id);
	} else {
		$('#btncuelga').attr('disabled', true);
		if (!bln_hangup_block) {
			bln_hangup_block = true;
			let pausaBoton = false;
			if (_FORZAR_PAUSA) {
				// PAUSA AUTOMATICA
				pausaBoton = true;

				document
					.getElementById('my_iframe')
					.contentWindow.document.getElementById(
						'DispoSelectStop'
					).checked = true;

				setTimeout(() => {
					$('#codPausa').show();
					statusPausa = true;
					$('#botonPausaCalificar').attr('disabled', false);

					// PAUSA AUTOMATICA CODIGO
					if ($('#PausaCal').prop('checked')) {
						$('#PausaCal').prop('checked', false);

						pideRazonPausa();
						// setTimeout(() => {
						// 	enviaPausa(_FORZAR_PAUSA_CODIGO, 1, -1, '0', undefined, true);
						// }, 100);
					} else {
						enviaPausa(_FORZAR_PAUSA_CODIGO, 1, -1, '0');
					}
				}, 1000);
			} else if ($('#PausaCal').prop('checked')) {
				pausaBoton = true;

				$('#PausaCal').prop('checked', false);
				document
					.getElementById('my_iframe')
					.contentWindow.document.getElementById(
						'DispoSelectStop'
					).checked = true;

				setTimeout(() => {
					$('#codPausa').show();
					statusPausa = true;
					$('#botonPausaCalificar').attr('disabled', false);
					pideRazonPausa();
				}, 1000);
			}
			document
				.getElementById('my_iframe')
				.contentWindow.DispoSelectContent_create(id, 'ADD', 'YES');
			document
				.getElementById('my_iframe')
				.contentWindow.DispoSelect_submit('', '', 'YES');
			let comentario = $('#comentario').val();
			$('#comentario').val('');
			comentaLead(comentario, ultimoLeadId);
			revisaListas(dialvoxCRM, id, campanaActual, ultimoVendor);
			var conCall = 0;
			if ($('#cbDate').val() !== '') {
				let cbDate = $('#cbDate').val().split('-');
				let cbTime = $('#cbTime').val().split(':');
				let cbComments = $('#cbComments').val();
				let cbTipo = $('#cbTipo').val() === 'ANYONE' ? true : false;
				let cbPhoneNumber = $('#pantalla').val();
				scheduler.fn_schedule(
					cbDate[0],
					cbDate[1],
					cbDate[2],
					cbTime[0],
					cbTime[1],
					cbComments,
					cbPhoneNumber,
					cbTipo
				);
				$('#cbDate').val('');
				$('#cbTime').val('');
				$('#cbComments').val('');
				$('#cbTipo').val('USERONLY');
			}
			$('#pantalla').val('');
			if (conCallBack.indexOf(id) != -1) conCall = 1;
			$('#botonCalificar').attr('disabled', true);
			if (!scheduler.bln_anyone) {
				scheduler.fn_checkCallback();
				scheduler.bln_anyone = false;
			}
			TiempoTot = 0;
			clearInterval(cronometro);

			ocultaCalificacion();
			if (!pausaBoton && Manual === 'INBOUND_MAN') {
				const myIframe =
					document.getElementById('my_iframe').contentWindow;

				// ! # Caso Noroeste, 2 de junio: Las llamadas a veces se quedan en live_call,
				// !							  para resolverlo, se cuelga y vuelve a calificar.
				// ! Pruebas en cliente: 6 de junio
				if (
					myIframe.document.images['livecall'].src ===
					myIframe.image_livecall_ON.src
				) {
					console.log('Ejecutar colgado especial');
					// ? TEST: Colgar, calificar nocal
					myIframe.dialedcall_send_hangup('', '', '', '', 'YES');
				}

				myIframe.AutoDial_ReSume_PauSe(
					'VDADready',
					'',
					'',
					'',
					'',
					'',
					'',
					'YES'
				);
			}
			setTimeout(() => {
				cronometro = null;
				presionaEstados = -1;
				idAnterior = null;
			}, 5000);
		}
	}
	return false;
}

function regresaAlDefault() {
	$('#calificacionSelect').val('NULO');
	$('#cbComments').val('');
	$('#cbDate').val('');
	$('#cbTime').val('');
}

// ! califica.js =========================
// ! pausa.js =========================
var statusPausa = false;
let mamadasPendejas = false;
// =================================================================
// Id del timeout que se ejecutara si el estado de pausa
// tenia un tiempo limite
let idTimeoutTiempoLimite = null;
// =================================================================
// Id del registro de pausa cuando se expira el tiempo
let idReportePausa = '';
// =================================================================
function ocultapausa() {
	$('#codPausa').hide();
	statusCalificacion = false;
	$('#botonPausaCalificar').attr('disabled', true);
}

function pideRazonPausa(id) {
	if (statusPausa) {
		statusPausa = false;
		$.ajax({
			url: MODULOS + 'EstadosPausa/getStatusesSelect',
			type: 'POST',
			dataType: 'text',
			success: function (result) {
				var resp = JSON.parse(result);
				console.log(resp);
				if (resp.Estado == 'ok') {
					$('#codigosPausa').html('');
					if (resp.Registros.length > 0) {
						for (var i = 0; i < resp.Registros.length; i++) {
							if (id == resp.Registros[i].estado) {
								$('#codigosPausa').append(`
									<a 
										href="#" 
										style="padding: 5 px;" 
										class="letraSize col-sm-3  bg-success text-white text-center list-group-item list-group-item-secondary text-wrap" 
										onclick="enviaPausa(
											'${resp.Registros[i].estado}',1,${resp.Registros[i].tiempo_limite},'${resp.Registros[i].requiere_aprovacion}','${resp.Registros[i].cantidad}'
										)"
									>
										${resp.Registros[i].estado}-${resp.Registros[i].nombre}
									</a>`);
							} else {
								$('#codigosPausa').append(`
									<a 
										href="#" 
										style="padding: 5 px;" 
										class="letraSize col-sm-3  botonCalificar text-center list-group-item-action text-wrap" 
										onclick="enviaPausa('${resp.Registros[i].estado}',0,${resp.Registros[i].tiempo_limite},'${resp.Registros[i].requiere_aprovacion}','${resp.Registros[i].cantidad}')"
									>
										${resp.Registros[i].estado}-${resp.Registros[i].nombre}
									</a>
								`);
							}
						}
						if (!id) {
							document
								.getElementById('my_iframe')
								.contentWindow.PauseCodeSelectContent_create(
									'YES'
								);
						}
					} else {
						enviaPausa('PAUSA', 1, -1, '0');
					}
				} else {
					$('#ListaAlert').html(i18n.gettext(resp.Descripcion));
					crearTooltip();
				}
			},
			error: function (error) {
				console.log(error);
			},
		});
	}
}

function pausaAgente() {
	bloquearPlay = false;
	document
		.getElementById('my_iframe')
		.contentWindow.AutoDial_ReSume_PauSe(
			'VDADpause',
			'',
			'',
			'',
			'',
			'',
			'',
			'YES'
		);
	$('#codPausa').show();
	statusPausa = true;
	$('#botonPausaCalificar').attr('disabled', false);
	pideRazonPausa();
}
function truncaPausa() {
	Enpausa = false;
}
function enviaPausa(id, cant, tiempo_limite, requiere_aprovacion, cantidad, noCerrarModal) {
	/*
		El tiempo_limite determina en segundos cuando un agente a rebasado
		el tiempo limite en que puede estar en pausa. Si el tiempo_limite es
		< 0 la pausa no tendra tiempo limite.
		Si se requiere_aprovacion un supervisor y solo un supervisor
		puede desactivar la pausa, donde se generara un reporte de pausa.
	*/
	console.log(cantidad);
	if (cant == 0) {
		statusPausa = true;
		pideRazonPausa(id);
	} else {
		Enpausa = true;
		let tiempo_quepaso = 0;
		let pausa_contador = setInterval(HandleContador, 1000);
		function HandleContador() {
			let horas = Math.floor(tiempo_limite / 3600);
			let minutos = Math.floor((tiempo_limite % 3600) / 60);
			let segundos = tiempo_limite % 60;
			horas = String(horas).padStart(2, '0');
			minutos = String(minutos).padStart(2, '0');
			segundos = String(segundos).padStart(2, '0');

			$('#pause_time_left').text(
				'TIEMPO RESTANTE DE PAUSA: ' +
					horas +
					':' +
					minutos +
					':' +
					segundos
			);

			if (tiempo_limite > 0 || cantidad <= 0) {
				tiempo_limite--;
				tiempo_quepaso++;
			} else {
				Enpausa = false;
			}

			if (!Enpausa) {
				$('#pause_time_left').text('');
				$.ajax({
					url: 'EstadosPausa/resumePause',
					type: 'POST',
					data: {
						usuario: Usuario,
						campana: campanaActual,
						codigoPausa: id,
						tiempo: tiempo_quepaso,
					},
					dataType: 'text',
					success: function (response) {
						var res = JSON.parse(response);
						if (res.Estado == 'ok') {
							console.log('todo bien :)');
						} else {
							console.log('algo salio mal');
							console.log(res.Descripcion);
						}
					},
					error: function (res) {
						console.log(res);
					},
				});
				clearInterval(pausa_contador);
				tiempo_quepaso = 0;
			}
		}
		document
			.getElementById('my_iframe')
			.contentWindow.PauseCodeSelect_submit(id, 'YES');

		console.log('nocerrarmodal', noCerrarModal)
		if (!noCerrarModal) {
			ocultapausa();
		}

		if (cantidad <= 0) {
			console.log('Tiempo limite de pausa superado');
			Enpausa = false;
			crearRegistroReportePausa(id).then((_) => {
				if (requiere_aprovacion === '1') {
					$('#modalTiempoLimitePausa').modal('show');
					localStorage.setItem('idReportePausa', idReportePausa);
				}
				idTimeoutTiempoLimite = null;
			});
		}
		if (tiempo_limite > 0) {
			idTimeoutTiempoLimite = setTimeout(() => {
				console.log('Tiempo limite de pausa superado');
				Enpausa = false;
				crearRegistroReportePausa(id).then((_) => {
					if (requiere_aprovacion === '1') {
						$('#modalTiempoLimitePausa').modal('show');
						localStorage.setItem('idReportePausa', idReportePausa);
					}
					idTimeoutTiempoLimite = null;
				});
			}, tiempo_limite * 1000);
		} else {
			idTimeoutTiempoLimite = null;
			Enpausa = false;
		}
	}
}

function nextDialMan() {
	clearTimeout(idTimeoutTiempoLimite);
	bloquearRedial = true;
	if (bln_dial_block) {
		return;
	}
	bln_dial_block = true;
	if (!enLlamada) {
		if (!bloquearPlay || mamadasPendejas != 2) {
			mamadasPendejas = 2;
			bloquearPlay = true;
			document
				.getElementById('my_iframe')
				.contentWindow.AutoDial_ReSume_PauSe(
					'VDADpause',
					'',
					'',
					'',
					'',
					'',
					'',
					'YES'
				);
			document
				.getElementById('my_iframe')
				.contentWindow.PauseCodeSelectContent_create('YES');
			document
				.getElementById('my_iframe')
				.contentWindow.PauseCodeSelect_submit('NEXT', 'YES');
			setTimeout(() => {
				if (!enLlamada) {
					document
						.getElementById('my_iframe')
						.contentWindow.ManualDialNext(
							'',
							'',
							'',
							'',
							'',
							'0',
							'',
							'',
							'YES'
						);
				}
			}, 2000);
			otraFlag = true;
		} else {
			alert(
				'Acabas de presionar el boton de play, espera por la llamada'
			);
		}
	}
}

function playAgente() {
	clearTimeout(idTimeoutTiempoLimite);
	bandera_pausa = false;
	if (!enLlamada) {
		if (!bloquearPlay || mamadasPendejas != 1) {
			Enpausa = false;
			bloquearPlay = true;
			mamadasPendejas = 1;
			if (Manual === 'MANUAL') {
				nextDialMan();
			} else {
				if (_FORZAR_PAUSA && !_FORZAR_PAUSA_SONANDO) {
					enviaPausa(_FORZAR_PAUSA_CODIGO, 1, -1, '0');
				} else {
					document
						.getElementById('my_iframe')
						.contentWindow.AutoDial_ReSume_PauSe(
							'VDADready',
							'',
							'',
							'',
							'',
							'',
							'',
							'YES'
						);
				}
				// Eliminar el timeout por que ya se quito la pausa
			}
		} else {
			alert(
				'Acabas de presionar el boton de play, espera por la llamada'
			);
		}
	}
}

function detenerAgente() {
	$('#btnPlay').addClass('disabled');
	$('#btnPause').addClass('disabled');
	$('#btnPause').addClass('d-none');
	$('#btnRecord').html('<i class="fas fa-dot-circle controles"></i>');
}

// Funcion para hacer peticiones
function $_post(url, data) {
	return $.post(MODULOS + url, data)
		.then((r) => {
			if (r.Estado === 'ok') {
				return r;
			} else {
				throw r;
			}
		})
		.catch((e) => {
			throw e;
		})
		.catch((e) => {
			console.error(e);
			if (!e.Descripcion) {
				throw {
					Descripcion: 'Error desconocido',
				};
			}
			throw e;
		});
}

// Funciona para hacer el registro de reporte del estado de pausa
function crearRegistroReportePausa(pauseCode) {
	return $_post('HomeAgente/createPauseReport', { pauseCode })
		.then((r) => {
			idReportePausa = r.idReport;
		})
		.catch((e) => {});
}

// Funcion para cuando se cierra el modal si se requiere aprovacion del
// del supervisor
function reanudarAgenteTimepoLimiteExcedido() {
	const data = {
		usuario: $('#usuarioSupervisorPausa').val(),
		password: $('#passwordSupervisorPausa').val(),
		idReport: idReportePausa,
	};
	return $_post('HomeAgente/checkSupervisor', data)
		.then(() => {
			$('#passwordSupervisorPausa').val('');
			$('#usuarioSupervisorPausa').val('');
		})
		.catch((e) => {
			$('#passwordSupervisorPausa').val('');
			$('#usuarioSupervisorPausa').val('');
			throw e;
		});
}

$('#iniciarSupervisor').click((e) => {
	const m_error = $('#mensajeErrorTiempoLimitePausa');
	reanudarAgenteTimepoLimiteExcedido()
		.then((_) => {
			$('#modalTiempoLimitePausa').modal('hide');
			m_error.text('');
			m_error.hide();
			localStorage.removeItem('idReportePausa');
		})
		.catch((e) => {
			m_error.text(e.Descripcion);
			m_error.show();
		});
});

// Mostrar modal si reinicio pantalla
if (localStorage.getItem('idReportePausa')) {
	idReportePausa = localStorage.getItem('idReportePausa');
	$('#modalTiempoLimitePausa').modal('show');
}
// ! pausa.js =========================
// ! llamada.js =========================
var enGrabacion = true;
var enLlamada = false;
var puedoEnviarDTMF = false;
var otraFlag = false;
var enEspera = false;
var enTransferido = false;
var aTransferir = -1;
var enDispo = false;
var enDead = false;
var enQueue = false;
let bloquearPlay = false;
let cantidad = 0;
let bloquearCuelga = false;
let bloquearRedial = false;
let llamadas = [];
let leads_idDeLlamadas = {};
let llamadas_map = {};

// Tipo de transferencia
let num_tipoTransferencia = -1;

const vueAppHistorial = new Vue({
	el: '#vue-historial',
	data: {
		llamadas,
		mostrarHistorial: false,
		interval: -1,
	},
	methods: {
		abrirHistorial() {
			generarURLS();
			this.mostrarHistorial = true;
		},
		ocultarHistorial() {
			this.mostrarHistorial = false;
		},
	},
	computed: {
		llamadasReverse() {
			return this.llamadas.reverse();
		},
	},
});

///Que chingue a su madre Rodolfo
function generarURLS() {
	function addZero(numero) {
		if (numero < 10) return '0'.concat(numero);
		return numero;
	}
	llamadas.forEach((val, index, arr) => {
		const fechaActual = new Date();

		let lead_id = leads_idDeLlamadas[val.telefono];
		let fechaCompleta = val.fecha;

		if (fechaActual.getTime() - fechaCompleta.getTime() > 5 * 60 * 1000) {
			let fecha = ''.concat(
				fechaCompleta.getFullYear(),
				addZero(fechaCompleta.getMonth() + 1),
				addZero(fechaCompleta.getDate())
			);
			let horaCompleta = ''.concat(
				addZero(fechaCompleta.getHours()),
				addZero(fechaCompleta.getMinutes())
			);
			arr[
				index
			].URL = `/${RUTA_MAESTRA}/index.php/Televox/searchRecording?agente=${Usuario}&clave=${lead_id}${fecha}${horaCompleta}`;
		}
	});
}

function espera(cb) {
	var parametros = {
		Val: enEspera ? 0 : 1,
	};
	$.ajax({
		url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/espera',
		type: 'POST',
		data: parametros,
		dataType: 'text',
		success: function (result) {
			if (!enEspera) {
				enEspera = true;
				$('#btnesperao').removeClass('btn btn-info phone-tecla');
				$('#btnesperao').addClass('btn btn-info phone-tecla active');
			} else {
				enEspera = false;
				$('#btnesperao').removeClass('btn btn-info phone-tecla active');
				$('#btnesperao').addClass('btn btn-info phone-tecla');
			}

			if (cb) {
				setTimeout(() => {
					cb();
				}, 1000);
			}
		},
		error: function (data) {
			console.log(data);
			if (cb) {
				setTimeout(() => {
					cb();
				}, 1000);
			}
		},
	});
}

function salir(forzar = null) {
	if (DIALVOX_NEED_WA) {
		WhatsAppIframe.iframe.attr('src', RUTA_WA + '/Login/logout');
	}
	if (!salio) {
		if (enLlamada && !forzar) {
			$('#ListaAlert').html(
				i18n.gettext('No puedes salir mientras estas en llamada')
			);
			crearTooltip();
		} else {
			salio = true;
			window.location.assign(
				'/' + RUTA_MAESTRA + '/index.php/homeAgente/logout'
			);
		}
	}
}

// ! Correccion de version
function lanzaDispo() {
	setTimeout(() => lanzaCalificacion(), 3000);
}

let IngroupsTransfer = [];
let AgentesTransfer = [];
function transfiereLocalCloser(tipo, valor) {
	if (tipo == 1) {
		document
			.getElementById('my_iframe')
			.contentWindow.document.getElementById('XfeRGrouP').value = valor;
		document
			.getElementById('my_iframe')
			.contentWindow.document.getElementById('LocalCloser')
			.children[0].click();
	} else {
		let parametros = {
			tipo: tipo,
			valor: valor,
		};
		$.post(
			'/' + RUTA_MAESTRA + '/index.php/homeAgente/localCloserTransfer',
			parametros
		)
			.then((resp) => {
				console.log(resp);
				setTimeout(() => {
					cuelga();
				}, 3000);
			})
			.catch((err) => {
				console.log(err);
			});
	}
}
async function cargaIngroupsYAgentes() {
	await $.post(
		MODULOS + 'GrupoDeEntrada/seleccionarIngroupsTransferenciaCampana',
		{ campana: campanaActual }
	)
		.then((resp) => {
			let data = JSON.parse(resp);
			IngroupsTransfer = data.Ingroups;
		})
		.catch((err) => {
			console.log(err);
		});
	await $.post(
		'/' + RUTA_MAESTRA + '/index.php/homeAgente/agentesParaTransferir'
	)
		.then((resp) => {
			AgentesTransfer = resp.Registros;
		})
		.catch((err) => {
			console.log(err);
		});
}

function decideTransferenciaColgado(fuerzaColgado) {
	if (fuerzaColgado) {
		cuelga();
		return;
	}
	if (INICIAR_ENCUESTA_DEFECTO) {
		let encuesta = '' + ID_ENCUESTA_DEFECTO;
		let campana = '' + campanaActual;

		while (encuesta.length < 4) {
			encuesta = '0' + encuesta;
		}
		while (campana.length < 4) {
			campana = '0' + campana;
		}

		transfiere(2, '6969' + encuesta + campana + Usuario, true);
	} else {
		cuelga();
	}
}

function cuelga(forzado = null) {
	if (bln_hangup_block) {
		return;
	}
	bln_dial_block = false;
	if (!bloquearCuelga || (forzado != null && forzado == true)) {
		if (enEspera) {
			espera(() => {
				if (enGrabacion) grabaMaster();

				if (enLlamada || enDispo || enDead || enQueue) {
					if (cronometro === null) {
						cronometro = 0;
						lanzaDispo();
					}
				}

				document
					.getElementById('my_iframe')
					.contentWindow.dialedcall_send_hangup(
						'',
						'',
						'',
						'',
						'YES'
					);
				$('#btnPause').addClass('disabled');
				$('#btnPause').addClass('d-none');
				$('#btnPlay').addClass('disabled');
				$('#btnPlay').addClass('d-none');
				$('#btnespera').addClass('btn-info');
				$('#btnespera').removeClass('btn-secondary');
				bloquearPlay = false;
				bloquearRedial = false;
				enLlamada = false;
				enGrabacion = false;
				enTransferido = false;
				canalesExtras = [];
				//enEspera = false;
				aTransferir = -1;
				aPasado = false;
				cantidad++;
				if (cantidad == 2) {
					bloquearCuelga = true;
					setTimeout(() => {
						bloquearCuelga = false;
					}, 10000);
				}
			});
		} else {
			if (enGrabacion) grabaMaster();

			if (enLlamada || enDispo || enDead || enQueue) {
				if (cronometro === null) {
					cronometro = 0;
					lanzaDispo();
				}
			}

			document
				.getElementById('my_iframe')
				.contentWindow.dialedcall_send_hangup('', '', '', '', 'YES');
			$('#btnPause').addClass('disabled');
			$('#btnPause').addClass('d-none');
			$('#btnPlay').addClass('disabled');
			$('#btnPlay').addClass('d-none');
			$('#btnespera').addClass('btn-info');
			$('#btnespera').removeClass('btn-secondary');
			bloquearPlay = false;
			bloquearRedial = false;
			enLlamada = false;
			enGrabacion = false;
			enTransferido = false;
			canalesExtras = [];
			//enEspera = false;
			aTransferir = -1;
			aPasado = false;
			cantidad++;
			if (cantidad == 2) {
				bloquearCuelga = true;
				setTimeout(() => {
					bloquearCuelga = false;
				}, 10000);
			}
		}
	}
}

function controlTrans(tipo) {
	if (!enTransferido) {
		if (tipo == aTransferir) {
			aTransferir = -1;
		} else {
			aTransferir = tipo;
			$('#pantalla').prop('disabled', false);
			$('#pantalla').val('');
		}
	} else {
		transfiere(tipo);
	}
}

function transfiere(tipo, phoneNumber, esEncuesta) {
	num_tipoTransferencia = tipo;
	if (!enTransferido) {
		telefonoActualTripartita =
			tipo === 1 ? $('#pantalla').val() : 'Transferencia ciega';

		var parametros = {
			phone_number: phoneNumber ? phoneNumber : $('#pantalla').val(),
			value: tipo == 2 ? 'BLIND_TRANSFER' : 'DIAL_WITH_CUSTOMER',
		};
		$.ajax({
			url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/transferir',
			type: 'POST',
			data: parametros,
			dataType: 'text',
			success: function (result) {
				var resp = JSON.parse(result);
				enTransferido = true;
				if (tipo == 2) {
					setTimeout(() => {
						decideTransferenciaColgado(esEncuesta);
					}, 2000);
				}
			},
			error: function (data) {
				console.log(data);
			},
		});
	} else {
		if (enEspera && tipo == 2) {
			espera(() => {
				var parametros = {
					value: tipo == 2 ? 'LEAVE_3WAY_CALL' : 'HANGUP_XFER',
				};

				$.ajax({
					url:
						'/' + RUTA_MAESTRA + '/index.php/homeAgente/transferir',
					type: 'POST',
					data: parametros,
					dataType: 'text',
					success: function (result) {
						var resp = JSON.parse(result);
						enTransferido = false;
						telefonoActualTripartita = '';
						aTransferir = -1;
						aPasado = false;
						num_tipoTransferencia = -1;
						if (tipo == 2) {
							setTimeout(() => {
								decideTransferenciaColgado(esEncuesta);
							}, 2000);
						}
					},
					error: function (data) {
						console.log(data);
					},
				});
			});
		} else {
			var parametros = {
				value: tipo == 2 ? 'LEAVE_3WAY_CALL' : 'HANGUP_XFER',
			};

			$.ajax({
				url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/transferir',
				type: 'POST',
				data: parametros,
				dataType: 'text',
				success: function (result) {
					var resp = JSON.parse(result);
					enTransferido = false;
					telefonoActualTripartita = '';
					aTransferir = -1;
					aPasado = false;
					num_tipoTransferencia = -1;
					if (tipo == 2) {
						setTimeout(() => {
							decideTransferenciaColgado(esEncuesta);
						}, 2000);
					}
				},
				error: function (data) {
					console.log(data);
				},
			});
		}
	}
	$('#pantalla').val('');
}

function marcaManual(dtmf) {
	clearTimeout(idTimeoutTiempoLimite);
	if (bln_dial_block) {
		return;
	}
	bln_dial_block = true;
	document
		.getElementById('my_iframe')
		.contentWindow.NeWManuaLDiaLCalL('NO', '', '', '', '', 'YES');
	document
		.getElementById('my_iframe')
		.contentWindow.document.getElementById('MDPhonENumbeR').value = dtmf;
	document
		.getElementById('my_iframe')
		.contentWindow.NeWManuaLDiaLCalLSubmiT('NOW', 'YES');
	otraFlag = true;
}

function dejaGrabar() {
	var parametros = {};
	$.ajax({
		url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/dejaGrabar',
		type: 'POST',
		data: parametros,
		dataType: 'text',
		success: function (result) {
			var resp = JSON.parse(result);
			if (resp.Estado == 'ok') {
				enGrabacion = false;
				$('#btnRecord').html(
					'<i class="fas fa-dot-circle controles"></i>'
				);
			} else {
				$('#ListaAlert').html(i18n.gettext(resp.Descripcion));
				crearTooltip();
			}
		},
		error: function (data) {
			console.log(data);
		},
	});
}

function graba() {
	var parametros = {};
	$.ajax({
		url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/graba',
		type: 'POST',
		data: parametros,
		dataType: 'text',
		success: function (result) {
			var resp = JSON.parse(result);
			if (resp.Estado == 'ok') {
				enGrabacion = true;
				$('#btnRecord').html(
					'<i class="far fa-stop-circle controles"></i>'
				);
			} else {
				$('#ListaAlert').html(i18n.gettext(resp.Descripcion));
				crearTooltip();
			}
		},
		error: function (data) {
			console.log(data);
		},
	});
}

function grabaMaster() {
	if (enLlamada) {
		if (enGrabacion) {
			dejaGrabar();
		} else {
			graba();
		}
	}
}

function redial() {
	bloquearPlay = true;
	clearTimeout(idTimeoutTiempoLimite);
	console.log('Intenta ejecutar redial');
	if (!dialvoxCRM) {
		return;
	}

	if (!enLlamada && !bloquearRedial) {
		console.log('Ejecuta redial');
		bloquearRedial = true;
		document
			.getElementById('my_iframe')
			.contentWindow.AutoDial_ReSume_PauSe(
				'VDADpause',
				'',
				'',
				'',
				'',
				'',
				'',
				'YES'
			);
		document
			.getElementById('my_iframe')
			.contentWindow.PauseCodeSelectContent_create('YES');
		document
			.getElementById('my_iframe')
			.contentWindow.PauseCodeSelect_submit('REDIAL', 'YES');
		llamadas.push({
			telefono: dialvoxCRM
				? dialvoxCRM.toString()
				: traducirFrase('Desconocido'),
			fecha: new Date(),
			tipo: 'Saliente',
		});
		llamadas_map[
			dialvoxCRM ? dialvoxCRM.toString() : traducirFrase('Desconocido')
		] = true;
		console.log(dialvoxCRM);
		marcaManual(dialvoxCRM.toString());
	}
}

function llama() {
	clearTimeout(idTimeoutTiempoLimite);

	if (_FORZAR_PAUSA && _FORZAR_PAUSA_SONANDO && $('#pantalla').val() === '') {
		playAgente();
		return;
	}

	if (!enLlamada) {
		if (
			new RegExp('^[0-9]{1,' + TELEFONO_LIMITE + '}$').test(
				$('#pantalla').val()
			) &&
			$('#pantalla').val().length <= TELEFONO_LIMITE &&
			$('#pantalla').val().length >= 1
		) {
			llamadas.push({
				telefono: $('#pantalla').val(),
				fecha: new Date(),
				tipo: 'Saliente',
			});
			llamadas_map[$('#pantalla').val()] = true;

			marcaManual($('#pantalla').val());
			$('#pantalla').val('');
		} else {
			if (
				$('#pantalla').val().length <= TELEFONO_LIMITE &&
				$('#pantalla').val().length >= 1
			)
				$('#ListaAlert').html(
					i18n.gettext('Teclea el telefono entre 1 y ') +
						TELEFONO_LIMITE +
						i18n.gettext(' digitos')
				);
			else
				$('#ListaAlert').html(
					i18n.gettext('El numero que ingresaste no es valido')
				);
			crearTooltip();
		}
	} else {
		if (
			new RegExp('^[0-9]{1,' + TELEFONO_LIMITE + '}$').test(
				$('#pantalla').val()
			)
		) {
			if (aTransferir != -1) {
				transfiere(aTransferir);
			} else {
				sendDTMF($('#pantalla').val());
				$('#pantalla').val('');
			}
		} else {
			$('#ListaAlert').html(
				i18n.gettext('El numero que ingresaste no es valido')
			);
			crearTooltip();
		}
	}
}

function sendDTMF(dtmf) {
	var parametros = {
		dtmf: dtmf,
	};
	$.ajax({
		url: '/' + RUTA_MAESTRA + '/index.php/homeAgente/sendDTMF',
		type: 'POST',
		data: parametros,
		dataType: 'text',
		success: function (result) {
			var resp = JSON.parse(result);
			if (resp.Estado == 'ok') {
			} else {
				$('#ListaAlert').html(i18n.gettext(resp.Descripcion));
				crearTooltip();
			}
		},
		error: function (data) {
			console.log(data);
		},
	});
}

// Llamadas superiores a tripartitas - INICIO

// Guarda las transferencias superiores a tripartita
let canalesExtras = [];

function abrirModalNuevoCanal() {
	$('#nuevoCanal_modal').modal('show');
}

function marcaManualNuevoCanal() {
	if (enTransferido && aTransferir === 1) {
		document
			.getElementById('my_iframe')
			.contentWindow.NeWManuaLDiaLCalL('NO', '', '', '', '', 'YES');
		document
			.getElementById('my_iframe')
			.contentWindow.document.getElementById('MDPhonENumbeR').value = $(
			'#nuevoCanal_telefono'
		).val();
		document
			.getElementById('my_iframe')
			.contentWindow.NeWManuaLDiaLCalLSubmiT('NOW', 'YES');
		canalesExtras.push({
			telefono: $('#nuevoCanal_telefono').val(),
			id: -1,
		});
		$('#nuevoCanal_modal').modal('hide');
		$('#nuevoCanal_telefono').val('');
	}
}
// Llamadas superiores a tripartitas - END
// ! llamada.js =========================
// ! crm.js =========================
var banderaCRM = true;

function cambiaCRM(id) {
	if (banderaCRM) {
		$("#crm").hide();
		banderaCRM = false;
		var parametros = {};
		$.ajax({
			url: "/" + RUTA_MAESTRA + "/index.php/homeAgente/getUrl",
			type: "GET",
			data: parametros,
			dataType: "text",
			success: function (result) {
				banderaCRM = true;
				var r = JSON.parse(result);
				var url = r.url.toString().trim();
				if (url == false || url === "" || url == null || url == "false") {
					url = "caritafeliz.html"
				} else {
					url = url.replace("--dialvoxCRM--", dialvoxCRM)
					url = url.replace("--dialvoxgestor--", Usuario)
					url = url.replace("--TipoLlamadaDialvox--", tipoLlamada)

				}
				//$("#crm1" + id).attr('src', url);
				document.getElementById('crm1' + id).src = url;

			},
			error: function (data) {
				console.log(data);

				return "error";
			}
		});
	}
}
var banderaCRM2 = true;

function cambiaCRM2(id) {
	if (banderaCRM2) {
		$("#crm").hide();
		banderaCRM2 = false;
		var parametros = {};
		$.ajax({
			url: "/" + RUTA_MAESTRA + "/index.php/homeAgente/getUrl2",
			type: "POST",
			data: parametros,
			dataType: "text",
			success: function (result) {
				banderaCRM2 = true;
				var r = JSON.parse(result);
				var url = r.url.toString().trim();
				if (url == false || url === "" || url == null || url == "false") {
					$('#crm1' + id).removeClass("col-sm-6");
					$('#crm1' + id).addClass("col-sm-12");
					$('#crm2' + id).css('width', 0);
					$('#crm2' + id).css('height', 0);
				} else {
					url = url.replace("--dialvoxCRM--", dialvoxCRM)
					url = url.replace("--dialvoxgestor--", Usuario)
					url = url.replace("--TipoLlamadaDialvox--", tipoLlamada)
					document.getElementById('crm2' + id).src = url;
				}


			},
			error: function (data) {
				console.log(data);
			}
		});
	}
}

function cargaCRMS() { }
// ! crm.js =========================
// ! WhatsApp.js =========================
function sweetConfirm(message) {
    return Swal.fire({
        type: "question",
        title: i18n.gettext("¿Estas seguro?"),
        text: message,
        showCancelButton: true,
        showConfirmButton: true

    })
}

function sweetSuccesEdit() {
    Swal.fire({
        type: "success",
        title: i18n.gettext("Registro actualizado"),
        html: i18n.gettext("Se han guardado exitosamente los cambios")
    })
}

function sweetSuccessAdd() {
    Swal.fire({
        type: "success",
        title: i18n.gettext("Registro exitoso"),
        html: i18n.gettext("Se ha guardado con éxito su nuevo registro")
    })
}
function sweetSuccessCustom(message) {
    Swal.fire({
        type: "success",
        title: i18n.gettext("¡Exito!"),
        html: message
    })
}
function sweetSuccessDelete() {
    Swal.fire({
        type: "success",
        title: i18n.gettext("¡Eliminado!"),
        html: i18n.gettext("Registro eliminado con éxito")
    })
}

function sweetFail() {
    Swal.fire({
        type: "error",
        title: i18n.gettext("Algo ha salido mal"),
        html: i18n.gettext("Ha ocurrido un error al tratar de completar la acción anterior")
    })
}

function sweetFailCustom(text) {
    let parts = text.split("<br>")[0]
    if (text.split("<br>")[1]) {
        parts += "<br><span class='text-danger font-weight-bold'> Error #"
        parts += text.split("<br>")[1]
        parts += "</span>"
    }
    Swal.fire({
        type: "error",
        title: i18n.gettext("Algo ha salido mal"),
        html: parts
    })
}

function sweetWaiterCustom(text) {
    SweetAlert.fire({
        type: "info",
        title: i18n.gettext("Procesando"),
        html: text,
        onBeforeOpen: () => {
            Swal.showLoading()
        }
    });
}

function sweetWaiterMessages() {
    SweetAlert.fire({
        type: "info",
        title: i18n.gettext("Procesando"),
        html: i18n.gettext("Enviando tus mensajes"),
        onBeforeOpen: () => {
            Swal.showLoading()
        }
    });
}

function sweetSuccessCustom(text) {
    Swal.fire({
        type: "success",
        title: i18n.gettext("¡Éxito!"),
        html: text
    })
}
// ! WhatsApp.js =========================
// ! chat.js =========================
$(document).ready(function () {
    $('.modal').modal();
    $('select').formSelect();
});

//-------------------------Chat-----------------------------------

function openForm() {
    document.getElementById("myForm").style.display = "block";
}

function llenaListaChat() {

    $('#chatSel').append("<option value='1'>Juanito</option>");
    $('#chatSel').append("<option value='2'>Pepe</option>");
    $('#chatSel').append("<option value='3'>Pedro</option>");
    $('#chatSel').append("<option value='4'>Paco</option>");
    $('#chatSel').append("<option value='5'>Jason</option>");

    $('select').formSelect();

}

function closeForm() {
    document.getElementById("myForm").style.display = "none";
}

//-------------------------Chat-----------------------------------

llenaListaChat();

var app = new Vue({
    el: '#chats',
    data: {
        listaSalasActivas: new Map(),
        mensajesSalasActivas: [],
        salaActiva: "",
        usuarios: [],
        salas: [],
        salaModal: ""

    }
})

const socket = io('https://' + document.domain + ':2021');
socket.on("connect", (data) => {
    socket.emit("firstTime", { usuario: Usuario, socketId: socket.id })
});
socket.on("finallyConnect", (data) => {
    data.Mesajes.forEach(mensaje => {
        if (app.listaSalasActivas.has(mensaje.sala)) {
            app.mensajesSalasActivas[mensaje.sala].append(mensaje)
        }
        else {
            app.listaSalasActivas.set(mensaje.sala, mensaje.nombreSala);
            app.mensajesSalasActivas[mensaje.sala] = [mensaje];
        }
    });
})
socket.on("tryJoin", (data) => {
    socket.emit("join", { usuario: Usuario, socketId: socket.id, idSala: data.idSala })
})
socket.on("finallyJoin", (data) => {
    app.listaSalasActivas.set(data.sala, data.nombreSala);
    app.mensajesSalasActivas[data.sala] = [];
    data.Mensajes.forEach(mensaje => {
        mensaje.sala = data.idSala
        app.mensajesSalasActivas[mensaje.sala].append(mensaje);
    })
})
socket.on("receive", (data) => {
    app.mensajesSalasActivas[data.Mensaje.sala].append(data.Mensaje);
})
function sendMessage(to, contenido) {
    socket.emit('send', { destinatario: to, contenido: contenido });
}
// ! chat.js =========================
// ! v2/common.js =========================
// TODO: Mover a un archivo unificado ==================
/**
 * Function para agregar manejadores a peticiones estandarizadas, deben cumplir con la forma ```{ Estado: "ok" | "error", ...}```
 *
 * @param {Promise} promise Promesa de la peticion
 * @param {(any) => void} cb Callback de exito
 * @param {(mensaje: string) => void} cb_err Callback de error
 */
function manejarPeticionEstandar(promise, cb, cb_err = console.log) {
	promise
		.then(function (r) {
			if (r.Estado === 'ok') {
				cb(r);
			} else {
				cb_err(r.Descripcion);
			}
		})
		.catch(function (e) {
			cb_err(e.message);
		});
}

function prevenirEventoHTML(e) {
	if (e.preventDefault) {
		e.preventDefault();
	}
}

function applyClickListener(id) {
	return function (listener) {
		document.getElementById(id).addEventListener('click', listener);
	};
}
// ! v2/common.js =========================
// ! v2/transferencia.agentes.js =========================
const grupoDefault = GRUPO_AGENTE;
const agentesActuales = {};

/**
 * .modal-transferencia-contenedor Contenedor de todo lo de transferencias a agente
 * #modal-transferencia-grupos Select de los grupos de agente
 * .modal-transferencia-contenedor-agente Contendor del listado de botones de agentes
 * #modal-transferencia-mensaje Mensaje para cualquiera de las dos transferencias
 * .modal-transferencia Modal para las transferencias a grupos o agentes
 */

function mostrarTransferenciaAgente() {
	// Quitar d-none de contenedor modal-transferencia-agente
	$('.modal-transferencia-agente').modal();

	document
		.querySelector('.modal-transferencia-contenedor')
		.classList.remove('d-none');
}

function ocultarTransferenciaAgente() {
	$('.modal-transferencia-agente').modal('hide');
	mensajeSeleccionLimpiar();
}

/**
 * Cargar los grupos de agentes en listados de botones
 * @param {{Registros: {id: string, Grupo: string}[]}} grupos Grupos[]
 */
function cargarGrupoAgentes(grupos) {
	const select = document.querySelector('#modal-transferencia-grupos');
	select.innerHTML = ''; // Limpiar opciones existentes

	if (grupoDefault === '') {
		const option = document.createElement('option');
		option.value = '';
		option.textContent = 'Selecciona un grupo';
		select.appendChild(option);
	}

	grupos.Registros.forEach((grupo) => {
		const option = document.createElement('option');
		option.value = grupo.id;
		option.textContent = grupo.Grupo;
		select.appendChild(option);
	});

	select.value = grupoDefault;
}

/**
 *
 * @param {{Registros: {usuario: string, nombre: string, estado: string}[]}} agentes
 */
function cargarAgentes(agentes, listener) {
	const contenedor = document.querySelector(
		'.modal-transferencia-contenedor-agentes'
	);
	contenedor.innerHTML = ''; // Limpiar agentes existentes
	Object.keys(agentesActuales).forEach((key) => delete agentesActuales[key]); // Limpiar mapa de agentesActuales

	if (!agentes.Registros || agentes.Registros.length === 0) {
		contenedor.innerHTML = 'No hay agentes disponibles para transferencia';
	}

	agentes.Registros.forEach((agente) => {
		const boton = document.createElement('button');
		boton.name = agente.usuario;
		boton.textContent = agente.nombre;
		boton.setAttribute('data-estado', agente.estado);
		boton.classList.add('btn');
		boton.classList.add('p-1');

		boton.setAttribute('data-toggle', 'tooltip');
		boton.setAttribute('data-placement', 'top');

		switch (agente.estado) {
			case 'PAUSED':
				boton.classList.add('btn-warning');
				boton.setAttribute('title', 'Pausado');
				break;
			case 'INCALL':
				boton.classList.add('btn-success');
				boton.setAttribute('title', 'En llamada');
				break;
			case 'READY':
				boton.classList.add('btn-info');
				boton.setAttribute('title', 'Disponible');
				break;

			default:
				boton.classList.add('btn-secondary');
				break;
		}

		contenedor.appendChild(boton);

		boton.addEventListener('click', () =>
			listener(boton, agente.usuario, agente.nombre)
		);

		agentesActuales[agente.usuario] = agente;
	});

	$('[data-toggle="tooltip"]').tooltip();
}

/**
 *
 * @param {HTMLButtonElement} boton
 */
function seleccionarBoton(boton) {
	boton.classList.remove('btn-secondary');
	boton.classList.remove('btn-info');
	boton.classList.remove('btn-warning');
	boton.classList.remove('btn-success');

	boton.classList.add('btn-primary');
	boton.style = 'transform: scale(1.1)';
}

/**
 *
 * @param {HTMLButtonElement} boton
 */
function deseleccionarBoton(boton) {
	boton.classList.remove('btn-secondary');
	boton.classList.remove('btn-info');
	boton.classList.remove('btn-warning');
	boton.classList.remove('btn-success');
	boton.classList.remove('btn-primary');
	boton.style = 'transform: scale(1)';

	const estado = boton.getAttribute('data-estado');
	switch (estado) {
		case 'PAUSED':
			boton.classList.add('btn-warning');
			break;
		case 'INCALL':
			boton.classList.add('btn-success');
			break;
		case 'READY':
			boton.classList.add('btn-info');
			break;

		default:
			boton.classList.add('btn-secondary');
			break;
	}
}

function actualizarGrupo(listener) {
	const select = document.querySelector('#modal-transferencia-grupos');
	select.addEventListener('change', (event) => {
		listener(event.target.value);
	});
}

/**
 *
 * @param {(usuario: string, nombre: string) => void} listener
 */
function seleccionarAgente(listener) {
	const botones = document.querySelectorAll(
		'.modal-transferencia-contenedor-agentes button'
	);
	botones.forEach((boton) => {
		boton.addEventListener('click', () => {
			listener(boton.name, boton.textContent);
		});
	});
}

function mensajeSeleccion(nombre) {
	const mensaje = document.querySelector('#modal-transferencia-mensaje');
	mensaje.textContent = `Vuelve a hacer clic para confirmar la transferencia a ${nombre}`;
}

function mensajeSeleccionLimpiar() {
	const mensaje = document.querySelector('#modal-transferencia-mensaje');
	mensaje.textContent = 'Haz clic en el agente para transferir la llamada';
}

function transferirAAgente(agente) {
	transfiereLocalCloser(2, agente);
	$('.modal-transferencia-agente').modal('hide');
}

function abrirTransferencia(listener) {
	$('.agentesTransfer').click((e) => {
		Swal.close();
		listener(e);
	});
}

(function (args) {
	function init({
		abrirTransferencia,
		cargarGrupoAgentes,
		cargarAgentes,
		grupoDefault,
		actualizarGrupo,
		mensajeSeleccion,
		mensajeSeleccionLimpiar,
		seleccionarBoton,
		deseleccionarBoton,
		seleccionarAgente,
		transferirAAgente,
		mostrarTransferenciaAgente,
		ocultarTransferenciaAgente,
	}) {
		this.grupo = grupoDefault;
		this.botonActual = null;
		this.agente = {
			id: '',
			nombre: '',
		};

		abrirTransferencia((e) => {
			prevenirEventoHTML(e);

			mostrarTransferenciaAgente();

			obtenerGruposDeAgente((grupos) => {
				cargarGrupoAgentes(grupos);
				obtenerAgentesParaTransferencia(this.grupo, (agentes) => {
					this.botonActual = null;
					cargarAgentes(agentes, listenerAgente);
					this.limpiarAgente();
				});
			});
		});

		actualizarGrupo((valor) => {
			obtenerAgentesParaTransferencia(valor, (agentes) => {
				mensajeSeleccionLimpiar();
				this.botonActual = null;
				cargarAgentes(agentes, listenerAgente);
				this.limpiarAgente();
			});
		});

		this.limpiarAgente = function () {
			this.agente.id = '';
			this.agente.nombre = '';
		};

		const listenerAgente = (button, agente, nombre) => {
			if (this.agente.id === agente) {
				transferirAAgente(agente);
				console.log('transferir! a', agente);
				ocultarTransferenciaAgente();
				this.limpiarAgente();
			} else {
				mensajeSeleccion(nombre);
				if (this.botonActual) {
					deseleccionarBoton(this.botonActual);
				}
				seleccionarBoton(button);
				this.botonActual = button;
				this.agente.id = agente;
				this.agente.nombre = nombre;
			}
		};

		function obtenerGruposDeAgente(cb, cb_err) {
			manejarPeticionEstandar(
				$.post(
					'/' +
						RUTA_MAESTRA +
						'/index.php/GrupoAgentes/getGroupsSelect'
				),
				cb,
				cb_err
			);
		}

		function obtenerAgentesParaTransferencia(grupo, cb, cb_err) {
			manejarPeticionEstandar(
				$.post(
					'/' +
						RUTA_MAESTRA +
						'/index.php/Usuarios/getAgentesParaTransferencia',
					{ grupo }
				),
				cb,
				cb_err
			);
		}
	}

	window.initTransferenciaAgentes = function () {
		init(args);
	};
})({
	abrirTransferencia: abrirTransferencia, // Boton para abrir transferencias de agentes
	cargarGrupoAgentes: cargarGrupoAgentes,
	cargarAgentes: cargarAgentes,
	grupoDefault,
	seleccionarAgente,
	mensajeSeleccion,
	actualizarGrupo,
	transferirAAgente,
	mostrarTransferenciaAgente,
	mensajeSeleccionLimpiar,
	seleccionarBoton,
	deseleccionarBoton,
	ocultarTransferenciaAgente,
});

// ! v2/transferencia.agentes.js =========================


