<?php
defined( 'ABSPATH' ) || exit;

/**
 * Frontend: enqueues the capture script and passes config.
 */
class BW_Lead_AI_Frontend {

	private static $instance = null;

	public static function instance() {
		if ( null === self::$instance ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	public function register() {
		add_action( 'wp_enqueue_scripts', array( $this, 'enqueue' ) );
		add_action( 'wp_head', array( $this, 'hide_tracking_fields' ), 100 );
	}

	public function enqueue() {
		if ( is_admin() ) {
			return;
		}
		wp_register_script(
			'bw-lead-ai-capture',
			BW_LEAD_AI_URL . 'assets/js/capture.js',
			array(),
			BW_LEAD_AI_VERSION,
			true
		);
		wp_localize_script( 'bw-lead-ai-capture', 'bwLeadAI', $this->client_config() );
		wp_enqueue_script( 'bw-lead-ai-capture' );
	}

	public function client_config() {
		$settings = BW_Lead_AI_Settings::get();

		$targets = array();
		foreach ( $settings['field_targets'] as $key => $row ) {
			$targets[ $key ] = array(
				'attr' => isset( $row['attr'] ) ? (string) $row['attr'] : '',
				'val'  => isset( $row['val'] ) ? (string) $row['val'] : '',
			);
		}

		$aliases = BW_Lead_AI_Settings::parse_parameter_aliases( $settings['parameter_aliases'] );

		return array(
			'version'               => BW_LEAD_AI_VERSION,
			'debug'                 => ! empty( $settings['debug'] ),
			'dimensions'            => $aliases['standard'],
			'customDimensions'      => $aliases['custom'],
			'clickIds'              => BW_Lead_AI_Settings::parse_click_ids( $settings['click_ids'] ),
			'channels'              => BW_Lead_AI_Settings::parse_channels( $settings['channels'] ),
			'referrerClasses'       => BW_Lead_AI_Settings::parse_referrer_classification( $settings['referrer_classification'] ),
			'sourceMediumSeparator' => (string) $settings['source_medium_separator'],
			'targets'               => $targets,
		);
	}

	public function hide_tracking_fields() {
		if ( is_admin() ) {
			return;
		}
		$settings = BW_Lead_AI_Settings::get();
		$show     = current_user_can( 'manage_options' ) && ! empty( $settings['debug'] );
		$display  = $show ? 'block' : 'none';

		$selectors = array();
		foreach ( $settings['field_targets'] as $row ) {
			if ( empty( $row['attr'] ) || empty( $row['val'] ) ) {
				continue;
			}
			$attr = $row['attr'];
			$val  = $row['val'];
			if ( 'id' === $attr ) {
				$selectors[] = '#' . $val;
			} elseif ( 'class' === $attr ) {
				$selectors[] = '.' . $val;
			} elseif ( 'name' === $attr ) {
				$selectors[] = '[name="' . $val . '"]';
			} elseif ( 'selector' === $attr ) {
				$selectors[] = $val;
			}
		}
		if ( empty( $selectors ) ) {
			return;
		}
		// Sanitize each selector before output.
		$safe = array();
		foreach ( $selectors as $sel ) {
			// Allow a permissive but CSS-only character set.
			$sel = preg_replace( '/[^a-zA-Z0-9_\-\.\#\[\]\=\"\' :\(\),\*>~\+]/', '', $sel );
			if ( '' !== $sel ) {
				$safe[] = $sel;
			}
		}
		if ( empty( $safe ) ) {
			return;
		}
		echo '<style id="bw-lead-ai-hide">' . esc_html( implode( ', ', $safe ) ) . ' { display: ' . esc_html( $display ) . "; }</style>\n";
	}
}
