<?php
/**
 * Barra de avisos (marquee) del header.
 *
 * Se engancha a astra_header_before(), que es exactamente el punto donde
 * estaba puesto a mano en el header.php: adentro de #page y antes del header.
 * Por eso ya no hace falta sobreescribir la plantilla del padre.
 *
 * El contenido y el ritmo se editan en Apariencia -> Personalizar -> Barra de
 * avisos. El markup lo genera PHP, así que las dos copias que necesita la
 * animación salen del mismo string y no pueden quedar desincronizadas.
 *
 * @package CoffeTiggerTheme
 */

defined( 'ABSPATH' ) || exit;

class CT_Marquee {

	/** Prefijo de todos los theme_mod de este módulo. */
	const PREFIJO = 'ct_marquee_';

	public static function init() {
		add_action( 'astra_header_before', array( __CLASS__, 'render' ) );
		add_action( 'customize_register', array( __CLASS__, 'customizer' ) );
	}

	public static function defaults() {
		return array(
			'activo'        => true,
			// Comillas simples a propósito: en dobles, el $ del precio queda a
			// un carácter de que PHP intente interpolarlo como variable.
			'mensajes'      => 'Envíos gratis a todo el país a partir de $74000',
			'repeticiones'  => 6,
			'velocidad'     => 30,
			'bg'            => '#f5c056',
			'color'         => '#21211f',
		);
	}

	private static function get( $clave ) {
		$defaults = self::defaults();
		return get_theme_mod( self::PREFIJO . $clave, $defaults[ $clave ] );
	}

	/**
	 * El textarea es un mensaje por línea. Si hay varios, se van alternando
	 * dentro de la cinta.
	 */
	private static function mensajes() {
		$crudo  = (string) self::get( 'mensajes' );
		$lineas = preg_split( '/\R/', $crudo );

		$mensajes = array();
		foreach ( (array) $lineas as $linea ) {
			$linea = trim( $linea );
			if ( '' !== $linea ) {
				$mensajes[] = $linea;
			}
		}

		return $mensajes;
	}

	/* ======================================================================
	   Customizer
	   ====================================================================== */
	public static function customizer( $wp_customize ) {
		$wp_customize->add_section(
			'ct_marquee_section',
			array(
				'title'       => __( 'Barra de avisos', 'coffetigger' ),
				'description' => __( 'La cinta que corre arriba del header.', 'coffetigger' ),
				'priority'    => 25,
			)
		);

		$campos = array(
			'activo'       => array(
				'label'   => __( 'Mostrar la barra', 'coffetigger' ),
				'type'    => 'checkbox',
				'sanitize' => array( __CLASS__, 'sanitize_bool' ),
			),
			'mensajes'     => array(
				'label'       => __( 'Mensajes', 'coffetigger' ),
				'description' => __( 'Uno por línea. Si ponés varios, se alternan dentro de la cinta.', 'coffetigger' ),
				'type'        => 'textarea',
				'sanitize'    => 'sanitize_textarea_field',
			),
			'repeticiones' => array(
				'label'       => __( 'Repeticiones', 'coffetigger' ),
				'description' => __( 'Cuántas veces se repite la tanda. Tiene que alcanzar para tapar el ancho de la pantalla más grande, o se ve un hueco al reiniciar. 6 cubre hasta ~3000px.', 'coffetigger' ),
				'type'        => 'number',
				'input_attrs' => array(
					'min'  => 1,
					'max'  => 30,
					'step' => 1,
				),
				'sanitize'    => 'absint',
			),
			'velocidad'    => array(
				'label'       => __( 'Segundos por vuelta', 'coffetigger' ),
				'description' => __( 'Más chico = más rápido. Ojo: si alargás el texto recorre más distancia en el mismo tiempo, o sea acelera.', 'coffetigger' ),
				'type'        => 'number',
				'input_attrs' => array(
					'min'  => 5,
					'max'  => 200,
					'step' => 1,
				),
				'sanitize'    => 'absint',
			),
		);

		foreach ( $campos as $clave => $config ) {
			$id = self::PREFIJO . $clave;

			$wp_customize->add_setting(
				$id,
				array(
					'default'           => self::defaults()[ $clave ],
					'sanitize_callback' => $config['sanitize'],
					'transport'         => 'refresh',
				)
			);

			$wp_customize->add_control(
				$id,
				array(
					'label'       => $config['label'],
					'description' => isset( $config['description'] ) ? $config['description'] : '',
					'section'     => 'ct_marquee_section',
					'type'        => $config['type'],
					'input_attrs' => isset( $config['input_attrs'] ) ? $config['input_attrs'] : array(),
				)
			);
		}

		// Los colores usan el control nativo con picker.
		$colores = array(
			'bg'    => __( 'Color de fondo', 'coffetigger' ),
			'color' => __( 'Color del texto', 'coffetigger' ),
		);

		foreach ( $colores as $clave => $label ) {
			$id = self::PREFIJO . $clave;

			$wp_customize->add_setting(
				$id,
				array(
					'default'           => self::defaults()[ $clave ],
					'sanitize_callback' => 'sanitize_hex_color',
					'transport'         => 'refresh',
				)
			);

			$wp_customize->add_control(
				new WP_Customize_Color_Control(
					$wp_customize,
					$id,
					array(
						'label'   => $label,
						'section' => 'ct_marquee_section',
					)
				)
			);
		}
	}

	public static function sanitize_bool( $valor ) {
		return (bool) $valor;
	}

	/* ======================================================================
	   Render
	   ====================================================================== */
	public static function render() {
		if ( ! self::get( 'activo' ) ) {
			return;
		}

		$mensajes = self::mensajes();
		if ( empty( $mensajes ) ) {
			return;
		}

		$repeticiones = max( 1, min( 30, (int) self::get( 'repeticiones' ) ) );
		$velocidad    = max( 5, min( 200, (int) self::get( 'velocidad' ) ) );

		// Un solo grupo armado una vez y escupido dos veces: así las dos
		// copias que necesita la animación son idénticas por construcción.
		$grupo = '';
		for ( $i = 0; $i < $repeticiones; $i++ ) {
			foreach ( $mensajes as $mensaje ) {
				$grupo .= '<span>' . esc_html( $mensaje ) . '</span>';
			}
		}

		$vars = sprintf(
			'--marquee-speed:%ds;--marquee-bg:%s;--marquee-fg:%s;',
			$velocidad,
			self::get( 'bg' ),
			self::get( 'color' )
		);

		printf(
			'<div class="marquee-header" style="%1$s">
				<div class="marquee-header__track">
					<div class="marquee-header__group">%2$s</div>
					<div class="marquee-header__group" aria-hidden="true">%2$s</div>
				</div>
			</div>',
			esc_attr( $vars ),
			$grupo // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- cada mensaje ya pasó por esc_html().
		);
	}
}

CT_Marquee::init();
