// VISOR - Sistema de reproducción desarrollado por 19ND

var contenedorMedia = document.getElementById('media');
var listaMedia = [];
var indiceActual = 0;
var timeoutId = null;
var activeFolder = null; // Carpeta activa: 'current' o 'default'

// Determina la orientación del visor (1: horizontal, 2: vertical) basado en el nombre del HTML.
function obtenerOrientacion() {
  var p = location.pathname;
  // Reemplazar String.prototype.includes con indexOf
  return p.indexOf('2.html') !== -1 ? '2' : '1';
}
var orientacion = obtenerOrientacion();

// Muestra una pantalla negra (limpia el contenedor y pone fondo negro).
function mostrarPantallaNegra() {
  contenedorMedia.innerHTML = '';
  contenedorMedia.style.background = '#000';
}

// Comprueba si existe el archivo '../current/update' para forzar el uso del catálogo 'default'.
function existeUpdate(callback) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', '../current/update?_cacheBust=' + Date.now(), true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status >= 200 && xhr.status < 300) {
        callback(true);
      } else {
        callback(false);
      }
    }
  };
  xhr.onerror = function() {
    callback(false); // Asume que no existe si hay error en la red.
  };
  xhr.send();
}

// Carga y parsea el archivo 'media.ndx' de la carpeta especificada ('current' o 'default').
function loadNdX(folder, onSuccess, onError) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', '../' + folder + '/media.ndx?_cacheBust=' + Date.now(), true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
      if (xhr.status >= 200 && xhr.status < 300) {
        try {
          var jsonData = JSON.parse(xhr.responseText);
          onSuccess({ folder: folder, data: jsonData });
        } catch (e) {
          onError(new Error('Failed to parse JSON from ' + folder + '/media.ndx: ' + e.message));
        }
      } else {
        onError(new Error('Failed to load ' + folder + '/media.ndx. Status: ' + xhr.status));
      }
    }
  };
  xhr.onerror = function() {
    onError(new Error('Network error while loading ' + folder + '/media.ndx.'));
  };
  xhr.send();
}

// Carga la lista de medios, manejando fallbacks y el archivo 'update'.
function cargarListaMedia(callback) {
  existeUpdate(function(hasUpdate) {
    if (hasUpdate) {
      console.log("Archivo 'update' encontrado. Usando 'default/media.ndx'.");
      loadNdX('default', handleSuccess, handleCriticalError);
    } else {
      console.log("Intentando cargar 'current/media.ndx'.");
      loadNdX('current', handleSuccess, function() { // onError for 'current'
        console.warn("Fallo al cargar 'current/media.ndx'. Intentando 'default/media.ndx'.");
        loadNdX('default', handleSuccess, handleCriticalError);
      });
    }
  });

  function handleSuccess(obj) {
    activeFolder = obj.folder;
    console.log("Usando catálogo de: " + activeFolder);

    var mediaDataArray = Array.isArray(obj.data.mediaData) ? obj.data.mediaData : [];

    // Filtra por tipo (5 video, 6 imagen) y orientación.
    var filteredMedia = mediaDataArray.filter(function(element) {
      return (element.type === 5 || element.type === 6) && String(element.prefix) === orientacion;
    });

    // Ordena por el campo 'order' (default 0).
    filteredMedia.sort(function(a, b) {
      return (a.order || 0) - (b.order || 0);
    });

    listaMedia = filteredMedia.map(function(element) {
      return {
        src: '../' + activeFolder + '/media/' + element.hash,
        type: element.type,
        displayTime: element.displayTime || 5 // Default 5s para imágenes.
      };
    });

    indiceActual = 0;
    callback(listaMedia); // Llama al callback con la lista.
  }

  function handleCriticalError(error) {
    console.error("Error crítico al cargar catálogos. No se pudo cargar ni 'current' ni 'default'.", error.message);
    listaMedia = [];
    mostrarPantallaNegra();
    callback(listaMedia);
  }
}

// Reproduce el siguiente medio y verifica cambios de catálogo.
function reproducirSiguiente() {
  if (timeoutId) clearTimeout(timeoutId);

  // Función auxiliar para peticiones HEAD con XMLHttpRequest
  function checkFileStatus(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('HEAD', url + '?_cacheBust=' + Date.now(), true);
    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        callback(xhr.status >= 200 && xhr.status < 300);
      }
    };
    xhr.onerror = function() {
      callback(false);
    };
    xhr.send();
  }

  checkFileStatus('../current/update', function(updateExists) {
    checkFileStatus('../current/media.ndx', function(currentNdxAvailable) {
      var desiredFolder = updateExists ? 'default' : (currentNdxAvailable ? 'current' : 'default');

      if (desiredFolder !== activeFolder) {
        console.log("Cambio de catálogo detectado. Deseado: " + desiredFolder + ", actual: " + activeFolder + ". Reiniciando.");
        iniciarReproduccion();
        return;
      }

      // Continuación normal.
      if (!listaMedia.length) {
        console.log("Lista de media vacía. Reintentando carga en 10s.");
        mostrarPantallaNegra();
        timeoutId = setTimeout(iniciarReproduccion, 10000);
        return;
      }

      if (indiceActual >= listaMedia.length) {
        indiceActual = 0; // Loop.
      }

      var mediaElement = listaMedia[indiceActual];
      contenedorMedia.innerHTML = '';

      if (mediaElement.type === 6) { // Imagen
        mostrarImagen(mediaElement.src, mediaElement.displayTime * 1000);
      } else if (mediaElement.type === 5) { // Video
        mostrarVideo(mediaElement.src);
      } else {
        console.warn("Elemento con tipo desconocido:", mediaElement);
        indiceActual++;
        reproducirSiguiente(); // Llama directamente para el siguiente
      }
    });
  });
}

// Muestra una imagen.
function mostrarImagen(src, duracion) {
  var img = document.createElement('img');
  img.src = src;
  img.style.cssText = 'position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;height:100%;object-fit:contain;opacity:0;transition:opacity 1s;background:#000;';
  
  img.onload = function() {
    contenedorMedia.appendChild(img);
    setTimeout(function() { img.style.opacity = '1'; }, 50); // Fade in.
    
    timeoutId = setTimeout(function() {
      img.style.opacity = '0'; // Fade out.
      setTimeout(function() {
        if (contenedorMedia.contains(img)) {
          contenedorMedia.removeChild(img);
        }
        indiceActual++;
        reproducirSiguiente();
      }, 1000); // Duración fade out.
    }, duracion);
  };
  
  img.onerror = function() {
    console.error("Error al cargar imagen: " + src + ". Saltando.");
    indiceActual++;
    reproducirSiguiente();
  };
}

// Muestra un video.
function mostrarVideo(src) {
  var video = document.createElement('video');
  video.src = src;
  video.autoplay = true;
  video.muted = true;
  video.playsInline = true;
  video.controls = false;
  video.style.cssText = 'position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;height:100%;object-fit:contain;opacity:0;transition:opacity 1s;background:#000;';
  
  video.onloadedmetadata = function() {
    contenedorMedia.appendChild(video);
    setTimeout(function() { video.style.opacity = '1'; }, 50); // Fade in.
  };
  
  video.onended = function() {
    video.style.opacity = '0'; // Fade out.
    setTimeout(function() { 
      if (contenedorMedia.contains(video)) {
        contenedorMedia.removeChild(video); 
      }
      indiceActual++;
      reproducirSiguiente();
    }, 1000); // Duración fade out.
  };
  
  video.onerror = function() {
    var error = video.error;
    console.error("Error video: " + src + ". Code: " + (error ? error.code : 'N/A') + ". Saltando.");
    indiceActual++;
    reproducirSiguiente();
  };
}

// Inicia o reinicia la reproducción.
function iniciarReproduccion() {
  if (timeoutId) clearTimeout(timeoutId);
  mostrarPantallaNegra();
  cargarListaMedia(function() {
    reproducirSiguiente();
  });
}

// Alterna el modo de pantalla completa.
function alternarPantallaCompleta() {
  var el = document.documentElement;
  var isFullscreen = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;

  if (!isFullscreen) {
    if (el.requestFullscreen) el.requestFullscreen();
    else if (el.webkitRequestFullscreen) el.webkitRequestFullscreen(); /* Safari, Chrome, Opera */
    else if (el.mozRequestFullScreen) el.mozRequestFullScreen(); /* Firefox */
    else if (el.msRequestFullscreen) el.msRequestFullscreen(); /* IE/Edge */
  } else {
    if (document.exitFullscreen) document.exitFullscreen();
    else if (document.webkitExitFullscreen) document.webkitExitFullscreen();
    else if (document.mozCancelFullScreen) document.mozCancelFullScreen();
    else if (document.msExitFullscreen) document.msExitFullscreen();
  }
}

// Eventos al cargar el DOM.
document.addEventListener('DOMContentLoaded', function() {
  iniciarReproduccion();
  
  // Intento de pantalla completa automática (puede ser bloqueado por el navegador).
  setTimeout(function() { 
    try { 
      // alternarPantallaCompleta(); // Comentado para evitar problemas de autoplay de fullscreen.
    } catch(e) {
      console.warn("Pantalla completa automática falló.", e);
    }
  }, 1000);
  
  // Manejador de errores global de JavaScript.
  window.addEventListener('error', function(event) {
    console.error("Error global JS:", event.message, "en", event.filename, "línea", event.lineno);
    mostrarPantallaNegra(); 
    if (timeoutId) clearTimeout(timeoutId);
    timeoutId = setTimeout(iniciarReproduccion, 5000); // Reintenta tras 5s.
  });
  
  // Click en documento para pantalla completa.
  document.addEventListener('click', alternarPantallaCompleta);
});
