/**
 * catalog.js — Construcción del catálogo de ejercicios desde el JSON del servidor.
 * Sustituye toClientes() + numseg/numtec/plusOption* de varapp.js.
 *
 * ORIGEN v1: toClientes() en varapp.js (~180 líneas), más numseg/numtec/plusOptionSeg/Tec/Gen
 *            duplicadas entre sí (3 pares de funciones idénticas dentro del mismo fichero).
 * PROBLEMAS resueltos:
 *   - getCategorias/Subcategorias se parsean 1 sola vez (vía store)
 *   - numseg, numtec, plusOption* consolidadas en helpers privados
 *   - Ejercicio y clientesNew convertidos a clases ES6
 */

import { SERVER_URL, APP_DIST, PATHS } from '../config.js';
import { getCategorias, getSubcategorias, getCatalogo, exerciseStore } from '../data/store.js';

// ─── Helpers de lookup (privados) ────────────────────────────────────────────
function findCat(num) {
  return getCategorias().findIndex(c => c.categoriasNum === num);
}
function findTec(num) {
  return getSubcategorias().findIndex(t => t.subcategoriasNum === num);
}

// ─── Clases de dominio ───────────────────────────────────────────────────────
export class Exercise {
  constructor({ id, idCat, videomp4, path, nombre, titulo, exec,
                orden, ordenOri, regnum, region, segmnum, segm,
                radi = 0, activo = 1, menu, memo, memoI, memoII, memoIII }) {
    Object.assign(this, { id, idCat, videomp4, path, nombre, titulo, exec,
                          orden, ordenOri, regnum, region, segmnum, segm,
                          radi, activo, menu, memo, memoI, memoII, memoIII });
  }
}

// ─── Construcción del catálogo ────────────────────────────────────────────────
/**
 * Transforma el array `catalogo` (de localStorage) en objetos Exercise
 * y los carga en exerciseStore.
 * Equivale a toClientes() de v1.
 */
export function buildCatalog() {
  const catalogo      = getCatalogo();
  const categorias    = getCategorias();
  const subcategorias = getSubcategorias();

  const exercises = [];

  for (let i = 0; i < catalogo.length; i++) {
    const item = catalogo[i];
    const imagen = item.imagen;
    if (!imagen || parseInt(imagen.slice(0, 3)) <= 100 || imagen.length <= 7) continue;

    const numeroCat  = item.cl;
    const num1 = parseInt(numeroCat.slice(0, 1));
    const num2 = parseInt(numeroCat.slice(0, 2));
    const num3 = parseInt(numeroCat.slice(2, 3));

    const iCat  = findCat(num1 * 100);
    const iSeg  = findCat(num2 * 10);
    const iTec  = findTec(num3);

    const region   = iCat  !== -1 ? categorias[iCat].categorias    : '';
    const regnum   = iCat  !== -1 ? categorias[iCat].categoriasNum  : 0;
    const segm     = iSeg  !== -1 ? categorias[iSeg].categorias     : '';
    const segmnum  = iSeg  !== -1 ? categorias[iSeg].categoriasNum  : 0;
    const memoII   = iTec  !== -1 ? subcategorias[iTec].subcategorias : '';

    const titulo     = imagen;
    const namClean   = imagen.slice(0, imagen.indexOf('.'));
    const nombre     = namClean.slice(8).replace(/_+/g, ' ');
    const path       = `${PATHS.images}${imagen}`;
    const orden      = numeroCat;
    const ordenOri   = item.codigo;
    const menu       = parseInt(numeroCat);
    const namIniMp4  = imagen.substr(0, 7);

    let exec, videomp4;
    if (parseInt(namIniMp4[2]) === 9) {
      exec     = `${PATHS.videos}${namIniMp4}.txt`;
      videomp4 = exec;
    } else {
      exec     = `${PATHS.videos}${namIniMp4}.mp4`;
      videomp4 = `${PATHS.logVideo}?video=${encodeURIComponent(namIniMp4 + '.mp4')}&dist=${encodeURIComponent(APP_DIST)}`;
    }

    exercises.push(new Exercise({
      id: exercises.length,
      idCat: item.id,
      videomp4, path, nombre, titulo, exec, orden, ordenOri,
      regnum, region, segmnum, segm, menu,
      memo:  `${region}/${segm}`,
      memoI: `${region}/${segm}/${memoII}`,
      memoII, memoIII: memoII,
    }));
  }

  exerciseStore.set(exercises);
  return exercises;
}

// ─── Utilidades de ordenación ─────────────────────────────────────────────────
export function sortBy(arr, key, order = 'asc') {
  return [...arr].sort((a, b) => {
    const [x, y] = [a[key], b[key]];
    return order === 'asc' ? (x < y ? -1 : x > y ? 1 : 0)
                           : (x > y ? -1 : x < y ? 1 : 0);
  });
}

// ─── Detección de dispositivo ─────────────────────────────────────────────────
export function detectHardware() {
  const ua = navigator.userAgent.toLowerCase();
  const isTabletUA  = /(ipad|tablet|(android(?!.*mobi)))/i.test(ua);
  const isMobileUA  = /(iphone|ipod|android.*mobile|windows phone)/i.test(ua);
  const w = window.screen.width, h = window.screen.height;
  const isTabletSz  = (w >= 600 && w <= 1024) || (h >= 600 && h <= 1024);
  const isTablet    = isTabletUA || isTabletSz;
  const isMobile    = isMobileUA && !isTablet;

  if (isTablet || isMobile) return 'AMT';   // Android/Mobile/Tablet
  return 'WPD';                              // Windows PC Desktop (default)
}
