<?php
/**
 * Phân hệ Đo lường tương tác nội dung (Engagement Tracking) — Sun Reaches plan.
 * Theo dõi nhẹ, tôn trọng quyền riêng tư: không thu thập PII, chỉ 1 id ngẫu
 * nhiên theo trình duyệt (localStorage/cookie), scroll depth, hoàn thành đọc,
 * click CTA, submit form CF7, chọn văn bản, click liên hệ ra ngoài (tel/WhatsApp).
 * Được require từ seo-console.php.
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

define( 'TTSEO_ENG_DBVER', '1' );

/* =========================================================================
 * BẢNG DỮ LIỆU
 * ========================================================================= */
function ttseo_eng_table() {
	global $wpdb;
	return $wpdb->prefix . 'ttseo_engagement';
}
function ttseo_eng_install() {
	if ( get_option( 'ttseo_eng_dbver' ) === TTSEO_ENG_DBVER ) {
		return;
	}
	global $wpdb;
	$table   = ttseo_eng_table();
	$charset = $wpdb->get_charset_collate();
	require_once ABSPATH . 'wp-admin/includes/upgrade.php';
	dbDelta( "CREATE TABLE $table (
		id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
		post_id BIGINT UNSIGNED NOT NULL DEFAULT 0,
		event_type VARCHAR(40) NOT NULL DEFAULT '',
		event_detail VARCHAR(191) NOT NULL DEFAULT '',
		anon_id VARCHAR(64) NOT NULL DEFAULT '',
		session_start DATETIME NULL DEFAULT NULL,
		created_at DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00',
		PRIMARY KEY (id),
		KEY post_id (post_id),
		KEY event_type (event_type),
		KEY anon_post (anon_id, post_id)
	) $charset;" );
	update_option( 'ttseo_eng_dbver', TTSEO_ENG_DBVER );
}
add_action( 'admin_init', 'ttseo_eng_install' );

/* =========================================================================
 * FRONT-END: enqueue trên trang single post (đủ dùng cho 12 bài batch nội dung
 * và mọi bài post khác — chi phí 1 request JS nhỏ, defer, không chặn render).
 * ========================================================================= */
add_action( 'wp_enqueue_scripts', function () {
	if ( ! is_singular( 'post' ) ) {
		return;
	}
	$post_id = get_the_ID();
	if ( ! $post_id ) {
		return;
	}
	wp_enqueue_script(
		'ttseo-engagement',
		TTSEO_URL . 'assets/js/engagement-tracker.js',
		array(),
		TTSEO_VER,
		true // in footer — behaves like defer, doesn't block render
	);
	wp_localize_script( 'ttseo-engagement', 'ttseoEng', array(
		'ajaxUrl' => admin_url( 'admin-ajax.php' ),
		'postId'  => (int) $post_id,
	) );
} );

/* =========================================================================
 * AJAX HANDLER (nopriv + priv) — nhận beacon, ghi 1 dòng, không trả PII.
 * ========================================================================= */
function ttseo_eng_valid_types() {
	return array( 'page_view', 'scroll_depth', 'read_complete', 'cta_click', 'form_submit', 'text_selection', 'outbound_contact_click' );
}
function ttseo_eng_handle_track() {
	global $wpdb;
	$post_id = absint( $_POST['post_id'] ?? 0 );
	$type    = sanitize_key( $_POST['event_type'] ?? '' );
	$detail  = sanitize_text_field( wp_unslash( $_POST['event_detail'] ?? '' ) );
	$anon    = preg_replace( '/[^a-zA-Z0-9]/', '', (string) ( $_POST['anon_id'] ?? '' ) );
	$sess    = sanitize_text_field( wp_unslash( $_POST['session_start'] ?? '' ) );

	if ( ! $post_id || ! in_array( $type, ttseo_eng_valid_types(), true ) || '' === $anon ) {
		wp_send_json_error( null, 400 );
	}
	$anon = substr( $anon, 0, 64 );
	$detail = mb_substr( $detail, 0, 190 );

	$session_start = null;
	if ( $sess && preg_match( '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $sess ) ) {
		$session_start = $sess;
	}

	$wpdb->insert( ttseo_eng_table(), array(
		'post_id'       => $post_id,
		'event_type'    => $type,
		'event_detail'  => $detail,
		'anon_id'       => $anon,
		'session_start' => $session_start,
		'created_at'    => current_time( 'mysql' ),
	) );
	wp_send_json_success( null );
}
add_action( 'wp_ajax_ttseo_track', 'ttseo_eng_handle_track' );
add_action( 'wp_ajax_nopriv_ttseo_track', 'ttseo_eng_handle_track' );

/* =========================================================================
 * TÓM TẮT CHO DASHBOARD — dùng transient cache ngắn giống các module khác.
 * ========================================================================= */
function ttseo_eng_summary() {
	$cache_key = 'ttseo_eng_summary';
	$cached    = get_transient( $cache_key );
	if ( false !== $cached ) {
		return $cached;
	}
	global $wpdb;
	$table = ttseo_eng_table();

	$month_start = gmdate( 'Y-m-01 00:00:00' );

	$totals = array(
		'views_month'   => (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT anon_id, post_id) FROM $table WHERE event_type='page_view' AND created_at >= %s", $month_start ) ),
		'cta_clicks'    => (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $table WHERE event_type='cta_click' AND created_at >= %s", $month_start ) ),
		'form_submits'  => (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $table WHERE event_type='form_submit' AND created_at >= %s", $month_start ) ),
		'read_complete' => (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $table WHERE event_type='read_complete' AND created_at >= %s", $month_start ) ),
	);

	// Per-post breakdown (top 20 by views, all-time — LIMIT keeps query cheap).
	$rows = $wpdb->get_results(
		"SELECT post_id,
			COUNT(DISTINCT CASE WHEN event_type='page_view' THEN anon_id END) AS uniq_views,
			SUM(CASE WHEN event_type='cta_click' THEN 1 ELSE 0 END) AS cta_clicks,
			SUM(CASE WHEN event_type='form_submit' THEN 1 ELSE 0 END) AS form_submits,
			MAX(CASE WHEN event_type='scroll_depth' THEN CAST(REPLACE(event_detail,'%','') AS UNSIGNED) END) AS max_scroll
		FROM $table
		GROUP BY post_id
		ORDER BY uniq_views DESC
		LIMIT 20"
	);

	$out = array( 'totals' => $totals, 'rows' => $rows );
	set_transient( $cache_key, $out, 15 * MINUTE_IN_SECONDS );
	return $out;
}

/**
 * Thẻ tóm tắt hiển thị trên trang Tổng quan (ttseo_render_dashboard()).
 * Gọi ngay sau khối KPI tổng hợp Google/Bing/PSI.
 */
function ttseo_render_engagement_card() {
	global $wpdb;
	$table = ttseo_eng_table();
	// Bảng có thể chưa tồn tại nếu activation hook chưa chạy trên site cũ.
	if ( $wpdb->get_var( "SHOW TABLES LIKE '$table'" ) !== $table ) {
		return;
	}
	$data   = ttseo_eng_summary();
	$totals = $data['totals'];
	$rows   = $data['rows'];

	echo '<h2 class="ttseo-sec" style="--b:#1a7f5a;">📈 ' . esc_html( ttseo_t( 'Tương tác nội dung (Engagement)', 'Content Engagement' ) ) . ' <span class="ttseo-src src-b">' . esc_html( ttseo_t( 'Beacon nội bộ', 'Internal beacon' ) ) . '</span></h2>';
	echo '<p class="ttseo-subtle">' . esc_html( ttseo_t( 'Đo trực tiếp trên site (scroll depth, hoàn thành đọc, click CTA, submit form) — không thu thập thông tin cá nhân, chỉ id ngẫu nhiên theo trình duyệt.', 'Measured directly on the site (scroll depth, read completion, CTA clicks, form submits) — no personal data collected, only a random per-browser id.' ) ) . ' ' . esc_html( ttseo_t( 'Tháng', 'Month' ) ) . ' ' . esc_html( gmdate( 'm/Y' ) ) . '.</p>';
	echo '<div class="ttseo-strip">';
	ttseo_kpi( ttseo_t( 'Lượt xem (unique) tháng này', 'Unique views this month' ), ttseo_num( $totals['views_month'] ), ttseo_t( 'bài viết đơn', 'single post views' ), '#1a7f5a' );
	ttseo_kpi( ttseo_t( 'Click CTA', 'CTA clicks' ), ttseo_num( $totals['cta_clicks'] ), ttseo_t( 'tháng này', 'this month' ), '#e8821e' );
	ttseo_kpi( ttseo_t( 'Submit form', 'Form submits' ), ttseo_num( $totals['form_submits'] ), ttseo_t( 'tháng này', 'this month' ), '#1f5c93' );
	ttseo_kpi( ttseo_t( 'Hoàn thành đọc', 'Read completions' ), ttseo_num( $totals['read_complete'] ), ttseo_t( '≥80% cuộn + ở lại >30s', '≥80% scroll + >30s on page' ), '#6b3fb5' );
	echo '</div>';

	if ( empty( $rows ) ) {
		echo '<p class="ttseo-subtle">' . esc_html( ttseo_t( 'Chưa có dữ liệu tương tác — sẽ xuất hiện khi có người đọc bài viết trên site.', 'No engagement data yet — it will appear once people read posts on the site.' ) ) . '</p>';
		return;
	}
	echo '<div class="ttseo-table"><table><thead><tr><th>' . esc_html( ttseo_t( 'Bài viết', 'Post' ) ) . '</th><th>' . esc_html( ttseo_t( 'Lượt xem (unique)', 'Unique views' ) ) . '</th><th>' . esc_html( ttseo_t( 'Scroll sâu nhất TB', 'Avg. deepest scroll' ) ) . '</th><th>' . esc_html( ttseo_t( 'Click CTA', 'CTA clicks' ) ) . '</th><th>' . esc_html( ttseo_t( 'Submit form', 'Form submits' ) ) . '</th></tr></thead><tbody>';
	foreach ( $rows as $r ) {
		$title = get_the_title( $r->post_id );
		$link  = get_edit_post_link( $r->post_id );
		echo '<tr><td>' . ( $link ? '<a href="' . esc_url( $link ) . '">' . esc_html( $title ? $title : '#' . $r->post_id ) . '</a>' : esc_html( $title ) ) . '</td>';
		echo '<td>' . ttseo_num( $r->uniq_views ) . '</td>';
		echo '<td>' . ( null !== $r->max_scroll ? (int) $r->max_scroll . '%' : '—' ) . '</td>';
		echo '<td>' . ttseo_num( $r->cta_clicks ) . '</td>';
		echo '<td>' . ttseo_num( $r->form_submits ) . '</td></tr>';
	}
	echo '</tbody></table></div>';
}
