<?php
/**
 * Contenido de ayuda del plugin (mantener al día con cada actualización).
 *
 * @package Logistica
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Secciones de documentación para la pestaña Ayuda.
 */
class Logistica_Help {

	/**
	 * @return string
	 */
	public static function plugin_version_label() {
		return defined( 'LOGISTICA_VERSION' ) ? (string) LOGISTICA_VERSION : '';
	}

	/**
	 * @return list<array<string, mixed>>
	 */
	public static function sections() {
		if ( class_exists( 'Logistica_Settings', false ) ) {
			$settings = Logistica_Settings::get_help_settings();
			$mode     = (string) ( $settings['content_mode'] ?? 'default' );

			if ( 'json' === $mode ) {
				$parsed = self::parse_sections_json( (string) ( $settings['sections_json'] ?? '' ) );
				if ( is_array( $parsed ) && ! empty( $parsed ) ) {
					return apply_filters( 'logistica_help_sections', $parsed );
				}
			}
		}

		return apply_filters( 'logistica_help_sections', self::default_sections() );
	}

	/**
	 * @return array{title: string, intro: string}
	 */
	public static function hero() {
		if ( class_exists( 'Logistica_Settings', false ) ) {
			return Logistica_Settings::get_help_hero();
		}

		return array(
			'title' => __( 'Ayuda de JB Planeación', 'logistica' ),
			'intro' => __( 'Guía completa para usar JB Planeación: cada pestaña, botones, cálculos, métricas y roles explicados en lenguaje sencillo. Abre el menú de navegación interna (icono de secciones en la barra) para saltar al tema que necesites.', 'logistica' ),
		);
	}

	/**
	 * @return bool
	 */
	public static function uses_custom_html() {
		if ( ! class_exists( 'Logistica_Settings', false ) ) {
			return false;
		}

		$settings = Logistica_Settings::get_help_settings();

		return 'html' === ( $settings['content_mode'] ?? 'default' )
			&& '' !== trim( (string) ( $settings['custom_html'] ?? '' ) );
	}

	/**
	 * @return string
	 */
	public static function custom_html() {
		if ( ! self::uses_custom_html() ) {
			return '';
		}

		return (string) Logistica_Settings::get_help_settings()['custom_html'];
	}

	/**
	 * @param string $json JSON de secciones.
	 * @return list<array<string, mixed>>|null
	 */
	public static function parse_sections_json( $json ) {
		$json = trim( (string) $json );
		if ( '' === $json ) {
			return null;
		}

		$decoded = json_decode( $json, true );
		if ( ! is_array( $decoded ) ) {
			return null;
		}

		$sections = array();
		foreach ( $decoded as $section ) {
			if ( ! is_array( $section ) ) {
				continue;
			}
			$id = sanitize_key( (string) ( $section['id'] ?? '' ) );
			if ( '' === $id ) {
				continue;
			}
			$sections[] = $section;
		}

		return empty( $sections ) ? null : $sections;
	}

	/**
	 * Secciones predeterminadas embebidas en el plugin.
	 *
	 * @return list<array<string, mixed>>
	 */
	public static function default_sections() {
		$sections = array(
			array(
				'id'    => 'bienvenida',
				'title' => __( 'Bienvenida', 'logistica' ),
				'intro' => __( 'JB Planeación reúne en un solo lugar inventario, calculadoras, cierre de órdenes, planeación de producción, pedidos y tu inicio de trabajo con tareas y recordatorios. Esta guía está pensada para quien usa el sistema por primera vez: explica qué hace cada pestaña, qué significan los botones y cómo se calculan los tiempos y métricas.', 'logistica' ),
				'list'  => array(
					__( 'Puedes entrar de tres formas: desde WordPress (administradores), desde la página de operaciones (usuarios con rol JB) o desde el panel público del sitio web.', 'logistica' ),
					__( 'Los cambios en la mayoría de módulos se guardan solos al editar. Verás un mensaje de confirmación cuando se guarda correctamente.', 'logistica' ),
					__( 'Las fechas y la hora del reloj en Inicio usan la zona horaria de Colombia.', 'logistica' ),
					__( 'Si no ves alguna pestaña, tu rol puede no tener permiso. Pide al administrador que revise Configuración → Roles y permisos.', 'logistica' ),
					__( 'Si aparece el aviso «Sesión expirada», vuelve a iniciar sesión antes de seguir editando: los cambios no guardados no se envían al servidor.', 'logistica' ),
				),
			),
			array(
				'id'    => 'mapa-secciones',
				'title' => __( 'Mapa de secciones', 'logistica' ),
				'intro' => __( 'Cada pestaña del menú lateral corresponde a un módulo de trabajo. Usa esta tabla para ubicarte rápido.', 'logistica' ),
				'table' => array(
					'headers' => array(
						__( 'Pestaña', 'logistica' ),
						__( 'Para qué sirve', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Inicio', 'logistica' ), __( 'Tu panel diario con pestañas internas: Avisos, Chequeo, Agenda, Compras (cotizaciones + proveedores) e Informe de tiempos.', 'logistica' ) ),
						array( __( 'Mi perfil', 'logistica' ), __( 'Datos de tu cuenta, contraseña y cierre de sesión. También puedes abrirla con «Ver perfil» en la barra superior.', 'logistica' ) ),
						array( __( 'Calculadoras', 'logistica' ), __( 'Conversiones de medidas, gramaje, calibre, montaje compartido y hojas a hojas.', 'logistica' ) ),
						array( __( 'Cálculo tapas', 'logistica' ), __( 'Tabla de referencias de tapas con edición fila a fila e importación Excel.', 'logistica' ) ),
						array( __( 'Cálculos bolsas', 'logistica' ), __( 'Igual que tapas, orientado a referencias de bolsas.', 'logistica' ) ),
						array( __( 'Inventario bodega', 'logistica' ), __( 'Comparar saldo Kardex vs inventario físico por código y lote.', 'logistica' ) ),
						array( __( 'Cierre de órdenes', 'logistica' ), __( 'Matrices de cierre por referencia, bases permanentes y bloques de cálculo.', 'logistica' ) ),
						array( __( 'Planeación impresión', 'logistica' ), __( 'Programación semanal por máquina de impresión (tablero tipo cronograma).', 'logistica' ) ),
						array( __( 'Planeación formado', 'logistica' ), __( 'Programación semanal de formado, troquelado, pegado y corte por máquina.', 'logistica' ) ),
						array( __( 'Tablero producción', 'logistica' ), __( 'Vista consolidada de producción (según permisos del rol).', 'logistica' ) ),
						array( __( 'Características por código', 'logistica' ), __( 'Maestro de dimensiones (largo, ancho, alto, clave) que alimenta el cierre.', 'logistica' ) ),
						array( __( 'Códigos etiqueta', 'logistica' ), __( 'Catálogo de productos con código EAN e impresión de etiquetas de producción.', 'logistica' ) ),
						array( __( 'Revisión minuta', 'logistica' ), __( 'Revisión de minutas de producción importadas desde Excel.', 'logistica' ) ),
						array( __( 'Rótulos rollos', 'logistica' ), __( 'Rótulos de rollos (anchos/color) y rotulado de estibas de producto terminado en hoja Carta.', 'logistica' ) ),
						array( __( 'Cuadro de pedidos', 'logistica' ), __( 'Órdenes de compra, estados de producción e inventario por cliente/estilo.', 'logistica' ) ),
						array( __( 'Configuración', 'logistica' ), __( 'Panel público, roles, permisos y fórmulas base (solo administradores).', 'logistica' ) ),
						array( __( 'Ayuda', 'logistica' ), __( 'Esta guía, con menú de navegación interna por temas. Se actualiza con cada versión.', 'logistica' ) ),
					),
				),
			),
			array(
				'id'    => 'controles-comunes',
				'title' => __( 'Controles que verás en varias pestañas', 'logistica' ),
				'intro' => __( 'Antes de entrar a cada módulo, conviene conocer estos elementos que se repiten.', 'logistica' ),
				'table' => array(
					'headers' => array(
						__( 'Control', 'logistica' ),
						__( 'Qué hace', 'logistica' ),
					),
					'rows'    => array(
						array(
							__( 'Menú de pestañas (☰)', 'logistica' ),
							__( 'Abre o cierra la lista de módulos del panel. En móvil ayuda a ganar espacio en pantalla.', 'logistica' ),
						),
						array(
							__( 'Menú de secciones (☰→)', 'logistica' ),
							__( 'Abre la navegación interna de la pestaña activa (por ejemplo Calculadoras, Configuración o Ayuda). Solo aparece si esa pestaña tiene enlaces de sección.', 'logistica' ),
						),
						array(
							__( 'Ver perfil', 'logistica' ),
							__( 'En la barra superior de operaciones abre «Mi perfil». En Inicio y en Perfil esa tarjeta se oculta para no duplicar el acceso.', 'logistica' ),
						),
						array(
							__( 'Vista (+ / −)', 'logistica' ),
							__( 'Amplía o reduce tablas tipo Excel o el tablero de planeación entre 70 % y 140 %. La preferencia se recuerda en tu navegador.', 'logistica' ),
						),
						array(
							__( 'Exportar Excel (.xlsx)', 'logistica' ),
							__( 'Descarga los datos actuales como archivo Excel. Úsalo como respaldo o plantilla para editar muchos registros a la vez.', 'logistica' ),
						),
						array(
							__( 'Importar Excel', 'logistica' ),
							__( 'Sube un archivo generado por el mismo módulo. Las celdas marcadas como editables en la plantilla son las que se actualizan.', 'logistica' ),
						),
						array(
							__( 'Indicador de carga', 'logistica' ),
							__( 'Aparece un spinner con mensaje mientras se prepara una sección pesada (por ejemplo Cierre de órdenes o Planeación).', 'logistica' ),
						),
						array(
							__( 'Ver en el sitio / Panel público', 'logistica' ),
							__( 'Enlace para abrir la misma sección en la página pública del sitio (visible para administradores).', 'logistica' ),
						),
						array(
							__( 'Filtros + Limpiar filtros', 'logistica' ),
							__( 'Reduce la tabla a lo que buscas. «Limpiar filtros» devuelve la vista completa.', 'logistica' ),
						),
						array(
							__( 'Paginación (Anterior / Siguiente)', 'logistica' ),
							__( 'En tablas largas puedes elegir cuántas filas ver por página.', 'logistica' ),
						),
					),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: ampliar el tablero de planeación', 'logistica' ),
						'list'  => array(
							__( 'Abre Planeación impresión y pulsa Vista (+) dos veces hasta ~115 %.', 'logistica' ),
							__( 'Las tarjetas del cronograma se ven más grandes; la preferencia queda guardada en tu navegador.', 'logistica' ),
							__( 'Antes de exportar Excel, vuelve a 100 % si necesitas captura de pantalla estándar.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'panel-general',
				'title'    => __( 'Inicio — tareas y recordatorios', 'logistica' ),
				'tab_slug' => 'logistica',
				'intro'    => __( 'Es tu espacio de control diario. Cada usuario ve solo sus propios datos. El contenido está organizado en 4 pestañas internas; al guardar en el formulario modal los cambios se confirman de inmediato.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Pestaña de Inicio', 'logistica' ),
						__( 'Qué incluye', 'logistica' ),
					),
					'rows'    => array(
						array(
							__( 'Avisos', 'logistica' ),
							__( 'Avisos del día por vencimientos de agenda y compras. Puedes marcar como leído, ver leídos o borrar los ya leídos.', 'logistica' ),
						),
						array(
							__( 'Chequeo', 'logistica' ),
							__( 'Lista de chequeo diario (Lunes–Domingo). Puedes marcar cada día como laborable, festivo, día libre, vacaciones o permisos.', 'logistica' ),
						),
						array(
							__( 'Agenda', 'logistica' ),
							__( 'Actividades con fecha, hora, prioridad (Baja, Media, Alta) y estado. Botón «+ Actividad».', 'logistica' ),
						),
						array(
							__( 'Compras', 'logistica' ),
							__( 'Pendientes de compras (cotizaciones) y, debajo, el directorio de proveedores con Exportar/Importar Excel.', 'logistica' ),
						),
						array(
							__( 'Informe de tiempos', 'logistica' ),
							__( 'Resumen de tiempos y seguimiento asociado a tu trabajo del panel.', 'logistica' ),
						),
					),
				),
				'list'     => array(
					__( 'Barra lateral de Inicio: tarjeta con tu nombre, correo y rol; botón «Ver perfil»; accesos rápidos; y «Últimas actualizaciones» para retomar donde quedaste.', 'logistica' ),
					__( 'Los días del checklist se muestran en español (Lunes, Martes, Miércoles…).', 'logistica' ),
					__( 'Filtros en agenda y compras: por estado, prioridad y fecha requerida.', 'logistica' ),
					__( 'En Inicio no hay menú de secciones en la barra lateral del rail: la navegación interna son las 4 pestañas de arriba.', 'logistica' ),
				),
				'notes'    => array(
					__( 'Los estados de cotización se pueden personalizar en Configuración → Inicio (administradores).', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: registrar una cotización', 'logistica' ),
						'list'  => array(
							__( 'Inicio → pestaña Compras → «+ Cotización».', 'logistica' ),
							__( 'Producto: «Tinta Pantone 485» · Referencia: «Cliente XYZ» · Precio: $850.000 · Fecha requerida: 20/03/2026.', 'logistica' ),
							__( 'Proveedor: el que creaste en Proveedores · Estado: Esperando cotización.', 'logistica' ),
							__( 'Guardar: la fila aparece en la tabla; luego cambias el estado a Recibido cuando llegue el material.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'panel-edicion-modal',
				'title'    => __( 'Inicio — cómo editar (ventana modal)', 'logistica' ),
				'tab_slug' => 'logistica',
				'intro'    => __( 'No se edita directamente en la lista. Siempre se abre una ventana (modal) con el formulario completo.', 'logistica' ),
				'list'     => array(
					__( 'Botones «+ Actividad», «+ Chequeo», «+ Proveedor» o «+ Cotización»: crean un registro nuevo.', 'logistica' ),
					__( 'Icono de lápiz en cada fila: abre el mismo formulario para modificar.', 'logistica' ),
					__( 'Guardar: confirma los cambios y cierra la ventana.', 'logistica' ),
					__( 'Cancelar o tecla Escape: cierra sin guardar. Si era un registro nuevo, se descarta.', 'logistica' ),
					__( 'Las listas en pantalla son de solo lectura; todo el detalle vive dentro del modal.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: editar una actividad de agenda', 'logistica' ),
						'list'  => array(
							__( 'En Agenda de actividades localiza «Revisar OC 4521» y pulsa el lápiz.', 'logistica' ),
							__( 'Cambia la prioridad a Alta y la fecha a mañana.', 'logistica' ),
							__( 'Guardar: la lista se actualiza; Cancelar descartaría los cambios.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'panel-checklist-recurrencia',
				'title'    => __( 'Inicio — tipos de recurrencia del checklist', 'logistica' ),
				'tab_slug' => 'logistica',
				'intro'    => __( 'Cada actividad del checklist tiene un tipo de recurrencia. El icono ℹ junto al campo «Recurrencia» lo explica en pantalla.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Tipo', 'logistica' ),
						__( 'Comportamiento', 'logistica' ),
					),
					'rows'    => array(
						array(
							__( 'Repetitivo', 'logistica' ),
							__( 'Aparece cada semana el mismo día (lunes, martes, etc.). Cuando llega ese día en la semana nueva, vuelve a «No completado». Es el tipo por defecto al crear actividades.', 'logistica' ),
						),
						array(
							__( 'Diario', 'logistica' ),
							__( 'Si no la completas hoy, pasa al día siguiente hasta que la marques hecha. Una vez completada, no vuelve a aparecer.', 'logistica' ),
						),
						array(
							__( 'Único', 'logistica' ),
							__( 'Solo existe el día que le asignaste. No se arrastra de día en día. Las actividades de agenda y compras con fecha también entran aquí automáticamente.', 'logistica' ),
						),
					),
				),
				'notes'    => array(
					__( 'El aviso naranja del checklist solo muestra actividades diarias que quedaron pendientes de días anteriores.', 'logistica' ),
					__( 'Los festivos de Colombia pueden marcarse automáticamente según la configuración del panel.', 'logistica' ),
					__( 'La barra de días del checklist usa nombres en español (Lunes–Domingo) y la fecha en formato DD/MM.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: checklist repetitivo vs diario', 'logistica' ),
						'list'  => array(
							__( '«Revisar inventario tintas» · Recurrencia Repetitivo · Día Lunes → reaparece cada lunes.', 'logistica' ),
							__( '«Enviar reporte producción» · Recurrencia Diario → si no lo marcas hoy, pasa a mañana.', 'logistica' ),
							__( '«Auditoría ISO» · Recurrencia Único · 15/03 → solo ese día, no se repite.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'panel-ultimas-actualizaciones',
				'title'    => __( 'Inicio — Últimas actualizaciones (puntos de retoma)', 'logistica' ),
				'tab_slug' => 'logistica',
				'intro'    => __( 'El sistema recuerda en qué sección estabas trabajando para que puedas volver con un clic.', 'logistica' ),
				'list'     => array(
					__( 'Se registra al cambiar de pestaña, minimizar el navegador o cerrar la página.', 'logistica' ),
					__( 'Cada minuto se actualiza el contexto de la sección activa.', 'logistica' ),
					__( 'En la barra lateral de Inicio verás la lista con botones «← Anterior» y «→ Siguiente».', 'logistica' ),
					__( 'Pulsa «Retomar →» para ir directamente a esa sección y pestaña.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: retomar planeación', 'logistica' ),
						'list'  => array(
							__( 'Estabas en Planeación impresión · SPEED MASTER 74 · semana del 23/06.', 'logistica' ),
							__( 'Cierras el navegador y vuelves a Inicio al día siguiente.', 'logistica' ),
							__( 'En «Últimas actualizaciones» aparece esa entrada → Retomar te lleva al mismo tablero y semana.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'perfil',
				'title'    => __( 'Mi perfil', 'logistica' ),
				'tab_slug' => 'logistica-perfil',
				'intro'    => __( 'Desde aquí gestionas tu cuenta dentro de JB Planeación sin salir al escritorio de WordPress.', 'logistica' ),
				'list'     => array(
					__( 'Abre «Mi perfil» desde el menú de pestañas o con el botón «Ver perfil» de la barra superior / tarjeta de usuario en Inicio.', 'logistica' ),
					__( 'Puedes revisar tu nombre, correo y rol, y cambiar la contraseña según las opciones disponibles.', 'logistica' ),
					__( '«Cerrar sesión» está en la página de perfil (no en la barra superior de operaciones).', 'logistica' ),
					__( 'En Inicio y en Perfil la tarjeta «Ver perfil» de la barra superior se oculta para no repetir el mismo acceso.', 'logistica' ),
				),
			),
			array(
				'id'    => 'sesion-y-navegacion',
				'title' => __( 'Sesión y navegación del panel', 'logistica' ),
				'intro' => __( 'Cómo se mantiene tu sesión y cómo usar los menús de la barra lateral del panel.', 'logistica' ),
				'list'  => array(
					__( 'Mientras trabajas, el panel renueva la sesión en segundo plano y la comprueba al volver a la pestaña del navegador.', 'logistica' ),
					__( 'Si la sesión termina, verás un aviso bloqueante «Sesión expirada» con el botón para iniciar sesión de nuevo.', 'logistica' ),
					__( 'Los cambios hechos después de que expiró la sesión no quedan guardados. Copia lo pendiente antes de volver a entrar.', 'logistica' ),
					__( 'Menú de pestañas (☰): lista de módulos (Inicio, Calculadoras, Pedidos, etc.).', 'logistica' ),
					__( 'Menú de secciones (☰→): índice interno de la pestaña activa. En Ayuda sirve para saltar entre temas de esta guía.', 'logistica' ),
					__( 'Si una pestaña no tiene secciones internas (por ejemplo Inicio con sus 4 pestañas propias), el botón de secciones no se muestra.', 'logistica' ),
				),
				'notes' => array(
					__( 'Si solo ves «Token de seguridad inválido», tu sesión sigue activa: recarga la página y continúa.', 'logistica' ),
				),
			),
			array(
				'id'       => 'conversiones',
				'title'    => __( 'Calculadoras', 'logistica' ),
				'tab_slug' => 'logistica-conversiones',
				'intro'    => __( 'Herramientas para convertir medidas en producción gráfica. Usa el menú de secciones (☰→) para cambiar entre calculadoras.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Calculadora', 'logistica' ),
						__( 'Para qué sirve', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Conversión hojas y kilos', 'logistica' ), __( 'Convierte pliegos a kilos (y viceversa) según tamaño de hoja y gramaje.', 'logistica' ) ),
						array( __( 'Gramaje papel', 'logistica' ), __( 'Con ancho, alto y peso de una hoja calcula el gramaje en gr/m².', 'logistica' ) ),
						array( __( 'Conversión de calibre', 'logistica' ), __( 'Convierte calibre entre mm, pulgadas y milésimas comerciales.', 'logistica' ) ),
						array( __( 'Montaje compartido', 'logistica' ), __( 'Distribuye cabidas entre referencias en una hoja común de impresión.', 'logistica' ) ),
						array( __( 'Hojas a hojas', 'logistica' ), __( 'Convierte entre formatos de hoja (tamaño inicial vs tamaño de corte).', 'logistica' ) ),
					),
				),
				'list'     => array(
					__( 'Celdas editables: tú escribes el dato. Celdas calculadas: el sistema las completa solo.', 'logistica' ),
					__( 'Colores de celda: verde = correcto, amarillo = advertencia, rojo = error o dato faltante.', 'logistica' ),
					__( 'En «Conversión hojas y kilos» y «Montaje compartido» puedes guardar plantillas: selector «Conversión guardada» + botones Guardar, Cargar, Editar y Eliminar.', 'logistica' ),
					__( 'Fórmulas base (como área o peso por hoja) se ajustan en Configuración → Fórmulas de conversión.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: conversión hojas → kilos', 'logistica' ),
						'list'  => array(
							__( 'Calculadora «Conversión hojas y kilos».', 'logistica' ),
							__( 'Tamaño 70×100 cm · Gramaje 350 g/m² · Cantidad 500 pliegos.', 'logistica' ),
							__( 'El sistema calcula el peso total en kilos según las fórmulas base del plugin.', 'logistica' ),
							__( 'Si el resultado sale en rojo, revisa que todos los campos editables tengan valor.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'calculo-tapas',
				'title'    => __( 'Cálculo tapas', 'logistica' ),
				'tab_slug' => 'logistica-calculo-tapas',
				'intro'    => __( 'Tabla de referencias de fabricación de tapas en poliestireno. Vista tipo Excel con tarjetas resumen arriba.', 'logistica' ),
				'list'     => array(
					__( 'Icono de editar en cada fila: modifica solo esa referencia en un formulario.', 'logistica' ),
					__( 'Estados posibles: Pendiente, Fabricación, Formado, Finalizado, Cancelado, Otro.', 'logistica' ),
					__( 'Filtros por referencia, variante y otros campos; orden clicando encabezados de columna.', 'logistica' ),
					__( 'Exportar e Importar Excel para actualización masiva.', 'logistica' ),
					__( 'Control Vista (+/−) para ampliar o reducir la tabla.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: leer una fila de tapas', 'logistica' ),
						'list'  => array(
							__( 'Referencia «T-204» · Pedido 10.000 · Stock 2.500 → Fabricar 7.500 (calculado).', 'logistica' ),
							__( 'Resina 70 % + Retal 30 % → el sistema estima kg de cada material y rollos.', 'logistica' ),
							__( 'Estado «Formado»: la fila indica en qué etapa va esa referencia.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'calculos-bolsas',
				'title'    => __( 'Cálculos bolsas', 'logistica' ),
				'tab_slug' => 'logistica-calculos',
				'intro'    => __( 'Misma lógica que Cálculo tapas, orientada a referencias de bolsas.', 'logistica' ),
				'list'     => array(
					__( 'Tarjetas con totales y tabla Excel editable fila a fila.', 'logistica' ),
					__( 'Filtros, paginación, Exportar/Importar Excel y control Vista (+/−).', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: actualizar stock de bolsas', 'logistica' ),
						'list'  => array(
							__( 'Filtra por referencia «BOL-12».', 'logistica' ),
							__( 'Edita la fila: Stock pasa de 800 a 1.200 unidades.', 'logistica' ),
							__( 'Fabricar se recalcula solo restando el nuevo stock al pedido.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'inventario-bodega',
				'title'    => __( 'Inventario bodega', 'logistica' ),
				'tab_slug' => 'logistica-inventario-bodega',
				'intro'    => __( 'Compara lo que dice el Kardex (saldo en bodega) contra lo que hay físicamente contado. El lote vigente puede sincronizarse con Cierre de órdenes.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Columna / acción', 'logistica' ),
						__( 'Significado', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Saldo bodega', 'logistica' ), __( 'Valor según Kardex / sistema.', 'logistica' ) ),
						array( __( 'Inventario físico', 'logistica' ), __( 'Cantidad contada en bodega. Se puede editar directo en la tabla o en el modal.', 'logistica' ) ),
						array( __( 'Diferencia', 'logistica' ), __( 'Saldo bodega menos inventario físico.', 'logistica' ) ),
						array( __( 'Estado OK / Diferencia / Mejoró', 'logistica' ), __( 'Verde = cuadra; rojo/naranja = hay diferencia; «Mejoró» = la diferencia disminuyó respecto al conteo anterior.', 'logistica' ) ),
						array( __( 'Lote vigente', 'logistica' ), __( 'Badge que indica el lote activo del código. Se usa en cierre de órdenes.', 'logistica' ) ),
						array( __( 'Añadir referencia', 'logistica' ), __( 'Crea un código nuevo en inventario.', 'logistica' ) ),
						array( __( 'Editar / Duplicar / Activar / Eliminar', 'logistica' ), __( 'Acciones por fila. Duplicar copia el registro; Activar/Desactivar oculta sin borrar.', 'logistica' ) ),
					),
				),
				'list'     => array(
					__( 'Tarjetas resumen arriba: total códigos, con diferencia, equilibrados y mejoraron.', 'logistica' ),
					__( 'Clic en el código lo copia al portapapeles.', 'logistica' ),
					__( 'Exportar e Importar Excel.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: detectar una diferencia', 'logistica' ),
						'list'  => array(
							__( 'Código «PAPEL-350-70x100» · Saldo bodega (Kardex): 1.500 kg.', 'logistica' ),
							__( 'Inventario físico contado: 1.480 kg → Diferencia: +20 kg (faltan en bodega).', 'logistica' ),
							__( 'Estado rojo «Diferencia»; al corregir el físico a 1.500 pasa a verde «OK».', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'cierre-ordenes',
				'title'    => __( 'Cierre de órdenes', 'logistica' ),
				'tab_slug' => 'logistica-cierre-ordenes',
				'intro'    => __( 'Replica el flujo del libro CERRAR ÓRDENES: cada referencia de producto tiene bloques de cálculo con fórmulas, códigos y lotes.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Botón', 'logistica' ),
						__( 'Qué hace', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Añadir referencia', 'logistica' ), __( 'Crea una nueva referencia de producto en el cierre.', 'logistica' ) ),
						array( __( 'Actualizar bases', 'logistica' ), __( 'Trae datos frescos de inventario y características a las bases permanentes.', 'logistica' ) ),
						array( __( 'Guardar configuración', 'logistica' ), __( 'Guardado explícito (además del autoguardado).', 'logistica' ) ),
						array( __( 'Exportar Excel / Importar', 'logistica' ), __( 'Plantilla masiva; celdas amarillas son editables.', 'logistica' ) ),
					),
				),
				'list'     => array(
					__( 'Columna izquierda: bases permanentes (códigos, lotes, gramajes, anchos, calibres) con filtros de búsqueda.', 'logistica' ),
					__( 'Área principal: referencias activas con matrices y bloques de cálculo.', 'logistica' ),
					__( 'Cada bloque tiene: etiqueta, paquetes, unidades/paquete, cantidad total (auto = paquetes × und/paq), tipo de base, fórmula, código, lote, unit/kg, ajustado y estado.', 'logistica' ),
					__( 'Cantidad total se calcula sola cuando cambias paquetes o unidades por paquete.', 'logistica' ),
					__( 'Código y lote pueden venir de Inventario bodega y Características por código.', 'logistica' ),
					__( 'Clic en código, lote o ajustado → copia al portapapeles.', 'logistica' ),
					__( 'Los cambios se autoguardan: verás «Autoguardado en base de datos».', 'logistica' ),
					__( 'Al entrar aparece «Cargando cierre de órdenes…» hasta que termina de preparar todo.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: bloque de cálculo en una referencia', 'logistica' ),
						'list'  => array(
							__( 'Referencia «Vaso 12 oz» · Bloque «Cartón SBS».', 'logistica' ),
							__( 'Paquetes: 50 · Unidades/paquete: 100 → Cantidad total: 5.000 (automático).', 'logistica' ),
							__( 'Código y lote vienen de Inventario bodega; la fórmula convierte unidades a kg según características.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'planeacion-impresion',
				'title'    => __( 'Planeación impresión', 'logistica' ),
				'tab_slug' => 'logistica-planeacion-impresion',
				'intro'    => __( 'Programación semanal de trabajos por máquina de impresión. El tablero muestra un cronograma de Lunes a Domingo con actividades ubicadas por hora.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Elemento / Estado', 'logistica' ),
						__( 'Para qué sirve / Color', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Pestañas de máquina', 'logistica' ), __( 'Cambia entre SPEED MASTER 74, SORMZ, SPEED MASTER 102 u otras que crees.', 'logistica' ) ),
						array( __( '← / → semana', 'logistica' ), __( 'Navega semanas anteriores o siguientes.', 'logistica' ) ),
						array( __( 'Esta semana', 'logistica' ), __( 'Vuelve al lunes de la semana actual.', 'logistica' ) ),
						array( __( 'Exportar / Importar (.xlsx)', 'logistica' ), __( 'Descarga o carga la programación de la máquina y semana visibles.', 'logistica' ) ),
						array( __( 'Incluir almuerzo', 'logistica' ), __( 'Excluye del cronograma la pausa de almuerzo (por defecto 12:00–13:00).', 'logistica' ) ),
						array( __( 'Inicio / Fin jornada (por día)', 'logistica' ), __( 'Define a qué hora empieza y termina cada día laborable.', 'logistica' ) ),
						array( __( 'Tipo de día', 'logistica' ), __( 'Laborable, Festivo, Día libre, Vacaciones o Permisos. Domingos y festivos se marcan solos.', 'logistica' ) ),
						array( __( 'Botón + en cada día', 'logistica' ), __( 'Agrega una actividad nueva ese día.', 'logistica' ) ),
						array( __( 'Arrastrar tarjeta', 'logistica' ), __( 'Mueve actividades dentro del mismo día o entre días.', 'logistica' ) ),
						array( __( 'Flechas ◀ / ▶ en tarjeta', 'logistica' ), __( 'Reordenan actividades en el mismo día.', 'logistica' ) ),
						array( __( 'Icono editar / ver', 'logistica' ), __( 'Abre el formulario completo de la actividad.', 'logistica' ) ),
						array( __( 'Listas desplegables (admin)', 'logistica' ), __( 'Configura opciones de Material, Montaje, Tintas, Planchas y Metas.', 'logistica' ) ),
						array( __( 'Nueva máquina', 'logistica' ), __( 'Crea una máquina personalizada. Solo las personalizadas se pueden eliminar.', 'logistica' ) ),
						array( __( 'Estado Pendiente', 'logistica' ), __( 'Gris — aún no iniciada.', 'logistica' ) ),
						array( __( 'Estado En proceso', 'logistica' ), __( 'Azul — se está ejecutando.', 'logistica' ) ),
						array( __( 'Estado Terminado', 'logistica' ), __( 'Verde — completada.', 'logistica' ) ),
						array( __( 'Estado Retrasado', 'logistica' ), __( 'Rojo — fuera de tiempo o con retraso.', 'logistica' ) ),
					),
				),
				'list'     => array(
					__( 'Tipos de labor: Impresión, Preparación de tinta, Limpieza y mantenimiento, Preparación siguiente trabajo, Lavado de máquina, Reunión impresión y diseño, Otra actividad.', 'logistica' ),
					__( 'Solo «Impresión» calcula duración automática. Los demás tipos usan duración manual (con sugerencias).', 'logistica' ),
					__( 'En impresión verás campos de Tiraje (tamaños), Complejidad, Tintas, Papel, Montaje, Planchas y Metas.', 'logistica' ),
					__( 'Modal de actividad: botones Eliminar, Cancelar y Guardar actividad.', 'logistica' ),
					__( 'Los horarios de inicio/fin de cada actividad se recalculan respetando jornada y almuerzo.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: programar un trabajo de impresión', 'logistica' ),
						'list'  => array(
							__( 'SPEED MASTER 74 · Lunes → botón +.', 'logistica' ),
							__( 'Tipo Impresión · Tiraje 3.000 · Complejidad Media · Material y montaje según OP.', 'logistica' ),
							__( 'Duración estimada: (3000÷1000)×60×1,25 = 225 min → redondea a 225 min (múltiplo de 15).', 'logistica' ),
							__( 'Al terminar la máquina, cambia el estado a Terminado; eso sube la eficiencia de la semana.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'planeacion-impresion-calculos',
				'title'    => __( 'Planeación impresión — cómo se calcula la duración', 'logistica' ),
				'tab_slug' => 'logistica-planeacion-impresion',
				'intro'    => __( 'Cuando el tipo de labor es «Impresión», el sistema estima cuánto durará el trabajo.', 'logistica' ),
				'list'     => array(
					__( 'Regla base: 1000 tamaños (tiraje) ≈ 60 minutos de impresión.', 'logistica' ),
					__( 'Fórmula: (Tiraje ÷ 1000) × 60 minutos × factor de complejidad.', 'logistica' ),
					__( 'El resultado se redondea al múltiplo de 15 minutos más cercano (mínimo 15 min).', 'logistica' ),
					__( 'Ejemplo: 2000 tamaños, complejidad Media (×1,25) → (2000÷1000)×60×1,25 = 150 minutos.', 'logistica' ),
				),
				'table'    => array(
					'headers' => array(
						__( 'Complejidad', 'logistica' ),
						__( 'Factor (multiplica la duración base)', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Normal', 'logistica' ), '×1' ),
						array( __( 'Media', 'logistica' ), '×1,25' ),
						array( __( 'Alta', 'logistica' ), '×1,5' ),
						array( __( 'Muy alta', 'logistica' ), '×2' ),
					),
				),
			),
			array(
				'id'       => 'planeacion-metricas',
				'title'    => __( 'Métricas de planeación (impresión y formado)', 'logistica' ),
				'tab_slug' => 'logistica-planeacion-impresion',
				'intro'    => __( 'Arriba del tablero semanal verás tarjetas con números de la semana que estás programando. Abajo, «Resultados semana actual vs semana anterior» compara la semana visible con la inmediatamente anterior para la máquina seleccionada. Las fórmulas son las mismas en impresión y formado.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Métrica', 'logistica' ),
						__( 'Qué significa (en palabras simples)', 'logistica' ),
					),
					'rows'    => array(
						array(
							__( 'Horas disponibles', 'logistica' ),
							__( 'Tiempo total que la máquina podría trabajar esa semana: suma las jornadas de los días laborables, restando la pausa de almuerzo si está activa.', 'logistica' ),
						),
						array(
							__( 'Horas ocupadas', 'logistica' ),
							__( 'Tiempo ya programado con actividades en el tablero (suma de duración de cada actividad).', 'logistica' ),
						),
						array(
							__( 'Horas libres', 'logistica' ),
							__( 'Disponibles − ocupadas: capacidad sin usar.', 'logistica' ),
						),
						array(
							__( 'Ocupación (%)', 'logistica' ),
							__( 'Porcentaje de capacidad programada: (minutos ocupados ÷ minutos disponibles) × 100.', 'logistica' ),
						),
						array(
							__( 'Eficiencia (%)', 'logistica' ),
							__( 'De lo programado, cuánto ya terminó: (minutos en estado Terminado ÷ minutos ocupados) × 100.', 'logistica' ),
						),
						array(
							__( 'Tiempo en retraso', 'logistica' ),
							__( 'Suma de minutos de actividades en estado Retrasado o marcadas con retraso.', 'logistica' ),
						),
						array(
							__( 'Por estado (lista)', 'logistica' ),
							__( 'Cuántas actividades y cuántas horas hay en Pendiente, En proceso, Terminado y Retrasado.', 'logistica' ),
						),
					),
				),
				'list'     => array(
					__( 'Fórmulas semanales: Ocupación = ocupados ÷ disponibles × 100 · Eficiencia = terminados ÷ ocupados × 100.', 'logistica' ),
					__( 'Los porcentajes se redondean a 1 decimal.', 'logistica' ),
					__( 'La barra de ocupación visual resume disponible vs ocupado de un vistazo.', 'logistica' ),
					__( '«Resultados semana actual vs semana anterior»: despliega la sección para comparar las dos semanas consecutivas según la semana que estás viendo en el tablero.', 'logistica' ),
					__( 'La semana anterior es siempre 7 días antes del lunes de la semana visible (no depende del mes calendario).', 'logistica' ),
					__( 'Gráfico «Horas disponibles y ocupadas»: barras lado a lado para cada semana.', 'logistica' ),
					__( 'Gráfico «Ocupación y eficiencia»: barras agrupadas con el % de cada semana (gris = anterior, verde = actual).', 'logistica' ),
					__( 'Gráfico «Actividades por estado»: minutos en Pendiente, En proceso, Terminado y Retrasado comparados entre ambas semanas.', 'logistica' ),
					__( 'Gráfico «Tiempo en retraso»: horas en retraso de cada semana.', 'logistica' ),
					__( 'Solo se usan programaciones guardadas en base de datos; si una semana no se guardó aún, aparecerá en cero.', 'logistica' ),
					__( 'Al cambiar de semana con ← / → o al cambiar de máquina, la comparación se recalcula al abrir de nuevo la sección.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo semanal: ocupación y eficiencia', 'logistica' ),
						'list'  => array(
							__( '5 días laborables × 8 h netas (480 min/día, con almuerzo descontado) = 2.400 min disponibles.', 'logistica' ),
							__( 'Actividades programadas por 1.200 min → Ocupación = 1.200 ÷ 2.400 × 100 = 50,0%.', 'logistica' ),
							__( 'De esos 1.200 min, 600 están en estado Terminado → Eficiencia = 600 ÷ 1.200 × 100 = 50,0%.', 'logistica' ),
							__( 'Las 600 min restantes en Pendiente o En proceso no cuentan para eficiencia hasta marcarse Terminado.', 'logistica' ),
						),
					),
					array(
						'title' => __( 'Ejemplo: leer la comparación semana anterior vs actual', 'logistica' ),
						'body'  => __( 'Estás viendo la semana del 23/06 al 29/06. La comparación muestra esa semana (actual) frente a la del 16/06 al 22/06 (anterior). Cada gráfico tiene dos columnas o series — una por semana.', 'logistica' ),
						'table' => array(
							'headers' => array(
								__( 'Semana', 'logistica' ),
								__( 'Disponible', 'logistica' ),
								__( 'Ocupado', 'logistica' ),
								__( 'Terminado', 'logistica' ),
								__( 'Ocupación', 'logistica' ),
								__( 'Eficiencia', 'logistica' ),
							),
							'rows'    => array(
								array( __( 'Anterior (16/06 – 22/06)', 'logistica' ), '2.400 min', '1.200 min', '600 min', '50,0%', '50,0%' ),
								array( __( 'Actual (23/06 – 29/06)', 'logistica' ), '2.400 min', '1.800 min', '900 min', '75,0%', '50,0%' ),
							),
						),
						'list'    => array(
							__( 'Horas ocupadas subieron de 20 h a 30 h → la barra verde (actual) es más alta en el gráfico de horas.', 'logistica' ),
							__( 'Ocupación pasó de 50 % a 75 % — se programó más capacidad en la semana actual.', 'logistica' ),
							__( 'Eficiencia se mantuvo en 50 % en ambas semanas (mitad de lo programado ya terminado).', 'logistica' ),
							__( 'Cada semana calcula su propio %; no se mezclan minutos entre semanas.', 'logistica' ),
						),
					),
					array(
						'title' => __( 'Ejemplo: qué sube la eficiencia en la práctica', 'logistica' ),
						'list'  => array(
							__( 'Semana con 20 h programadas (1.200 min) y 10 h ya Terminado → eficiencia 50%.', 'logistica' ),
							__( 'Marcas 5 h más como Terminado (sin agregar actividades) → terminado pasa a 15 h → eficiencia 75%.', 'logistica' ),
							__( 'Agregar actividades nuevas sube la ocupación; marcar Terminado sube la eficiencia.', 'logistica' ),
						),
					),
				),
				'notes'    => array(
					__( 'En el tablero en vivo, las horas ocupadas pueden calcularse desde los segmentos visibles del cronograma (ligeramente distinto a la suma bruta si hay solapamientos).', 'logistica' ),
					__( 'Los gráficos de comparación usan los datos guardados al autoguardar o al cambiar de semana.', 'logistica' ),
				),
			),
			array(
				'id'       => 'planeacion-formado',
				'title'    => __( 'Planeación formado', 'logistica' ),
				'tab_slug' => 'logistica-planeacion-formado',
				'intro'    => __( 'Igual que planeación de impresión, pero para formadoras, pegadoras y troqueladoras. Los datos son independientes: cambiar impresión no afecta formado.', 'logistica' ),
				'list'     => array(
					__( 'Máquinas predefinidas: Formadoras de vasos (#01 a #13), Formadora de cajas, Pegadora, Troqueladora. Puedes crear más.', 'logistica' ),
					__( 'Misma barra de herramientas: semana, Exportar/Importar, almuerzo, Vista (+/−), estados y colores.', 'logistica' ),
					__( 'Tipos de labor: Formado, Troquelado, Pegado, Corte y separación, Limpieza, Preparación siguiente trabajo, Reunión producción, Otra actividad.', 'logistica' ),
					__( 'Checklist en actividades: Montaje, Troquel, Pegado y Cumplimiento de metas.', 'logistica' ),
					__( 'En WordPress admin puedes configurar listas desplegables y la tabla de rendimiento por referencia (und/h).', 'logistica' ),
				),
				'table'    => array(
					'headers' => array(
						__( 'Tipo de labor', 'logistica' ),
						__( 'Cómo se calcula la duración', 'logistica' ),
					),
					'rows'    => array(
						array(
							__( 'Formado (con referencia)', 'logistica' ),
							__( '(Cantidad ÷ Rendimiento und/h) × 60 × factor complejidad. Ejemplo: 4000 und a 1800 und/h Normal → 135 min.', 'logistica' ),
						),
						array(
							__( 'Troquelado', 'logistica' ),
							__( 'Igual que impresión: 1000 unidades ≈ 60 min × factor de complejidad.', 'logistica' ),
						),
						array(
							__( 'Pegado / Corte', 'logistica' ),
							__( 'Automática según cantidad y reglas del tipo de labor.', 'logistica' ),
						),
						array(
							__( 'Limpieza, reunión, otra', 'logistica' ),
							__( 'Duración manual (el sistema sugiere valores típicos).', 'logistica' ),
						),
					),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: formado con rendimiento por referencia', 'logistica' ),
						'list'  => array(
							__( 'Formadora #03 · Martes · Tipo Formado · Referencia «Vaso 12 oz».', 'logistica' ),
							__( 'Cantidad 4.000 und · Rendimiento 1.800 und/h · Complejidad Normal.', 'logistica' ),
							__( 'Duración: (4000 ÷ 1800) × 60 × 1 = 133 min → redondea a 135 min.', 'logistica' ),
							__( 'Las métricas semanales y la comparación con la semana anterior funcionan igual que en impresión (ver sección Métricas de planeación).', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'cierre-caracteristicas',
				'title'    => __( 'Características por código', 'logistica' ),
				'tab_slug' => 'logistica-cierre-caracteristicas',
				'intro'    => __( 'Aquí defines largo, ancho, alto y clave de cada código. Cierre de órdenes usa estos datos cuando una base coincide con el código.', 'logistica' ),
				'list'     => array(
					__( 'Fila completa (verde): tiene largo, ancho, alto y clave.', 'logistica' ),
					__( 'Fila incompleta (naranja): falta algún dato importante.', 'logistica' ),
					__( 'Botones: Añadir referencia, Agregar/Actualizar característica, Editar, Eliminar.', 'logistica' ),
					__( 'Filtros por búsqueda, descripción y tipo de base.', 'logistica' ),
					__( 'Exportar e Importar Excel.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: completar características de un código', 'logistica' ),
						'list'  => array(
							__( 'Código «CART-SBS-12» · Descripción «Cartón SBS 12 oz».', 'logistica' ),
							__( 'Largo 120 mm · Ancho 80 mm · Alto 45 mm · Clave «SBS350».', 'logistica' ),
							__( 'La fila queda verde (completa) y Cierre de órdenes puede usar esas medidas al calcular.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'codigos-etiqueta',
				'title'    => __( 'Códigos etiqueta', 'logistica' ),
				'tab_slug' => 'logistica-codigos-etiqueta',
				'intro'    => __( 'Catálogo de productos con código de barras EAN-13 e impresión de etiquetas de producción.', 'logistica' ),
				'list'     => array(
					__( 'Formulario «Nuevo código»: Referencia (REF), Tipo de producto, Mercado (ej. NAC), Tamaño. El EAN-13 se genera automáticamente.', 'logistica' ),
					__( 'Tabla con filtros por tipo, mercado y tamaño. Acciones: editar, eliminar, Imprimir etiquetas.', 'logistica' ),
					__( 'Impresión: indicas paquetes, unidades por paquete y número de caja inicial. Cantidad total = paquetes × und/paq.', 'logistica' ),
					__( 'Configuración de tamaño de etiqueta (ancho × largo en mm) y opción «Permitir caja inicial en blanco».', 'logistica' ),
					__( 'Exportar e Importar Excel del catálogo completo.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: crear e imprimir etiquetas', 'logistica' ),
						'list'  => array(
							__( 'Nuevo código: REF «COP12» · Tipo Copa · Mercado NAC · Tamaño 12 oz → EAN-13 generado.', 'logistica' ),
							__( 'Imprimir etiquetas: 10 paquetes × 100 und/paq = 1.000 etiquetas · Caja inicial 1.', 'logistica' ),
							__( 'Cada etiqueta lleva código de barras, referencia y número de caja.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'rotulos-rollos',
				'title'    => __( 'Rótulos rollos', 'logistica' ),
				'tab_slug' => 'logistica-rotulos-rollos',
				'intro'    => __( 'El módulo tiene dos pestañas internas: rótulos de rollos y rotulado de estibas de producto terminado.', 'logistica' ),
				'list'     => array(
					__( 'Pestaña «Rótulos rollos»: catálogo de anchos con color automático; impresión con lote, peso y gramaje (2 media cartas por hoja Carta).', 'logistica' ),
					__( 'Formulario «Nuevo ancho»: Tipo, Tamaño (ej. 68 CM), observaciones. Vista previa del color asignado.', 'logistica' ),
					__( 'Pestaña «Estibas producto terminado»: referencia, cantidad de cajas, unidades por caja y total (automático).', 'logistica' ),
					__( 'Estibas se imprimen a tamaño Carta completo (una estiba por página). Márgenes «Ninguno», sin encabezados/pies y «Gráficos de fondo».', 'logistica' ),
					__( 'Exportar e Importar Excel aplica al catálogo de rollos (columna ID sirve para actualizar filas existentes).', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: imprimir un rótulo de rollo', 'logistica' ),
						'list'  => array(
							__( 'Nuevo ancho: Tipo «Polipropileno» · Tamaño «68 CM» → color automático en la tabla.', 'logistica' ),
							__( 'Imprimir rótulo: Lote «L-2026-03» · Peso 35 kg · Gramaje 350.', 'logistica' ),
							__( 'Pega el rótulo físico al rollo en bodega para identificarlo rápido.', 'logistica' ),
						),
					),
					array(
						'title' => __( 'Ejemplo: rotulado de estiba', 'logistica' ),
						'list'  => array(
							__( 'Pestaña Estibas → Referencia «CAJA-AZUL-12» · Cajas 20 · Und/caja 24 → Total 480.', 'logistica' ),
							__( 'Vista previa y luego Imprimir en hoja Carta.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'cuadro-pedidos',
				'title'    => __( 'Cuadro de pedidos', 'logistica' ),
				'tab_slug' => 'logistica-cuadro-pedidos',
				'intro'    => __( 'Gestiona órdenes de compra (OC) y, en algunos tableros, inventario reportado por cliente.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Estilo de tablero', 'logistica' ),
						__( 'Uso', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Generales', 'logistica' ), __( 'OC sin inventario; referencias desde rendimiento de formado.', 'logistica' ) ),
						array( __( 'Sin impresión', 'logistica' ), __( 'Pedidos que no pasan por impresión.', 'logistica' ) ),
						array( __( 'Colsubsidio / Puerto Rico', 'logistica' ), __( 'Tableros específicos por cliente.', 'logistica' ) ),
						array( __( 'Hornitos', 'logistica' ), __( 'OC + inventario Hornitos sincronizado con entregas parciales.', 'logistica' ) ),
					),
				),
				'list'     => array(
					__( 'Puedes crear estilos personalizados con «+ Nueva máquina/estilo» → «Crear estilo».', 'logistica' ),
					__( 'Estados de OC (en orden): Sin confirmar → Aprobado → Programado → Conversión → Impresión → Troquelado → Descartone → Formado → Embalaje → Despacho → Entregado → Finalizado. También Cancelado.', 'logistica' ),
					__( 'Cada estado tiene un color de fila para identificarlo rápido.', 'logistica' ),
					__( 'Modal «Nueva/Editar orden de compra»: fecha OC, cliente, tipo producto, cantidad, tolerancia ±%, precio, fechas de entrega y prórroga.', 'logistica' ),
					__( 'Entregas parciales: cuando el estado es Despacho o Entregado aparecen columnas Cant. 1, Factura 1, Cant. 2… Marca Entregado solo si la suma iguala la cantidad pedida.', 'logistica' ),
					__( 'Tablero Hornitos: inventario Disponible (desde entregas) y Latingraf (ajuste manual con +/−).', 'logistica' ),
					__( 'Exportar e Importar Excel por estilo de tablero.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: avanzar una línea de OC', 'logistica' ),
						'list'  => array(
							__( 'OC 4521 · Cliente Hornitos · 50.000 vasos · Estado Programado.', 'logistica' ),
							__( 'Cambias a Conversión → se abre el modal para indicar la OP (ej. 8510).', 'logistica' ),
							__( 'Avanzas Impresión → Formado → Despacho; registras entrega parcial Cant. 1 = 25.000.', 'logistica' ),
							__( 'Segunda entrega 25.000 → suma igual a pedido → puedes marcar Entregado y luego Finalizado.', 'logistica' ),
							__( 'Cantidad finalizada solo se edita con lápiz cuando el estado es Finalizado.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'revision-minuta',
				'title'    => __( 'Revisión minuta', 'logistica' ),
				'tab_slug' => 'logistica-revision-minuta',
				'intro'    => __( 'Revisa minutas de producción traídas desde Excel (hoja «minutas» del sistema de origen).', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Elemento', 'logistica' ),
						__( 'Descripción', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Tarjetas resumen', 'logistica' ), __( 'Total minutas, buenas, malas, sin hora final, con malas, pendientes de revisión.', 'logistica' ) ),
						array( __( 'Columna Revisión', 'logistica' ), __( 'Editable: Pendiente, OK o Con observación. Se autoguarda al cambiar.', 'logistica' ) ),
						array( __( 'Filtros', 'logistica' ), __( 'Buscar, cliente, fecha, proceso (varios), empleado, estado revisión.', 'logistica' ) ),
						array( __( 'Exportar / Importar Excel', 'logistica' ), __( 'Actualización masiva de minutas.', 'logistica' ) ),
					),
				),
				'list'     => array(
					__( 'Columnas: Minuta, Fecha, Orden, Cliente, Referencia, Máquina, Proceso, Horas inicio/fin, Minutos, Buenas, Malas, Empleado, Estado, Observación.', 'logistica' ),
					__( 'Orden por columnas (clic en encabezado) y paginación.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: revisar una minuta con malas', 'logistica' ),
						'list'  => array(
							__( 'Minuta #8842 · Cliente ABC · Proceso Formado · Buenas 9.800 · Malas 200.', 'logistica' ),
							__( 'Columna Revisión: cambias a «Con observación» y escribes «Revisar troquel».', 'logistica' ),
							__( 'El autoguardado confirma; filtra por «Con observación» para el seguimiento del día.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'roles-acceso',
				'title'    => __( 'Roles y acceso de usuarios', 'logistica' ),
				'tab_slug' => 'logistica-configuracion',
				'intro'    => __( 'No todos los usuarios ven las mismas pestañas. Los roles representan áreas de una empresa gráfica: comercial, coordinación, calidad, producción, bodega, etc.', 'logistica' ),
				'table'    => array(
					'headers' => array(
						__( 'Rol', 'logistica' ),
						__( 'Área típica', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Administrador JB', 'logistica' ), __( 'Acceso completo incluyendo Configuración.', 'logistica' ) ),
						array( __( 'Comercial JB', 'logistica' ), __( 'Pedidos, cotizaciones, cuadro de pedidos.', 'logistica' ) ),
						array( __( 'Coordinador JB', 'logistica' ), __( 'Planeación, cierres, inventario, coordinación general.', 'logistica' ) ),
						array( __( 'Calidad JB', 'logistica' ), __( 'Minutas, características, códigos etiqueta.', 'logistica' ) ),
						array( __( 'Producción JB', 'logistica' ), __( 'Impresión, formado, rótulos, cálculos de planta.', 'logistica' ) ),
						array( __( 'Logística / Bodega JB', 'logistica' ), __( 'Inventario, rótulos, materiales.', 'logistica' ) ),
						array( __( 'Colaborador', 'logistica' ), __( 'Inicio (tareas y recordatorios) y consultas básicas.', 'logistica' ) ),
					),
				),
				'list'     => array(
					__( 'Configuración → Roles y permisos: matriz con checkboxes de pestañas Backend (operaciones) y Frontend (panel público) por rol.', 'logistica' ),
					__( 'Botón «Guardar roles y permisos»: guarda la matriz y la página de operaciones.', 'logistica' ),
					__( 'Usuarios → Editar usuario → sección JB Planeación: asignar rol operativo y, opcionalmente, pestañas personalizadas.', 'logistica' ),
					__( 'Usuarios con rol JB entran por la página de operaciones del plugin (plantilla JB Planeación — Operaciones), no necesitan el escritorio WordPress.', 'logistica' ),
					__( 'Tras iniciar sesión van directo al panel de operaciones. No ven la barra negra de administración de WordPress.', 'logistica' ),
					__( 'Administradores WordPress siguen usando JB Planeación desde el menú lateral de WordPress.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: qué ve un rol Producción JB', 'logistica' ),
						'list'  => array(
							__( 'Entra por la página de operaciones con usuario rol Producción JB.', 'logistica' ),
							__( 'Ve: Planeación impresión, Planeación formado, Cálculo tapas, Rótulos rollos, Inicio.', 'logistica' ),
							__( 'No ve: Configuración ni Roles (solo Administrador JB).', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'       => 'configuracion',
				'title'    => __( 'Configuración (administradores)', 'logistica' ),
				'tab_slug' => 'logistica-configuracion',
				'intro'    => __( 'Opciones globales del plugin. Solo visible para administradores o rol Administrador JB.', 'logistica' ),
				'list'     => array(
					__( 'Panel público: elige la página con [logistica_panel] y qué pestañas aparecen en el menú frontal. Botón «Guardar panel público».', 'logistica' ),
					__( 'Roles y permisos: ver sección anterior.', 'logistica' ),
					__( 'Fórmulas de conversión: edita las expresiones matemáticas base de las Calculadoras. Botón «Guardar fórmulas».', 'logistica' ),
					__( 'Información del sistema: versión del plugin y tablas (solo lectura).', 'logistica' ),
					__( 'En la pestaña Inicio (configuración): estados de cotización editables y festivos del checklist.', 'logistica' ),
				),
				'examples' => array(
					array(
						'title' => __( 'Ejemplo: dar acceso al panel público', 'logistica' ),
						'list'  => array(
							__( 'Configuración → Panel público: selecciona la página con shortcode [logistica_panel].', 'logistica' ),
							__( 'Marca las pestañas visibles (ej. Inicio, Calculadoras, Cuadro pedidos).', 'logistica' ),
							__( 'Guardar panel público → los usuarios con rol Comercial JB entran desde el sitio web sin WordPress admin.', 'logistica' ),
						),
					),
				),
			),
			array(
				'id'    => 'donde-trabajar',
				'title' => __( '¿Dónde trabajo cada cosa?', 'logistica' ),
				'intro' => __( 'Algunos módulos se usan en el panel público y otros en operaciones. Esta tabla aclara dónde encontrarlos.', 'logistica' ),
				'table' => array(
					'headers' => array(
						__( 'Módulo', 'logistica' ),
						__( 'Dónde se usa normalmente', 'logistica' ),
					),
					'rows'    => array(
						array( __( 'Inicio', 'logistica' ), __( 'Panel público y operaciones.', 'logistica' ) ),
						array( __( 'Calculadoras, Inventario, Cierre, Minuta, Cuadro pedidos', 'logistica' ), __( 'Según permisos del rol (backend y/o frontend).', 'logistica' ) ),
						array( __( 'Planeación impresión y formado', 'logistica' ), __( 'Programación diaria en panel público; listas y rendimiento en WordPress admin.', 'logistica' ) ),
						array( __( 'Códigos etiqueta', 'logistica' ), __( 'Catálogo e impresión en panel público; tamaño y listas en admin.', 'logistica' ) ),
						array( __( 'Rótulos rollos', 'logistica' ), __( 'Backend y frontend según rol.', 'logistica' ) ),
						array( __( 'Configuración y roles', 'logistica' ), __( 'Solo WordPress admin o Administrador JB.', 'logistica' ) ),
					),
				),
			),
			array(
				'id'    => 'consejos',
				'title' => __( 'Consejos rápidos', 'logistica' ),
				'intro' => __( 'Buenas prácticas para empezar sin frustraciones.', 'logistica' ),
				'list'  => array(
					__( 'Antes de importar Excel, exporta primero una plantilla del mismo módulo para ver el formato correcto.', 'logistica' ),
					__( 'En planeación, define jornada y almuerzo antes de agregar muchas actividades; así los horarios cuadran solos.', 'logistica' ),
					__( 'Mantén Características por código al día para que Cierre de órdenes calcule bien.', 'logistica' ),
					__( 'Usa «Últimas actualizaciones» en Inicio para retomar trabajo interrumpido.', 'logistica' ),
					__( 'Si aparece «Sesión expirada», no sigas editando: inicia sesión de nuevo y vuelve a cargar los datos.', 'logistica' ),
					__( 'Si algo no se guarda, revisa permisos de tu rol o pregunta al administrador.', 'logistica' ),
					__( 'En Ayuda, abre el menú de secciones (☰→) para saltar al tema que buscas. Esta guía se actualiza con el plugin.', 'logistica' ),
				),
			),
		);

		return $sections;
	}

	/**
	 * Enlaces para el menú de navegación interna de Ayuda.
	 *
	 * @return list<array{id:string,label:string}>
	 */
	public static function nav_sections() {
		$nav = array();

		foreach ( self::sections() as $section ) {
			if ( ! is_array( $section ) ) {
				continue;
			}

			$id    = sanitize_key( (string) ( $section['id'] ?? '' ) );
			$label = trim( (string) ( $section['title'] ?? '' ) );
			if ( '' === $id || '' === $label ) {
				continue;
			}

			$nav[] = array(
				'id'    => $id,
				'label' => $label,
			);
		}

		return $nav;
	}

	/**
	 * @param string $slug Tab slug.
	 * @param string $context admin|frontend.
	 * @return string
	 */
	public static function tab_url( $slug, $context = 'admin' ) {
		require_once LOGISTICA_PLUGIN_DIR . 'admin/views/partials.php';

		return logistica_tab_url( $slug, $context );
	}
}
