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,
		llamadaReproduciendose: null,
		audioLlamada: new Audio(),
		audioPaused: false,
		audioDuracion: 0,
		audioReproducido: 0
	},
	methods: {
		abrirHistorial() {
			if (this.mostrarHistorial) {
				this.mostrarHistorial = false;

				this.emptyAudio()
				return;
			} 
			generarURLS();
			this.mostrarHistorial = true;
		},
		ocultarHistorial() {
			this.emptyAudio()

			this.mostrarHistorial = false;
		},
		cargarHistorial() {
			$.get('/' + RUTA_MAESTRA + '/index.php/homeAgente/llamadasDeHoy')
				.then(function (d) {
					const data = JSON.parse(d)

					if (data.Estado === 'ok') {
						const llamadasFormato = data.Data.items.map(v => 
							// ? Convertir la fecha de string a Date
							Object.assign(v, {
								fecha: new Date(v.fecha)
							})
						).sort(
							// ? Ordenar descendente
							(a, b) => a.fecha.getTime() - b.fecha.getTime()
						)
						llamadas.push(...llamadasFormato)
					}
				}).catch(err => {})
		},
		formatTime(time = new Date()) {
			const hours = time.getHours().toString().padStart(2, '0');
			const minutes = time.getMinutes().toString().padStart(2, '0');

			return `${hours}:${minutes}`;
		},
		reproducirGrabacion(llamada) {
			if (llamada.URL) {
				this.llamadaReproduciendose = llamada
				this.audioLlamada.src = llamada.URL
				this.audioLlamada.load();
			}
		},
		esGrabacionReproducida(llamada) {
			return this.llamadaReproduciendose && this.llamadaReproduciendose.fecha.getTime() === llamada.fecha.getTime()
		},
		pausar() {
			this.audioLlamada.pause()
		},
		continuar() {
			this.audioLlamada.play()
		},
		detener() {
			this.emptyAudio()
		},
		reiniciar() {
			this.audioLlamada.currentTime = 0;
			this.audioLlamada.play()
		},
		emptyAudio() {
			this.audioLlamada.pause()
			this.audioLlamada.currentTime = 0;
			this.audioLlamada.src = '';
			this.audioLlamada.load();
			this.audioDuracion = 0;
			this.audioReproducido = 0;
			this.llamadaReproduciendose = null;
		}
	},
	computed: {
		llamadasReverse() {
			return [...this.llamadas].reverse();
		},
		grabacionEnPlay() {
			return !this.audioPaused
		}
	},
	mounted: function () {
		this.cargarHistorial()
		this.audioLlamada.addEventListener("canplay", () => {
			if (this.audioLlamada.src !== "") {
				this.audioLlamada.play()
			}
		})
		
		this.audioLlamada.addEventListener("pause", () => {
			this.audioPaused = true
		})
		this.audioLlamada.addEventListener("play", () => {
			this.audioPaused = false
		})
		this.audioLlamada.addEventListener("loadedmetadata", () => {
			this.audioDuracion = formatDuration(this.audioLlamada.duration)
		})
		this.audioLlamada.addEventListener("timeupdate", () => {
			this.audioReproducido = formatDuration(this.audioLlamada.currentTime)
		})
	}
});

// ? Formato de tiempo
function formatDuration(seconds = 0) {
    const m = Math.floor(seconds / 60);
    const s = Math.floor(seconds % 60);
    return `${m}:${s < 10 ? '0' : ''}${s}`;
}

// ? Guardar lead_id de las llamadas por telefono, caso de llamadas salientes
function setLeadIdByPhone(phone_number, lead_id) {
	for (let i = llamadas.length - 1; i >= 0; i--) {
		const llamada = llamadas[i];

		if (llamada.telefono === phone_number && !llamada.lead_id) {
			llamadas[i].lead_id = lead_id;
			break;
		}
	}
}

/// ? Generar urls al abrir modal del historial de llamadas
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 = val.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 (enDead) {
		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()
				: (MOSTRAR_EN_LIMITE ? dialvoxCRM.toString() : traducirFrase('Desconocido')),
			fecha: new Date(),
			tipo: 'Saliente',
		});
		llamadas_map[
			dialvoxCRM ? dialvoxCRM.toString() : (MOSTRAR_EN_LIMITE ? dialvoxCRM.toString() : traducirFrase('Desconocido'))
		] = true;
		console.log(dialvoxCRM);
		marcaManual(dialvoxCRM.toString());
	}
}

function llama() {
	clearTimeout(idTimeoutTiempoLimite);

	if (!enLlamada) {
		
		if (_FORZAR_PAUSA && _FORZAR_PAUSA_SONANDO) {
			playAgente();
			return;
		}

		if (
			new RegExp('^[0-9]{4,' + TELEFONO_LIMITE + '}$').test(
				$('#pantalla').val()
			) &&
			$('#pantalla').val().length <= TELEFONO_LIMITE &&
			$('#pantalla').val().length >= 4
		) {
			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 >= 4
			)
				$('#ListaAlert').html(
					i18n.gettext('Teclea el telefono entre 4 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
