import {
  guardarLocalStorage,
  obtenerDatosLocalStorage,
  redireccionUrl,
  peticionPostGenerica,
  establecerDatosDeEnvio,
  comprobarSiEsArray
} from "../helpers/main_modulos.js";
import { opcionesDePeticion } from "../class/opciones-de-peticion.js";

require("dotenv").config();
const { ipcRenderer } = require("electron");

/* VARIABLES GLOBALES */

let estado = false;
let paginaActual = 0;
let mensajeDeAviso = "SIGA";
let datosAforo;
let intervaloID = false;
let intervaloIniciado;

/* CONSTANTES */

/* Document Object Model (DOM) */
const $body = document.getElementById("body");
const $modalActualizarDatos = document.getElementById("modal-actualizar-datos");
const $cuposDisponibles = document.getElementById("cupos-disponibles");
const $maximaOcupaciom = document.getElementById("maxima-ocupacion");
const $ocupacionActual = document.getElementById("ocupacion-actual");
const $mensajeAviso = document.getElementById("mensaje-aviso");
const $aviso = document.getElementById("aviso");
const botonActualizarDatos = "#svg-actualizar";
const botonAyuda = "#svg-ayuda";
const botonCerrar = "#svg-cerrar";

const ocupacionMaxima = {
  etiqueta: $maximaOcupaciom,
  contenido: null
}

const ocupacionActual = {
  etiqueta: $ocupacionActual,
  contenido: null
}

const cuposDisponibles = {
  etiqueta: $cuposDisponibles,
  contenido: null
}

/* Back-end */
const urlBase = "https://aforoapp.herokuapp.com/";

const urlBackend = {
  token: urlBase + "token",
  actualizarDatos: urlBase + "actualizarAforo",
  aumentarCupos: urlBase + "aumentarCuposDisponibles",
  disminuirCupos: urlBase + "disminuirCuposDisponibles",
};

let bodyDataAforo = null;
const opcionesActualizarAforo = new opcionesDePeticion("POST", JSON.stringify(bodyDataAforo),{ "Content-Type": "application/json", "x-token": process.env.xtoken });

/* FUNCIONES */

function actualizarDatosAforo(datoDetectado) {
  datosAforo.cuposDisponibles += +datoDetectado;
  datosAforo.ocupacionActual += -datoDetectado;
}

function establecerContenidoEnElementosDOM(arrayDeObjetosEtiquetaValor) {
  comprobarSiEsArray(arrayDeObjetosEtiquetaValor);
  arrayDeObjetosEtiquetaValor.map((objeto) => {
    objeto.etiqueta.textContent = objeto.contenido;
  });
}

function actualizarValoresAforoDOM(objetoDatos) {
  $cuposDisponibles.textContent = objetoDatos.cuposDisponibles;
  $maximaOcupaciom.textContent = objetoDatos.aforo;
  $ocupacionActual.textContent = objetoDatos.ocupacionActual;
}

function comprobarInternet() {
  intervaloIniciado = true;
  intervaloID = setInterval(() => {
    let hayInternet = navigator.onLine;
    if (!hayInternet) {
      opcionesActualizarAforo.body = JSON.stringify(establecerDatosDeEnvio(datosAforo));
      peticionPostGenerica(urlBackend.actualizarDatos, opcionesActualizarAforo).then(
        () => {
          intervaloIniciado = false;
          clearInterval(intervaloID);
        }
      );
    }
  }, 30000);
}

function actualizarAviso(cuposDisponibles) {
  if (mensajeDeAviso === "SIGA" && cuposDisponibles === 0) {
    mensajeDeAviso = "NO PASE";
    $mensajeAviso.textContent = mensajeDeAviso;
    $aviso.classList.replace("c-aviso--js-bg-verde", "c-aviso--js-bg-rojo");
    $cuposDisponibles.classList.replace(
      "c-targeta__cantidad--color-verde",
      "c-targeta__cantidad--color-rojo"
    );
    return true;
  }

  if (cuposDisponibles < 0) {
    $body.classList.add("body--js-shadow");
    return true;
  }

  if (mensajeDeAviso === "NO PASE" && cuposDisponibles == 0) {
    $body.classList.remove("body--js-shadow");
    return true;
  }

  if (mensajeDeAviso === "NO PASE" && cuposDisponibles > 0) {
    mensajeDeAviso = "SIGA";
    $mensajeAviso.textContent = mensajeDeAviso;
    $aviso.classList.replace("c-aviso--js-bg-rojo", "c-aviso--js-bg-verde");
    $cuposDisponibles.classList.replace(
      "c-targeta__cantidad--color-rojo",
      "c-targeta__cantidad--color-verde"
    );
    return true;
  }
}

function obtenerNombreDeVistaActual() {
  const pathFile = location.pathname;
  const pathFileDividido = pathFile.split('/');
  const nombreVistaActual = pathFileDividido[pathFileDividido.length-1];
  return nombreVistaActual;
}

/* Comunicacion con programa de python */
ipcRenderer.on("aforo:actualizado", (e, respuesta) => {
  try {
    if(ocupacionActual != 0 && respuesta != 1){
      actualizarDatosAforo(respuesta);
      guardarLocalStorage("datosActualizadosAforo", datosAforo);
      actualizarValoresAforoDOM(datosAforo);
      actualizarAviso(datosAforo.cuposDisponibles);
      let hayInternet = navigator.onLine;
      if (!hayInternet && !intervaloIniciado) {
        comprobarInternet();
      }
  
      if (hayInternet && intervaloIniciado) {
        intervaloIniciado = false;
        clearInterval(intervaloID);
        opcionesActualizarAforo.body = JSON.stringify(establecerDatosDeEnvio(datosAforo));
        peticionPostGenerica(urlBackend.actualizarDatos, opcionesActualizarAforo);
      }
  
      if (hayInternet && !intervaloIniciado) {
        opcionesActualizarAforo.body = JSON.stringify(establecerDatosDeEnvio(datosAforo));
        peticionPostGenerica(urlBackend.actualizarDatos, opcionesActualizarAforo)
      }
    }
  } catch (error) {
    console.error(error)
  }
});

/* Eventos al hacer click */
document.addEventListener("click", (e) => {
  if (
    e.target.matches(botonActualizarDatos) ||
    e.target.matches(botonActualizarDatos + " *")
  ) {
    $modalActualizarDatos.classList.remove("js-cerrar-modal");
  }

  if (e.target.matches(botonAyuda) || e.target.matches(botonAyuda + " *")) {
    window.open("../resources/assets/manual_de_usuario.pdf");
  }

  if (e.target.matches(botonCerrar) || e.target.matches(botonCerrar + " *")) {
    window.close();
  }

  if (e.target.matches("#btn-no")) {
    $modalActualizarDatos.classList.add("js-cerrar-modal");
  }

  if (e.target.matches("#btn-si")) {
    paginaActual = 0;
    const nombreVistaActual = obtenerNombreDeVistaActual();
    if(nombreVistaActual === 'ventana-informativa.html'){
      ipcRenderer.send("cerrar:hilo"); 
    }
    guardarLocalStorage("numeroPaginaActual", paginaActual);
    redireccionUrl("distanciamiento", "formulario/");
  }
});

/* Cerrar hilo donde se ejecuta el programa de python */
window.onbeforeunload = (e) => {
  const nombreVistaActual = obtenerNombreDeVistaActual();
  if(nombreVistaActual === 'ventana-informativa.html'){
    ipcRenderer.send("cerrar:hilo"); 
  }
};

/* Al recargarse la pagina */
window.addEventListener("load", (e) => {
  guardarLocalStorage("formularioCompleto", true);
  datosAforo = obtenerDatosLocalStorage("datosAforo");
  cuposDisponibles.contenido = datosAforo.cuposDisponibles;
  ocupacionMaxima.contenido = datosAforo.aforo;
  ocupacionActual.contenido = datosAforo.ocupacionActual;
  establecerContenidoEnElementosDOM([cuposDisponibles,ocupacionMaxima,ocupacionActual]);
  ipcRenderer.send("aforo:enviar", datosAforo); // Se abre el hilo de python
  let hayInternet = navigator.onLine;
  if (!hayInternet) {
    comprobarInternet();
  } else {
    bodyDataAforo = establecerDatosDeEnvio(datosAforo);
    opcionesActualizarAforo.body = JSON.stringify(bodyDataAforo)
    peticionPostGenerica(urlBackend.actualizarDatos, opcionesActualizarAforo);
  }
});
