<?php
/**
 * Phân hệ: Base Giai đoạn 1 (điểm SEO nội dung) · Nghiên cứu từ khóa · Tự động index.
 * Require từ seo-console.php.
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/* =========================================================================
 * DỮ LIỆU MẪU — từ khóa mục tiêu & sản phẩm/dịch vụ ưu tiên. Đây CHỈ LÀ VÍ DỤ
 * để người dùng mới hiểu ngay cách các trang Nghiên cứu từ khóa / KPI hoạt
 * động — không phải khuyến nghị SEO thật. Sửa trực tiếp 3 hàm dưới đây (hoặc
 * nhập 20 từ khóa KPI thật của bạn ở trang KPI & Tiến độ) để thay bằng dữ
 * liệu của chính site bạn.
 * ========================================================================= */
function ttseo_desired_keywords() {
	return array(
		ttseo_t( 'tên thương hiệu của bạn', 'your brand name' ),
		ttseo_t( 'sản phẩm hoặc dịch vụ chính', 'your main product or service' ),
		ttseo_t( 'giá [sản phẩm/dịch vụ]', '[product/service] price' ),
		ttseo_t( 'đánh giá [sản phẩm/dịch vụ]', '[product/service] reviews' ),
		ttseo_t( 'mua [sản phẩm/dịch vụ] ở đâu', 'where to buy [product/service]' ),
		ttseo_t( 'cách chọn [sản phẩm/dịch vụ] phù hợp', 'how to choose the right [product/service]' ),
		ttseo_t( '[sản phẩm/dịch vụ] tốt nhất', 'best [product/service]' ),
		ttseo_t( 'so sánh [A] và [B]', '[A] vs [B] comparison' ),
	);
}
/**
 * Bộ từ khóa KPI MẪU — chỉ để minh hoạ cách trang "KPI & Tiến độ" và ma trận
 * từ khóa trong "Soạn & Duyệt bài SEO" hoạt động. Vào KPI & Tiến độ để xoá và
 * nhập bộ từ khóa KPI thật của bạn (dựa trên nghiên cứu từ khóa thực tế, ví
 * dụ từ Google Keyword Planner + số liệu Search Console của chính site bạn).
 * [kw, cluster, ưu tiên(1 rất cao/2 cao/3 trung bình), owner URL, ghi chú]
 */
function ttseo_recommended_keywords() {
	$note_home = ttseo_t( 'Ví dụ — gán cho trang chủ, thay bằng từ khóa thương hiệu/năng lực cốt lõi thật của bạn.', 'Sample entry — mapped to the homepage, replace with your real brand/core-capability keyword.' );
	$note_prod = ttseo_t( 'Ví dụ — gán cho trang sản phẩm/dịch vụ, thay bằng từ khóa có ý định mua thật của bạn.', 'Sample entry — mapped to a product/service page, replace with a real purchase-intent keyword.' );
	$note_blog = ttseo_t( 'Ví dụ — gán cho bài blog, thay bằng từ khóa nội dung thật của bạn.', 'Sample entry — mapped to a blog post, replace with a real content keyword.' );
	return array(
		// Nhóm A — Trang chủ / thương hiệu
		array( ttseo_t( 'tên thương hiệu của bạn', 'your brand name' ), ttseo_t( 'A. Trang chủ & thương hiệu', 'A. Homepage & brand' ), 1, ttseo_t( 'trang chủ', 'homepage' ), $note_home ),
		array( ttseo_t( 'sản phẩm/dịch vụ chính', 'your main product/service' ), ttseo_t( 'A. Trang chủ & thương hiệu', 'A. Homepage & brand' ), 1, ttseo_t( 'trang chủ', 'homepage' ), $note_home ),
		// Nhóm B — Sản phẩm / Dịch vụ
		array( ttseo_t( '[sản phẩm/dịch vụ] tốt nhất', 'best [product/service]' ), ttseo_t( 'B. Sản phẩm & Dịch vụ', 'B. Products & Services' ), 1, '/product-example/', $note_prod ),
		array( ttseo_t( 'giá [sản phẩm/dịch vụ]', '[product/service] price' ), ttseo_t( 'B. Sản phẩm & Dịch vụ', 'B. Products & Services' ), 2, '/pricing-example/', $note_prod ),
		array( ttseo_t( 'đánh giá [sản phẩm/dịch vụ]', '[product/service] reviews' ), ttseo_t( 'B. Sản phẩm & Dịch vụ', 'B. Products & Services' ), 2, '/product-example/', $note_prod ),
		// Nhóm C — Nội dung / Blog
		array( ttseo_t( 'cách chọn [sản phẩm/dịch vụ] phù hợp', 'how to choose the right [product/service]' ), ttseo_t( 'C. Nội dung & Blog', 'C. Content & Blog' ), 2, '/blog/example-post/', $note_blog ),
		array( ttseo_t( 'so sánh [A] và [B]', '[A] vs [B] comparison' ), ttseo_t( 'C. Nội dung & Blog', 'C. Content & Blog' ), 3, '/blog/example-post/', $note_blog ),
	);
}

function ttseo_priority_products() {
	return array(
		ttseo_t( '[Sản phẩm/Dịch vụ mẫu A]', '[Sample Product/Service A]' ),
		ttseo_t( '[Sản phẩm/Dịch vụ mẫu B]', '[Sample Product/Service B]' ),
		ttseo_t( '[Sản phẩm/Dịch vụ mẫu C]', '[Sample Product/Service C]' ),
	);
}

/* =========================================================================
 * MENU
 * ========================================================================= */
add_action( 'admin_menu', function () {
	if ( ttseo_module_on( 'content' ) ) {
		add_submenu_page( 'ttseo-dashboard', ttseo_t( 'Giai đoạn 1: Base & Nội dung', 'Phase 1: Baseline & Content' ), ttseo_t( 'GĐ1: Base & Nội dung', 'Phase 1: Baseline' ), 'ttseo_access', 'ttseo-content', 'ttseo_render_content' );
	}
	if ( ttseo_module_on( 'keywords' ) ) {
		add_submenu_page( 'ttseo-dashboard', ttseo_t( 'Chiến lược từ khóa', 'Keyword Strategy' ), ttseo_t( 'Chiến lược từ khóa', 'Keyword Strategy' ), 'ttseo_access', 'ttseo-keywords', 'ttseo_render_keywords' );
	}
}, 30 );

/* =========================================================================
 * BASE GIAI ĐOẠN 1 — điểm SEO Rank Math của toàn bộ nội dung
 * Công thức: Rank Math SEO Score 0–100 (checklist on-page: focus KW ở tiêu đề/
 * URL/đầu bài/nội dung, meta description, độ dài, liên kết, ảnh alt, readability).
 * Tốt ≥ 81 · Khá 51–80 · Yếu ≤ 50.
 * ========================================================================= */
function ttseo_content_rows() {
	global $wpdb;
	return $wpdb->get_results(
		"SELECT p.ID, p.post_title, p.post_type, p.post_date,
			CAST(sc.meta_value AS UNSIGNED) AS score,
			fk.meta_value AS focus_kw
		FROM {$wpdb->posts} p
		LEFT JOIN {$wpdb->postmeta} sc ON sc.post_id=p.ID AND sc.meta_key='rank_math_seo_score'
		LEFT JOIN {$wpdb->postmeta} fk ON fk.post_id=p.ID AND fk.meta_key='rank_math_focus_keyword'
		WHERE p.post_status='publish' AND p.post_type IN ('post','page','product','project')
		ORDER BY score ASC, p.post_date DESC"
	);
}
function ttseo_content_aggregate( $rows ) {
	$agg = array( 'total' => 0, 'sum' => 0, 'good' => 0, 'ok' => 0, 'poor' => 0, 'noscore' => 0, 'has_kw' => 0 );
	foreach ( $rows as $r ) {
		$agg['total']++;
		if ( null === $r->score ) { $agg['noscore']++; } else {
			$agg['sum'] += (int) $r->score;
			if ( $r->score >= 81 ) { $agg['good']++; }
			elseif ( $r->score >= 51 ) { $agg['ok']++; }
			else { $agg['poor']++; }
		}
		if ( ! empty( $r->focus_kw ) ) { $agg['has_kw']++; }
	}
	$scored = $agg['total'] - $agg['noscore'];
	$agg['avg'] = $scored ? round( $agg['sum'] / $scored, 1 ) : 0;
	return $agg;
}
function ttseo_score_col( $s ) {
	if ( null === $s ) { return '#8a8f94'; }
	if ( $s >= 81 ) { return '#1a7f5a'; }
	if ( $s >= 51 ) { return '#c77d16'; }
	return '#c0392b';
}

/**
 * Chấm điểm nội dung server-side (mô phỏng tiêu chí on-page Rank Math) — 0..100.
 * Không cần mở editor. Dùng để cập nhật rank_math_seo_score hàng loạt.
 */
function ttseo_content_score( $post_id ) {
	$post = get_post( $post_id );
	if ( ! $post ) { return 0; }
	$fk_raw = (string) get_post_meta( $post_id, 'rank_math_focus_keyword', true );
	$kw     = strtolower( trim( explode( ',', $fk_raw )[0] ) );
	$title  = (string) ( get_post_meta( $post_id, 'rank_math_title', true ) ?: $post->post_title );
	$desc   = (string) get_post_meta( $post_id, 'rank_math_description', true );
	$content = $post->post_content;
	$plain   = strtolower( wp_strip_all_tags( $content ) );
	$slug    = $post->post_name;
	$host    = wp_parse_url( home_url(), PHP_URL_HOST );

	$score = 0; $max = 0;
	$add = function ( $cond, $pts ) use ( &$score, &$max ) {
		$max += $pts;
		if ( $cond ) { $score += $pts; }
	};
	$words = max( 1, str_word_count( $plain ) );

	// Khớp "đủ từ" (chuẩn hóa gạch nối/số nhiều, bỏ stopword) — thực tế hơn khớp cụm chính xác
	$stop = array( 'in', 'the', 'and', 'for', 'of', 'a', 'to', 'per', 'on', 'with' );
	$norm = function ( $s ) {
		$s = strtolower( str_replace( array( '-', '/', '&' ), ' ', $s ) );
		$s = preg_replace( '/[^a-z0-9\s]/', ' ', $s );
		return array_filter( array_map( function ( $w ) { return rtrim( $w, 's' ); }, explode( ' ', $s ) ) );
	};
	$kw_words = $kw ? array_values( array_diff( $norm( $kw ), $stop ) ) : array();
	$kw_in    = function ( $text ) use ( $kw_words, $norm ) {
		if ( ! $kw_words ) { return false; }
		$hay = $norm( $text );
		return ! array_diff( $kw_words, $hay );
	};

	if ( $kw_words ) {
		$add( $kw_in( $title ), 12 );                                                    // KW trong tiêu đề
		$add( $desc && $kw_in( $desc ), 8 );                                             // KW trong meta desc
		$add( $kw_in( str_replace( '-', ' ', $slug ) ), 5 );                             // KW trong URL
		$first = substr( $plain, 0, (int) ( strlen( $plain ) * 0.15 ) );
		$add( $kw_in( $first ), 10 );                                                    // KW trong đầu bài
		$head = end( $kw_words );                                                        // danh từ chính
		$cnt  = substr_count( $plain, $head );
		$add( $cnt >= 1, 6 );                                                            // KW xuất hiện
		$add( $cnt >= 2 && $cnt <= 20, 6 );                                              // tần suất hợp lý
		$sub_ok = false;
		if ( preg_match_all( '/<h[2-4][^>]*>(.*?)<\/h[2-4]>/is', $content, $hm ) ) {
			foreach ( $hm[1] as $h ) { if ( $kw_in( wp_strip_all_tags( $h ) ) ) { $sub_ok = true; break; } }
		}
		$add( $sub_ok, 8 );                                                             // KW trong subheading
		$altok = false;
		if ( preg_match_all( '/<img[^>]*alt=["\']([^"\']*)["\']/i', $content, $m ) ) {
			foreach ( $m[1] as $a ) { if ( $kw_in( $a ) ) { $altok = true; break; } }
		}
		$add( $altok, 5 );                                                               // KW trong alt ảnh
	} else {
		$max += 60; // không có focus keyword
	}

	$add( $words >= 600, 10 );                                                           // độ dài tối thiểu
	$add( $words >= 1000, 4 );                                                           // độ dài tốt
	$internal = substr_count( $content, home_url() );
	$add( $internal >= 1, 6 );                                                           // có link nội bộ
	$add( $internal >= 3, 3 );                                                           // nhiều link nội bộ
	$add( (bool) preg_match( '#href=["\']https?://(?!' . preg_quote( $host, '#' ) . ')#i', $content ), 4 ); // link ngoài
	$add( substr_count( $content, '<img' ) >= 1, 5 );                                    // có hình ảnh
	$add( substr_count( $content, '</p>' ) >= 3, 4 );                                    // đoạn văn ngắn
	$add( mb_strlen( $title ) >= 15 && mb_strlen( $title ) <= 65, 4 );                   // độ dài title
	$add( $desc && mb_strlen( $desc ) >= 50 && mb_strlen( $desc ) <= 165, 6 );           // meta desc chuẩn

	return $max ? (int) round( $score / $max * 100 ) : 0;
}

// Handler: chấm lại điểm hàng loạt
add_action( 'admin_init', function () {
	if ( isset( $_GET['ttseo_rescore'] ) && ttseo_access() && ttseo_is_unlocked() && check_admin_referer( 'ttseo_rescore' ) ) {
		$ids = get_posts( array( 'post_type' => array( 'post', 'page', 'product', 'project' ), 'post_status' => 'publish', 'numberposts' => -1, 'fields' => 'ids' ) );
		$n = 0;
		foreach ( $ids as $id ) {
			update_post_meta( $id, 'rank_math_seo_score', ttseo_content_score( $id ) );
			$n++;
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-content&rescored=' . $n ) );
		exit;
	}
} );

// Lưu / cập nhật snapshot baseline GĐ1
add_action( 'admin_init', function () {
	if ( isset( $_POST['ttseo_snap_baseline'] ) && ttseo_access() && ttseo_is_unlocked() ) {
		check_admin_referer( 'ttseo_snap' );
		$agg = ttseo_content_aggregate( ttseo_content_rows() );
		$agg['captured_at'] = current_time( 'mysql' );
		update_option( 'ttseo_phase1_baseline', $agg );
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-content&snapped=1' ) );
		exit;
	}
} );

function ttseo_render_content() {
	if ( function_exists( 'ttseo_is_unlocked' ) && ! ttseo_is_unlocked() ) { ttseo_render_gate(); return; }
	ttseo_styles();
	if ( ! ttseo_is_pro() ) {
		echo '<div class="wrap ttseo-wrap">'; ttseo_brand_header();
		ttseo_render_upgrade_notice( ttseo_t( 'GĐ1: Base & Nội dung', 'Phase 1: Baseline & Content' ) );
		ttseo_brand_footer(); echo '</div>';
		return;
	}
	$rows = ttseo_content_rows();
	$live = ttseo_content_aggregate( $rows );
	$base = get_option( 'ttseo_phase1_baseline', array() );
	if ( empty( $base ) ) { // tự chụp lần đầu = base GĐ1
		$base = $live; $base['captured_at'] = current_time( 'mysql' );
		update_option( 'ttseo_phase1_baseline', $base );
	}
	$ctype = sanitize_key( $_GET['ctype'] ?? 'all' );

	echo '<div class="wrap ttseo-wrap">';
	ttseo_brand_header();
	echo '<h1>📚 ' . esc_html( ttseo_t( 'Giai đoạn 1 — Base & Nội dung', 'Phase 1 — Baseline & Content' ) ) . '</h1>';
	echo '<p class="ttseo-subtle" style="margin-left:0;">' . esc_html( ttseo_t( 'Điểm chuẩn (baseline) tính theo Rank Math SEO Score (0–100, checklist on-page). Tốt ≥81 · Khá 51–80 · Yếu ≤50.', 'Baseline scored with the Rank Math SEO Score (0–100, on-page checklist). Good ≥81 · Fair 51–80 · Weak ≤50.' ) ) . '</p>';
	if ( isset( $_GET['snapped'] ) ) { echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( ttseo_t( 'Đã cập nhật baseline.', 'Baseline updated.' ) ) . '</p></div>'; }
	if ( isset( $_GET['rescored'] ) ) { echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( ttseo_t( 'Đã chấm lại điểm nội dung cho', 'Re-scored content for' ) ) . ' ' . (int) $_GET['rescored'] . ' ' . esc_html( ttseo_t( 'bài — không cần mở từng bài trong editor.', 'post(s) — no need to open each one in the editor.' ) ) . '</p></div>'; }

	// Công cụ chấm lại điểm hàng loạt
	$rescore_url = wp_nonce_url( admin_url( 'admin.php?page=ttseo-content&ttseo_rescore=1' ), 'ttseo_rescore' );
	echo '<div style="background:#fff;border:1px solid #dcdfe3;border-left:4px solid #1a7f5a;border-radius:8px;padding:12px 16px;margin:12px 0;">';
	echo '<b>' . esc_html( ttseo_t( 'Chấm điểm nội dung hàng loạt', 'Bulk content scoring' ) ) . '</b> — ' . esc_html( ttseo_t( 'cập nhật điểm SEO cho toàn bộ bài viết ngay lập tức, không cần mở & Update từng bài trong trình soạn thảo.', 'update the SEO score for every post instantly, without opening & updating each one in the editor.' ) ) . '<br>';
	echo '<a href="' . esc_url( $rescore_url ) . '" class="button button-primary" style="margin-top:8px;" onclick="return confirm(\'' . esc_js( ttseo_t( 'Chấm lại điểm SEO nội dung cho toàn bộ bài viết/trang?', 'Re-score SEO content for all posts/pages?' ) ) . '\')">↻ ' . esc_html( ttseo_t( 'Chấm lại điểm toàn bộ', 'Re-score all' ) ) . '</a>';
	echo '<p class="ttseo-subtle" style="margin:8px 0 0 0;">' . esc_html( ttseo_t( 'Điểm dựa trên tiêu chí on-page (từ khóa ở tiêu đề/đầu bài/subheading, độ dài, liên kết, ảnh, meta…). Ghi thẳng vào cột điểm Rank Math.', 'Scored on on-page criteria (keyword in title/opening/subheading, length, links, images, meta…). Written directly into the Rank Math score field.' ) ) . '</p>';
	echo '</div>';

	// Baseline GĐ1 (đóng băng)
	echo '<h2 class="ttseo-sec" style="--b:#1f5c93;">' . esc_html( ttseo_t( 'Base Giai đoạn 1', 'Phase 1 baseline' ) ) . ' <span style="font-size:12px;color:#8a8f94;font-weight:400;">' . esc_html( ttseo_t( 'chốt', 'captured' ) ) . ' ' . esc_html( mysql2date( 'd/m/Y', $base['captured_at'] ?? current_time( 'mysql' ) ) ) . '</span></h2>';
	echo '<div class="ttseo-strip">';
	ttseo_kpi( ttseo_t( 'Tổng nội dung', 'Total content' ), ttseo_num( $base['total'] ?? 0 ), ttseo_t( 'bài/trang/SP/dự án', 'posts/pages/products/projects' ), '#1f5c93' );
	ttseo_kpi( ttseo_t( 'Điểm SEO TB', 'Avg. SEO score' ), ( $base['avg'] ?? 0 ) . '/100', ttseo_t( 'base GĐ1', 'Phase 1 baseline' ), ttseo_score_col( $base['avg'] ?? 0 ) );
	ttseo_kpi( ttseo_t( 'Tốt (≥81)', 'Good (≥81)' ), ttseo_num( $base['good'] ?? 0 ), '', '#1a7f5a' );
	ttseo_kpi( ttseo_t( 'Khá (51–80)', 'Fair (51–80)' ), ttseo_num( $base['ok'] ?? 0 ), '', '#c77d16' );
	ttseo_kpi( ttseo_t( 'Yếu (≤50)', 'Weak (≤50)' ), ttseo_num( $base['poor'] ?? 0 ), '', '#c0392b' );
	echo '</div>';

	// Tiến độ GĐ2 (live vs base)
	$d_avg  = round( ( $live['avg'] ?? 0 ) - ( $base['avg'] ?? 0 ), 1 );
	$d_good = ( $live['good'] ?? 0 ) - ( $base['good'] ?? 0 );
	echo '<h2 class="ttseo-sec" style="--b:#1a7f5a;">' . esc_html( ttseo_t( 'Tiến độ Giai đoạn 2', 'Phase 2 progress' ) ) . ' <span style="font-size:12px;color:#8a8f94;font-weight:400;">' . esc_html( ttseo_t( 'hiện tại', 'as of' ) ) . ' ' . esc_html( gmdate( 'd/m/Y' ) ) . '</span></h2>';
	echo '<div class="ttseo-strip">';
	ttseo_kpi( ttseo_t( 'Điểm SEO TB hiện tại', 'Current avg. SEO score' ), ( $live['avg'] ?? 0 ) . '/100', ( $d_avg >= 0 ? '▲ +' : '▼ ' ) . $d_avg . ' ' . esc_html( ttseo_t( 'so với base', 'vs. baseline' ) ), $d_avg >= 0 ? '#1a7f5a' : '#c0392b' );
	ttseo_kpi( ttseo_t( 'Bài Tốt hiện tại', 'Currently "Good" posts' ), ttseo_num( $live['good'] ?? 0 ), ( $d_good >= 0 ? '▲ +' : '▼ ' ) . $d_good, $d_good >= 0 ? '#1a7f5a' : '#c0392b' );
	ttseo_kpi( ttseo_t( 'Có focus keyword', 'Has focus keyword' ), ttseo_num( $live['has_kw'] ?? 0 ) . '/' . ttseo_num( $live['total'] ?? 0 ), ttseo_t( 'độ phủ', 'coverage' ), '#6b3fb5' );
	echo '</div>';

	// Bộ lọc loại
	$types = array( 'all' => ttseo_t( 'Tất cả', 'All' ), 'post' => ttseo_t( 'Bài viết', 'Posts' ), 'page' => ttseo_t( 'Trang', 'Pages' ), 'product' => ttseo_t( 'Sản phẩm', 'Products' ), 'project' => ttseo_t( 'Dự án', 'Projects' ) );
	echo '<h2 class="ttseo-sec" style="--b:#c77d16;">' . esc_html( ttseo_t( 'Điểm SEO từng nội dung', 'SEO score per item' ) ) . '</h2><p style="margin:0 0 10px 15px;">';
	foreach ( $types as $k => $lab ) {
		$cls = $k === $ctype ? 'button button-primary' : 'button';
		echo '<a class="' . $cls . '" style="margin-right:5px;" href="' . esc_url( admin_url( 'admin.php?page=ttseo-content&ctype=' . $k ) ) . '">' . esc_html( $lab ) . '</a>';
	}
	echo '</p>';

	echo '<div class="ttseo-table" style="max-height:560px;overflow:auto;"><table><thead><tr><th>' . esc_html( ttseo_t( 'Điểm', 'Score' ) ) . '</th><th>' . esc_html( ttseo_t( 'Tiêu đề', 'Title' ) ) . '</th><th>' . esc_html( ttseo_t( 'Loại', 'Type' ) ) . '</th><th>' . esc_html( ttseo_t( 'Ngày', 'Date' ) ) . '</th><th>Focus keyword</th></tr></thead><tbody>';
	foreach ( $rows as $r ) {
		if ( 'all' !== $ctype && $r->post_type !== $ctype ) { continue; }
		$col = ttseo_score_col( $r->score );
		echo '<tr><td><span style="display:inline-block;min-width:34px;text-align:center;font-weight:700;color:#fff;background:' . esc_attr( $col ) . ';border-radius:5px;padding:2px 0;">' . ( null === $r->score ? '—' : (int) $r->score ) . '</span></td>';
		echo '<td><a href="' . esc_url( get_edit_post_link( $r->ID ) ) . '" target="_blank">' . esc_html( $r->post_title ) . '</a></td>';
		echo '<td>' . esc_html( $types[ $r->post_type ] ?? $r->post_type ) . '</td>';
		echo '<td style="color:#8a8f94;font-size:12px;">' . esc_html( mysql2date( 'd/m/Y', $r->post_date ) ) . '</td>';
		echo '<td>' . esc_html( $r->focus_kw ?: '—' ) . '</td></tr>';
	}
	echo '</tbody></table></div>';

	echo '<form method="post" style="margin-top:12px;">';
	wp_nonce_field( 'ttseo_snap' );
	echo '<button class="button" name="ttseo_snap_baseline" value="1" onclick="return confirm(\'' . esc_js( ttseo_t( 'Cập nhật lại mốc baseline GĐ1 bằng số liệu hiện tại?', 'Reset the Phase 1 baseline using current numbers?' ) ) . '\')">↺ ' . esc_html( ttseo_t( 'Chốt lại baseline GĐ1', 'Reset Phase 1 baseline' ) ) . '</button>';
	echo ' <span class="ttseo-subtle" style="margin-left:8px;">(' . esc_html( ttseo_t( 'chỉ dùng khi muốn đặt lại mốc so sánh', 'only use this to reset the comparison point' ) ) . ')</span></form>';

	ttseo_brand_footer();
	echo '</div>';
}

/* =========================================================================
 * NGHIÊN CỨU TỪ KHÓA — bộ mong muốn + sản phẩm + dữ liệu GSC → xếp hạng cơ hội
 * ========================================================================= */
function ttseo_kw_opportunity( $impressions, $position ) {
	// Điểm cơ hội minh bạch = hiển thị × hệ số theo vị trí
	if ( null === $position ) { return 0; }
	$f = 0.3;
	if ( $position <= 3 ) { $f = 0.25; }        // đã top → duy trì
	elseif ( $position <= 10 ) { $f = 1.0; }    // nửa dưới trang 1 → đẩy
	elseif ( $position <= 20 ) { $f = 1.6; }    // trang 2 → cơ hội lớn nhất
	elseif ( $position <= 50 ) { $f = 0.7; }
	else { $f = 0.3; }
	return round( $impressions * $f );
}
function ttseo_kw_group( $position ) {
	if ( null === $position ) { return array( ttseo_t( 'Chưa xếp hạng', 'Not ranked' ), '#c0392b' ); }
	if ( $position <= 3 ) { return array( ttseo_t( 'TOP 3 — duy trì', 'TOP 3 — maintain' ), '#1a7f5a' ); }
	if ( $position <= 10 ) { return array( ttseo_t( 'TOP 4–10 — đẩy lên', 'TOP 4–10 — push up' ), '#2f8f4e' ); }
	if ( $position <= 20 ) { return array( ttseo_t( 'Trang 2 — cơ hội cao', 'Page 2 — high opportunity' ), '#c77d16' ); }
	if ( $position <= 50 ) { return array( ttseo_t( 'Vị trí 21–50', 'Position 21–50' ), '#b96712' ); }
	return array( ttseo_t( '>50 — cần nội dung', '>50 — needs content' ), '#c0392b' );
}

/**
 * Trang gộp "Chiến lược từ khóa" — 2 tab:
 *  - research (mặc định): Nghiên cứu & Phân tích (bộ KPI chính thức, đối chiếu GSC, cơ hội)
 *  - mapping: Keyword Mapping (gán từ khóa ↔ URL, phát hiện cannibalization) — thân bài ở strategy.php
 * Gộp lại vì cả hai đều xoay quanh cùng bộ từ khóa, một bên phân tích hiệu suất,
 * một bên gán chiến lược URL — tách trang riêng trước đây gây cảm giác trùng lặp.
 */
function ttseo_render_keywords() {
	if ( function_exists( 'ttseo_is_unlocked' ) && ! ttseo_is_unlocked() ) { ttseo_render_gate(); return; }
	ttseo_styles();
	$tab = 'mapping' === sanitize_key( $_GET['tab'] ?? '' ) ? 'mapping' : 'research';

	echo '<div class="wrap ttseo-wrap">';
	ttseo_brand_header();
	if ( ! ttseo_is_pro() ) {
		ttseo_render_upgrade_notice( ttseo_t( 'Chiến lược từ khóa', 'Keyword Strategy' ) );
		ttseo_brand_footer(); echo '</div>';
		return;
	}
	echo '<h1>🔑 ' . esc_html( ttseo_t( 'Chiến lược từ khóa', 'Keyword Strategy' ) ) . '</h1>';
	echo '<p class="ttseo-subtle" style="margin-left:0;">' . esc_html( ttseo_t( 'Bộ từ khóa mục tiêu (mẫu) đối chiếu dữ liệu thực Google Search Console (28 ngày). Điểm cơ hội = Hiển thị × hệ số vị trí (trang 2 ưu tiên cao nhất).', 'Sample target keyword set cross-checked against real Google Search Console data (28 days). Opportunity score = Impressions × position factor (page 2 gets the highest priority).' ) ) . '</p>';

	echo '<h2 class="nav-tab-wrapper" style="margin-top:6px;">';
	echo '<a class="nav-tab' . ( 'research' === $tab ? ' nav-tab-active' : '' ) . '" href="' . esc_url( admin_url( 'admin.php?page=ttseo-keywords&tab=research' ) ) . '">📊 ' . esc_html( ttseo_t( 'Nghiên cứu & Phân tích', 'Research & Analysis' ) ) . '</a>';
	echo '<a class="nav-tab' . ( 'mapping' === $tab ? ' nav-tab-active' : '' ) . '" href="' . esc_url( admin_url( 'admin.php?page=ttseo-keywords&tab=mapping' ) ) . '">🗺️ Keyword Mapping</a>';
	echo '</h2>';

	if ( 'mapping' === $tab ) {
		if ( function_exists( 'ttseo_keyword_mapping_ui' ) ) {
			ttseo_keyword_mapping_ui();
		}
		ttseo_brand_footer();
		echo '</div>';
		return;
	}

	ttseo_keyword_research_ui();
	ttseo_brand_footer();
	echo '</div>';
}

/** Tab "Nghiên cứu & Phân tích" — bộ KPI chính thức + đối chiếu bộ mong muốn với GSC. */
function ttseo_keyword_research_ui() {
	// ===== BỘ TỪ KHÓA KPI MẪU (ví dụ minh hoạ — hãy thay bằng bộ từ khóa thật của bạn) =====
	$rec = ttseo_recommended_keywords();
	echo '<h2 class="ttseo-sec" style="--b:#1a7f5a;">⭐ ' . esc_html( ttseo_t( 'Bộ từ khóa KPI (dữ liệu mẫu — hãy thay bằng từ khóa thật của bạn)', 'KPI keyword set (sample data — replace with your own keywords)' ) ) . '</h2>';
	echo '<p class="ttseo-subtle">' . esc_html( ttseo_t(
		'Đây là ví dụ minh hoạ cách bộ từ khóa KPI hoạt động — không phải khuyến nghị SEO thật. Vào KPI & Tiến độ để nhập tối đa 20 từ khóa KPI thật của bạn (dựa trên nghiên cứu từ khóa thực tế, ví dụ Google Keyword Planner + số liệu Search Console của chính site bạn). Bộ từ khóa này dùng để tính ma trận từ khóa trong Soạn & Duyệt bài SEO.',
		'This is a sample showing how the KPI keyword set works — not a real SEO recommendation. Go to KPI & Progress to enter up to 20 real KPI keywords (based on your own keyword research, e.g. Google Keyword Planner + your own Search Console data). This set is used to compute the keyword matrix in SEO Content & Approval.'
	) ) . '</p>';
	$fcol = array( 1 => array( ttseo_t( 'Rất cao', 'Very high' ), '#1a7f5a' ), 2 => array( ttseo_t( 'Cao', 'High' ), '#c77d16' ), 3 => array( ttseo_t( 'Trung bình', 'Medium' ), '#8a8f94' ) );
	$cur_cluster = '';
	echo '<div class="ttseo-table"><table><thead><tr><th>#</th><th>' . esc_html( ttseo_t( 'Từ khóa KPI', 'KPI keyword' ) ) . '</th><th>' . esc_html( ttseo_t( 'Ưu tiên', 'Priority' ) ) . '</th><th>Owner URL</th><th>' . esc_html( ttseo_t( 'Căn cứ (Search Volume / GSC)', 'Rationale (Search Volume / GSC)' ) ) . '</th></tr></thead><tbody>';
	$i = 1;
	foreach ( $rec as $r ) {
		if ( $r[1] !== $cur_cluster ) {
			$cur_cluster = $r[1];
			echo '<tr><td colspan="5" style="background:#f6f7f8;font-weight:700;font-size:12px;color:#5b6b7b;">' . esc_html( $cur_cluster ) . '</td></tr>';
		}
		$f = $fcol[ $r[2] ];
		echo '<tr><td>' . $i++ . '</td><td><b>' . esc_html( $r[0] ) . '</b></td>';
		echo '<td><span style="font-weight:700;font-size:11px;color:' . $f[1] . ';">' . $f[0] . '</span></td>';
		echo '<td style="font-size:11.5px;font-family:monospace;">' . esc_html( $r[3] ) . '</td>';
		echo '<td style="font-size:11.5px;color:#50575e;">' . esc_html( $r[4] ) . '</td></tr>';
	}
	echo '</tbody></table></div>';
	echo '<hr style="margin:26px 0;border:none;border-top:1px solid #e4e6e9;">';
	echo '<h2 class="ttseo-sec" style="--b:#1f5c93;">📋 ' . esc_html( ttseo_t( 'Đối chiếu bộ mong muốn (dữ liệu thực GSC)', 'Cross-check against the target set (real GSC data)' ) ) . '</h2>';

	// Lấy dữ liệu GSC
	$map = array();
	if ( function_exists( 'ttseo_gsc_query' ) ) {
		$q = ttseo_gsc_query( array( 'query' ), 1000 );
		if ( ! is_wp_error( $q ) ) {
			foreach ( (array) $q as $row ) {
				$map[ strtolower( trim( $row['keys'][0] ?? '' ) ) ] = $row;
			}
		} else {
			echo '<div class="notice notice-warning inline"><p>⚠️ ' . esc_html( ttseo_t( 'Chưa lấy được GSC:', 'Could not fetch GSC:' ) ) . ' ' . esc_html( $q->get_error_message() ) . '</p></div>';
		}
	}

	// Ghép bộ từ khóa mong muốn với dữ liệu
	$desired = ttseo_desired_keywords();
	$data    = array();
	$tracked = 0; $ranking = 0;
	foreach ( $desired as $kw ) {
		$row  = $map[ strtolower( $kw ) ] ?? null;
		$imp  = $row ? (int) $row['impressions'] : 0;
		$clk  = $row ? (int) $row['clicks'] : 0;
		$pos  = $row ? (float) $row['position'] : null;
		$ctr  = $row ? (float) $row['ctr'] : 0;
		if ( null !== $pos ) { $ranking++; }
		$tracked++;
		$data[] = array( 'kw' => $kw, 'imp' => $imp, 'clk' => $clk, 'pos' => $pos, 'ctr' => $ctr, 'opp' => ttseo_kw_opportunity( $imp, $pos ) );
	}
	// Sắp theo điểm cơ hội giảm dần, kw chưa rank xuống cuối
	usort( $data, function ( $a, $b ) {
		if ( ( null === $a['pos'] ) !== ( null === $b['pos'] ) ) { return null === $a['pos'] ? 1 : -1; }
		return $b['opp'] <=> $a['opp'];
	} );

	echo '<div class="ttseo-strip">';
	ttseo_kpi( ttseo_t( 'Từ khóa mục tiêu', 'Target keywords' ), (string) count( $desired ), ttseo_t( 'mẫu', 'sample' ), '#1f5c93' );
	ttseo_kpi( ttseo_t( 'Đã có thứ hạng', 'Currently ranking' ), $ranking . '/' . count( $desired ), ttseo_t( 'xuất hiện trên Google', 'appearing on Google' ), '#1a7f5a' );
	ttseo_kpi( ttseo_t( 'Chưa xếp hạng', 'Not ranked' ), ( count( $desired ) - $ranking ) . '/' . count( $desired ), ttseo_t( 'cần tạo/tối ưu nội dung', 'needs new/optimized content' ), '#c0392b' );
	echo '</div>';

	// Khuyến nghị
	$push = array(); $create = array();
	foreach ( $data as $d ) {
		if ( null !== $d['pos'] && $d['pos'] > 3 && $d['pos'] <= 20 && $d['imp'] > 0 ) { $push[] = $d['kw']; }
		if ( null === $d['pos'] || $d['pos'] > 50 ) { $create[] = $d['kw']; }
	}
	echo '<h2 class="ttseo-sec" style="--b:#c77d16;">💡 ' . esc_html( ttseo_t( 'Khuyến nghị ưu tiên', 'Priority recommendations' ) ) . '</h2><div class="ttseo-insights">';
	if ( $push ) {
		echo '<div class="ttseo-ins opp"><div class="ic">🚀</div><div><div class="t">' . count( $push ) . ' ' . esc_html( ttseo_t( 'từ khóa nên ĐẨY MẠNH (đang ở trang 1–2, chỉ cần tối ưu + backlink)', 'keyword(s) to PUSH HARDER (already on page 1–2, just need optimization + backlinks)' ) ) . '</div><div class="d">' . esc_html( implode( ' · ', array_slice( $push, 0, 12 ) ) ) . '</div></div></div>';
	}
	if ( $create ) {
		echo '<div class="ttseo-ins warn"><div class="ic">📝</div><div><div class="t">' . count( $create ) . ' ' . esc_html( ttseo_t( 'từ khóa cần TẠO/TỐI ƯU NỘI DUNG chuyên sâu (chưa xếp hạng)', 'keyword(s) need in-depth new/optimized CONTENT (not yet ranked)' ) ) . '</div><div class="d">' . esc_html( implode( ' · ', array_slice( $create, 0, 14 ) ) ) . '</div></div></div>';
	}
	echo '<div class="ttseo-ins good"><div class="ic">🎯</div><div><div class="t">' . esc_html( ttseo_t( 'Định hướng chung', 'General guidance' ) ) . '</div><div class="d">' . esc_html( ttseo_t(
		'Ưu tiên từ khóa dài + cụ thể (long-tail) cho ý định mua rõ ràng; từ khóa ngắn/chung chung thường cạnh tranh rất cao — gắn mỗi từ khóa với một trang sản phẩm/dịch vụ cụ thể thay vì luôn trỏ về trang chủ.',
		'Prioritize longer, specific (long-tail) keywords for clear purchase intent; short/generic keywords are usually far more competitive — map each keyword to a specific product/service page rather than always pointing to the homepage.'
	) ) . '</div></div>';
	echo '</div>';

	// Bảng chi tiết
	echo '<h2 class="ttseo-sec" style="--b:#1f5c93;">' . esc_html( ttseo_t( 'Bảng phân tích 20 từ khóa mục tiêu', 'Analysis table — 20 target keywords' ) ) . '</h2>';
	echo '<div class="ttseo-table"><table><thead><tr><th>#</th><th>' . esc_html( ttseo_t( 'Từ khóa', 'Keyword' ) ) . '</th><th>' . esc_html( ttseo_t( 'Nhóm', 'Group' ) ) . '</th><th>' . esc_html( ttseo_t( 'Vị trí', 'Position' ) ) . '</th><th>' . esc_html( ttseo_t( 'Hiển thị', 'Impressions' ) ) . '</th><th>Clicks</th><th>CTR</th><th>' . esc_html( ttseo_t( 'Điểm cơ hội', 'Opportunity score' ) ) . '</th></tr></thead><tbody>';
	$i = 1;
	foreach ( $data as $d ) {
		list( $grp, $col ) = ttseo_kw_group( $d['pos'] );
		echo '<tr><td>' . $i++ . '</td><td><b>' . esc_html( $d['kw'] ) . '</b></td>';
		echo '<td><span style="color:' . esc_attr( $col ) . ';font-weight:700;font-size:11px;">' . esc_html( $grp ) . '</span></td>';
		echo '<td>' . ( null === $d['pos'] ? '—' : number_format_i18n( $d['pos'], 1 ) ) . '</td>';
		echo '<td>' . ttseo_num( $d['imp'] ) . '</td><td>' . ttseo_num( $d['clk'] ) . '</td>';
		echo '<td>' . ( $d['imp'] ? ttseo_pct( $d['ctr'] ) : '—' ) . '</td>';
		echo '<td><b style="color:#1f5c93;">' . ttseo_num( $d['opp'] ) . '</b></td></tr>';
	}
	echo '</tbody></table></div>';

	// Cơ hội phát hiện thêm (từ GSC, ngoài bộ mong muốn)
	$extra = array();
	foreach ( $map as $k => $row ) {
		if ( in_array( $k, array_map( 'strtolower', $desired ), true ) ) { continue; }
		$pos = (float) $row['position'];
		if ( $pos > 3 && $pos <= 20 && (int) $row['impressions'] >= 20 ) {
			$extra[ $k ] = ttseo_kw_opportunity( (int) $row['impressions'], $pos );
		}
	}
	arsort( $extra );
	if ( $extra ) {
		echo '<h2 class="ttseo-sec" style="--b:#6b3fb5;">🔍 ' . esc_html( ttseo_t( 'Cơ hội phát hiện thêm (ngoài bộ mong muốn — từ dữ liệu thực)', 'Additional opportunities found (outside the target set — from real data)' ) ) . '</h2>';
		echo '<div class="ttseo-table"><table><thead><tr><th>' . esc_html( ttseo_t( 'Từ khóa (Google ghi nhận)', 'Keyword (per Google)' ) ) . '</th><th>' . esc_html( ttseo_t( 'Vị trí', 'Position' ) ) . '</th><th>' . esc_html( ttseo_t( 'Hiển thị', 'Impressions' ) ) . '</th><th>' . esc_html( ttseo_t( 'Điểm cơ hội', 'Opportunity score' ) ) . '</th></tr></thead><tbody>';
		$n = 0;
		foreach ( $extra as $k => $opp ) {
			if ( $n++ >= 20 ) { break; }
			$row = $map[ $k ];
			echo '<tr><td>' . esc_html( $k ) . '</td><td>' . number_format_i18n( (float) $row['position'], 1 ) . '</td><td>' . ttseo_num( $row['impressions'] ) . '</td><td><b style="color:#6b3fb5;">' . ttseo_num( $opp ) . '</b></td></tr>';
		}
		echo '</tbody></table></div>';
		echo '<p class="ttseo-subtle">' . esc_html( ttseo_t( 'Đây là từ khóa người dùng thực sự tìm và website đã xuất hiện — nên bổ sung vào chiến lược.', 'These are keywords people are actually searching and the site already appears for — worth adding to the strategy.' ) ) . '</p>';
	}

	// Sản phẩm ưu tiên
	echo '<h2 class="ttseo-sec" style="--b:#0f7a63;">' . esc_html( ttseo_t( 'Sản phẩm/Dịch vụ ưu tiên (mẫu)', 'Priority products/services (sample)' ) ) . '</h2><p style="margin:0 0 12px 15px;">';
	foreach ( ttseo_priority_products() as $p ) {
		echo '<span class="ttseo-src src-b" style="font-size:12px;margin:0 6px 6px 0;display:inline-block;padding:3px 10px;">' . esc_html( $p ) . '</span>';
	}
	echo '</p>';
}

/* =========================================================================
 * #3 XÁC MINH TRẠNG THÁI INDEX THẬT — Google URL Inspection API
 * ========================================================================= */
function ttseo_url_inspect( $url, $force = false ) {
	$property = ttseo_opt( 'gsc_property' );
	if ( ! $property ) {
		return new WP_Error( 'no_prop', ttseo_t( 'Chưa cấu hình GSC property.', 'GSC property not configured.' ) );
	}
	$cache_key = 'ttseo_insp_' . md5( $url );
	if ( ! $force ) {
		$cached = get_transient( $cache_key );
		if ( false !== $cached ) {
			return $cached;
		}
	}
	$token = ttseo_gsc_access_token();
	if ( is_wp_error( $token ) ) {
		return $token;
	}
	$resp = wp_remote_post( 'https://searchconsole.googleapis.com/v1/urlInspection/index:inspect', array(
		'timeout' => 25,
		'headers' => array( 'Authorization' => 'Bearer ' . $token, 'Content-Type' => 'application/json' ),
		'body'    => wp_json_encode( array(
			'inspectionUrl' => $url,
			'siteUrl'       => $property,
			'languageCode'  => ttseo_lang(),
		) ),
	) );
	if ( is_wp_error( $resp ) ) {
		return $resp;
	}
	$code = wp_remote_retrieve_response_code( $resp );
	$body = json_decode( wp_remote_retrieve_body( $resp ), true );
	if ( 200 !== $code ) {
		return new WP_Error( 'insp_http', ttseo_t( 'URL Inspection lỗi (', 'URL Inspection error (' ) . $code . '): ' . esc_html( $body['error']['message'] ?? '' ) );
	}
	$r   = $body['inspectionResult']['indexStatusResult'] ?? array();
	$out = array(
		'verdict'       => $r['verdict'] ?? 'VERDICT_UNSPECIFIED',
		'coverage'      => $r['coverageState'] ?? '',
		'robots'        => $r['robotsTxtState'] ?? '',
		'indexing'      => $r['indexingState'] ?? '',
		'lastCrawl'     => $r['lastCrawlTime'] ?? '',
		'googleCanon'   => $r['googleCanonical'] ?? '',
		'checked_at'    => current_time( 'mysql' ),
	);
	set_transient( $cache_key, $out, 12 * HOUR_IN_SECONDS );
	return $out;
}

/** Kiểm tra 1 item nhật ký index và cập nhật trạng thái */
function ttseo_inspect_item( $id ) {
	global $wpdb;
	$table = ttseo_wf_table();
	$item  = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table WHERE id=%d", $id ) );
	if ( ! $item || ! $item->url ) {
		return false;
	}
	$res = ttseo_url_inspect( $item->url, true );
	if ( is_wp_error( $res ) ) {
		$wpdb->update( $table, array( 'notes' => '❌ ' . $res->get_error_message(), 'updated_at' => current_time( 'mysql' ) ), array( 'id' => $id ) );
		return false;
	}
	$status = 'PASS' === $res['verdict'] ? 'indexed' : ( 'FAIL' === $res['verdict'] ? 'error' : 'submitted' );
	$crawl  = $res['lastCrawl'] ? mysql2date( 'd/m/Y', $res['lastCrawl'] ) : ttseo_t( 'chưa crawl', 'not crawled yet' );
	$note   = ( 'indexed' === $status ? '✅ ' : ( 'error' === $status ? '❌ ' : '⏳ ' ) ) . $res['coverage']
		. ' · ' . ttseo_t( 'Google crawl lần cuối:', 'Google last crawled:' ) . ' ' . $crawl
		. ' · ' . ttseo_t( 'Kiểm tra:', 'Checked:' ) . ' ' . mysql2date( 'd/m H:i', $res['checked_at'] );
	$wpdb->update( $table, array( 'status' => $status, 'notes' => $note, 'updated_at' => current_time( 'mysql' ) ), array( 'id' => $id ) );
	return true;
}

// Handlers: kiểm tra 1 URL / kiểm tra hàng loạt
add_action( 'admin_init', function () {
	if ( ! ttseo_access() || ! function_exists( 'ttseo_is_unlocked' ) || ! ttseo_is_unlocked() ) {
		return;
	}
	if ( isset( $_GET['ttseo_inspect'], $_GET['id'] ) ) {
		check_admin_referer( 'ttseo_inspect' );
		ttseo_inspect_item( (int) $_GET['id'] );
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-work&tab=index&inspected=1' ) );
		exit;
	}
	if ( isset( $_GET['ttseo_inspect_all'] ) ) {
		check_admin_referer( 'ttseo_inspect_all' );
		global $wpdb;
		$table = ttseo_wf_table();
		// giới hạn 20/lần để tránh timeout (quota GSC 2000/ngày)
		$ids = $wpdb->get_col( "SELECT id FROM $table WHERE type='index' AND url<>'' ORDER BY updated_at ASC LIMIT 20" );
		$n   = 0;
		foreach ( $ids as $id ) {
			if ( ttseo_inspect_item( (int) $id ) ) { $n++; }
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-work&tab=index&inspected=' . $n ) );
		exit;
	}
	// Nạp toàn bộ URL đang publish vào nhật ký index
	if ( isset( $_GET['ttseo_index_import'] ) ) {
		check_admin_referer( 'ttseo_index_import' );
		global $wpdb;
		$table = ttseo_wf_table();
		$posts = get_posts( array( 'post_type' => array( 'post', 'page', 'product', 'project' ), 'post_status' => 'publish', 'numberposts' => -1, 'fields' => 'ids' ) );
		$now   = current_time( 'mysql' );
		$added = 0;
		foreach ( $posts as $pid ) {
			$url = get_permalink( $pid );
			if ( ! $url || $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $table WHERE type='index' AND url=%s", $url ) ) ) {
				continue;
			}
			$wpdb->insert( $table, array(
				'type' => 'index', 'title' => get_the_title( $pid ), 'url' => $url,
				'status' => 'pending', 'period' => gmdate( 'Y-m' ), 'notes' => ttseo_t( 'Nạp từ nội dung hiện có', 'Imported from existing content' ),
				'created_at' => $now, 'updated_at' => $now,
			) );
			$added++;
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-work&tab=index&imported=' . $added ) );
		exit;
	}
} );

/* =========================================================================
 * TỰ ĐỘNG SUBMIT + NHẬT KÝ INDEX khi đăng/cập nhật bài
 * ========================================================================= */
function ttseo_autoindex_on_save( $post_id, $post = null ) {
	if ( wp_is_post_revision( $post_id ) || wp_is_post_autosave( $post_id ) ) { return; }
	$post = $post ? $post : get_post( $post_id );
	if ( ! $post || 'publish' !== $post->post_status ) { return; }
	if ( ! in_array( $post->post_type, array( 'post', 'page', 'product', 'project' ), true ) ) { return; }
	$robots = get_post_meta( $post_id, 'rank_math_robots', true );
	if ( is_array( $robots ) && in_array( 'noindex', $robots, true ) ) { return; }

	$url = get_permalink( $post_id );
	if ( ! $url ) { return; }

	// throttle 5 phút / URL
	$guard = 'ttseo_ai_' . md5( $url );
	if ( get_transient( $guard ) ) { return; }
	set_transient( $guard, 1, 5 * MINUTE_IN_SECONDS );

	// Ping IndexNow (non-blocking — không làm chậm thao tác đăng bài)
	if ( defined( 'NT_INDEXNOW_KEY' ) ) {
		$host = wp_parse_url( home_url(), PHP_URL_HOST );
		wp_remote_post( 'https://api.indexnow.org/indexnow', array(
			'timeout' => 8, 'blocking' => false,
			'headers' => array( 'Content-Type' => 'application/json; charset=utf-8' ),
			'body'    => wp_json_encode( array(
				'host'        => $host,
				'key'         => NT_INDEXNOW_KEY,
				'keyLocation' => home_url( '/' . NT_INDEXNOW_KEY . '.txt' ),
				'urlList'     => array( $url ),
			) ),
		) );
	}

	// Ghi/ cập nhật vào nhật ký Index (upsert theo URL)
	global $wpdb;
	$table = ttseo_wf_table();
	$now   = current_time( 'mysql' );
	$note  = ttseo_t( 'Tự động submit IndexNow (Bing/Yandex) ·', 'Auto-submitted via IndexNow (Bing/Yandex) ·' ) . ' ' . mysql2date( 'd/m/Y H:i', $now );
	$exist = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $table WHERE type='index' AND url=%s", $url ) );
	if ( $exist ) {
		$wpdb->update( $table, array( 'status' => 'submitted', 'notes' => $note, 'updated_at' => $now ), array( 'id' => $exist ) );
	} else {
		$wpdb->insert( $table, array(
			'type' => 'index', 'title' => get_the_title( $post_id ), 'url' => $url,
			'status' => 'submitted', 'period' => gmdate( 'Y-m' ), 'notes' => $note,
			'created_at' => $now, 'updated_at' => $now,
		) );
	}
}
add_action( 'save_post', 'ttseo_autoindex_on_save', 30, 2 );
