<?php
/**
 * #1 Keyword Strategy — Keyword Mapping (gán từ khóa ↔ URL) + Topic Cluster.
 * Đầu ra Phụ lục 01 theo plan Sun Reaches. Require từ seo-console.php.
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

define( 'TTSEO_KW_DBVER', '1' );

function ttseo_kw_table() {
	global $wpdb;
	return $wpdb->prefix . 'ttseo_keywords';
}
function ttseo_kw_install() {
	if ( get_option( 'ttseo_kw_dbver' ) === TTSEO_KW_DBVER ) {
		return;
	}
	global $wpdb;
	$table   = ttseo_kw_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,
		keyword VARCHAR(190) NOT NULL DEFAULT '',
		target_url VARCHAR(255) NOT NULL DEFAULT '',
		cluster VARCHAR(120) NOT NULL DEFAULT '',
		kw_type VARCHAR(20) NOT NULL DEFAULT 'kpi',
		intent VARCHAR(30) NOT NULL DEFAULT '',
		priority TINYINT NOT NULL DEFAULT 2,
		notes TEXT NULL,
		created_at DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00',
		updated_at DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00',
		PRIMARY KEY (id),
		KEY cluster (cluster)
	) $charset;" );
	update_option( 'ttseo_kw_dbver', TTSEO_KW_DBVER );
	ttseo_kw_seed();
}
add_action( 'admin_init', 'ttseo_kw_install' );

/**
 * Bảng gán mặc định — dữ liệu MẪU đơn giản để người dùng mới hiểu ngay cách
 * dùng Keyword Mapping (không phải dữ liệu thật của site nào). Có thể sửa/xoá
 * từng dòng ngay trong trang Keyword Mapping, hoặc tự thêm bộ từ khóa thật của
 * mình — bảng này chỉ tự chèn MỘT LẦN lúc cài đặt (bảng đang rỗng).
 */
function ttseo_kw_seed_map() {
	$h = home_url();
	return array(
		// cluster => [ [keyword, url, intent, priority], ... ]
		ttseo_t( 'Ví dụ: Trang chủ & Giới thiệu', 'Example: Homepage & About' ) => array(
			array( ttseo_t( 'tên thương hiệu của bạn', 'your brand name' ), $h . '/', 'navigational', 1 ),
			array( ttseo_t( 'giới thiệu công ty', 'company overview' ), $h . '/about/', 'informational', 3 ),
		),
		ttseo_t( 'Ví dụ: Sản phẩm / Dịch vụ', 'Example: Products / Services' ) => array(
			array( ttseo_t( 'tên sản phẩm hoặc dịch vụ chính', 'your main product or service' ), $h . '/product-example/', 'commercial', 1 ),
			array( ttseo_t( 'giá [sản phẩm/dịch vụ]', '[product/service] price' ), $h . '/pricing-example/', 'transactional', 2 ),
			array( ttseo_t( 'đánh giá [sản phẩm/dịch vụ]', '[product/service] reviews' ), $h . '/product-example/', 'commercial', 2 ),
		),
		ttseo_t( 'Ví dụ: Nội dung / Blog', 'Example: Content / Blog' ) => array(
			array( ttseo_t( 'cách chọn [sản phẩm/dịch vụ] phù hợp', 'how to choose the right [product/service]' ), $h . '/blog/example-post/', 'informational', 2 ),
			array( ttseo_t( 'so sánh [A] và [B]', '[A] vs [B] comparison' ), $h . '/blog/example-post/', 'informational', 3 ),
		),
	);
}
function ttseo_kw_seed() {
	global $wpdb;
	$table = ttseo_kw_table();
	if ( (int) $wpdb->get_var( "SELECT COUNT(*) FROM $table" ) > 0 ) {
		return;
	}
	$now = current_time( 'mysql' );
	foreach ( ttseo_kw_seed_map() as $cluster => $rows ) {
		foreach ( $rows as $r ) {
			$wpdb->insert( $table, array(
				'keyword' => $r[0], 'target_url' => $r[1], 'cluster' => $cluster,
				'kw_type' => 'kpi', 'intent' => $r[2], 'priority' => $r[3],
				'created_at' => $now, 'updated_at' => $now,
			) );
		}
	}
}

function ttseo_kw_intents() {
	return array(
		'commercial'    => ttseo_t( 'Thương mại', 'Commercial' ),
		'informational' => ttseo_t( 'Thông tin', 'Informational' ),
		'transactional' => ttseo_t( 'Giao dịch', 'Transactional' ),
		'navigational'  => ttseo_t( 'Điều hướng', 'Navigational' ),
	);
}
function ttseo_kw_prios() {
	return array( 1 => ttseo_t( 'Cao', 'High' ), 2 => ttseo_t( 'Trung bình', 'Medium' ), 3 => ttseo_t( 'Thấp', 'Low' ) );
}

/* =========================================================================
 * MENU + CRUD
 * Keyword Mapping đã GỘP thành 1 tab trong trang "Chiến lược từ khóa"
 * (?page=ttseo-keywords&tab=mapping, xem content-keywords.php) — không còn
 * trang riêng. Giữ redirect cho bookmark/link cũ trỏ tới ?page=ttseo-mapping.
 * ========================================================================= */
add_action( 'admin_init', function () {
	if ( isset( $_GET['page'] ) && 'ttseo-mapping' === $_GET['page'] && ttseo_access() ) {
		$args = $_GET;
		unset( $args['page'] );
		$args['page'] = 'ttseo-keywords';
		$args['tab']  = 'mapping';
		wp_safe_redirect( admin_url( 'admin.php?' . http_build_query( $args ) ) );
		exit;
	}
} );

add_action( 'admin_init', function () {
	if ( ! ttseo_access() || ! function_exists( 'ttseo_is_unlocked' ) || ! ttseo_is_unlocked() ) {
		return;
	}
	global $wpdb;
	$t = ttseo_kw_table();

	if ( isset( $_POST['ttseo_kw_add'] ) ) {
		check_admin_referer( 'ttseo_kw_add' );
		$kw = sanitize_text_field( wp_unslash( $_POST['keyword'] ?? '' ) );
		if ( '' !== trim( $kw ) ) {
			$now = current_time( 'mysql' );
			$wpdb->insert( $t, array(
				'keyword'    => $kw,
				'target_url' => esc_url_raw( wp_unslash( $_POST['target_url'] ?? '' ) ),
				'cluster'    => sanitize_text_field( wp_unslash( $_POST['cluster'] ?? '' ) ),
				'kw_type'    => sanitize_key( $_POST['kw_type'] ?? 'support' ),
				'intent'     => sanitize_key( $_POST['intent'] ?? '' ),
				'priority'   => max( 1, min( 3, (int) ( $_POST['priority'] ?? 2 ) ) ),
				'created_at' => $now, 'updated_at' => $now,
			) );
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-keywords&tab=mapping&saved=1' ) );
		exit;
	}
	if ( isset( $_GET['ttseo_kw_del'], $_GET['id'] ) ) {
		check_admin_referer( 'ttseo_kw_del' );
		$wpdb->delete( $t, array( 'id' => (int) $_GET['id'] ) );
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-keywords&tab=mapping' ) );
		exit;
	}
	if ( isset( $_POST['ttseo_kw_upd'], $_POST['id'] ) ) {
		check_admin_referer( 'ttseo_kw_upd' );
		$wpdb->update( $t, array(
			'target_url' => esc_url_raw( wp_unslash( $_POST['target_url'] ?? '' ) ),
			'cluster'    => sanitize_text_field( wp_unslash( $_POST['cluster'] ?? '' ) ),
			'updated_at' => current_time( 'mysql' ),
		), array( 'id' => (int) $_POST['id'] ) );
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-keywords&tab=mapping' ) );
		exit;
	}
	// Xuất CSV (Phụ lục 01)
	if ( isset( $_GET['ttseo_kw_csv'] ) ) {
		check_admin_referer( 'ttseo_kw_csv' );
		$rows = $wpdb->get_results( "SELECT keyword,cluster,kw_type,intent,priority,target_url FROM $t ORDER BY cluster, priority", ARRAY_A );
		header( 'Content-Type: text/csv; charset=utf-8' );
		header( 'Content-Disposition: attachment; filename=keyword-mapping-' . gmdate( 'Y-m-d' ) . '.csv' );
		$out = fopen( 'php://output', 'w' );
		fwrite( $out, "\xEF\xBB\xBF" );
		fputcsv( $out, array( ttseo_t( 'Từ khóa', 'Keyword' ), ttseo_t( 'Nhóm chủ đề', 'Topic cluster' ), ttseo_t( 'Loại', 'Type' ), 'Search Intent', ttseo_t( 'Ưu tiên', 'Priority' ), ttseo_t( 'URL đích', 'Target URL' ) ) );
		foreach ( $rows as $r ) { fputcsv( $out, $r ); }
		fclose( $out );
		exit;
	}
} );

/* =========================================================================
 * TAB "KEYWORD MAPPING" trong trang gộp "Chiến lược từ khóa"
 * (?page=ttseo-keywords&tab=mapping — gọi từ ttseo_render_keywords() ở
 * content-keywords.php). Không tự vẽ wrap/brand header/footer/styles.
 * ========================================================================= */
function ttseo_keyword_mapping_ui() {
	global $wpdb;
	$rows = $wpdb->get_results( 'SELECT * FROM ' . ttseo_kw_table() . ' ORDER BY cluster, priority, keyword' );

	// Dữ liệu GSC: từ khóa → URL Google thực sự xếp hạng
	$actual = array();
	if ( function_exists( 'ttseo_gsc_query' ) ) {
		$qp = ttseo_gsc_query( array( 'query', 'page' ), 1000 );
		if ( ! is_wp_error( $qp ) ) {
			foreach ( (array) $qp as $r ) {
				$k = strtolower( trim( $r['keys'][0] ?? '' ) );
				// giữ URL có vị trí tốt nhất cho mỗi từ khóa
				if ( ! isset( $actual[ $k ] ) || $r['position'] < $actual[ $k ]['position'] ) {
					$actual[ $k ] = array( 'page' => $r['keys'][1] ?? '', 'position' => (float) $r['position'], 'imp' => (int) $r['impressions'] );
				}
			}
		}
	}

	echo '<p><a href="' . esc_url( wp_nonce_url( admin_url( 'admin.php?page=ttseo-keywords&tab=mapping&ttseo_kw_csv=1' ), 'ttseo_kw_csv' ) ) . '" class="button">⬇ ' . esc_html( ttseo_t( 'Xuất CSV', 'Export CSV' ) ) . '</a></p>';
	echo '<p class="ttseo-subtle" style="margin-left:0;">' . esc_html( ttseo_t(
		'Bảng gán từ khóa ↔ đường dẫn website, nhóm theo chủ đề. Cột "Google đang xếp hạng" đối chiếu URL thực tế — phát hiện gán sai trang / trùng lặp nội dung.',
		'Keyword ↔ URL mapping table, grouped by topic. The "Google currently ranks" column cross-checks the real ranking URL — catches mis-mapped pages / duplicate content.'
	) ) . '</p>';
	if ( isset( $_GET['saved'] ) ) { echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( ttseo_t( 'Đã lưu.', 'Saved.' ) ) . '</p></div>'; }

	// Thống kê
	$clusters = array(); $mapped = 0; $ranked = 0; $mismatch = 0;
	foreach ( $rows as $r ) {
		$clusters[ $r->cluster ][] = $r;
		if ( $r->target_url ) { $mapped++; }
		$a = $actual[ strtolower( $r->keyword ) ] ?? null;
		if ( $a ) {
			$ranked++;
			if ( $r->target_url && untrailingslashit( $a['page'] ) !== untrailingslashit( $r->target_url ) ) { $mismatch++; }
		}
	}
	echo '<div class="ttseo-strip">';
	ttseo_kpi( ttseo_t( 'Từ khóa đã gán', 'Mapped keywords' ), ttseo_num( $mapped ) . '/' . count( $rows ), ttseo_t( 'có URL đích', 'have a target URL' ), '#1f5c93' );
	ttseo_kpi( ttseo_t( 'Nhóm chủ đề', 'Topic clusters' ), (string) count( $clusters ), 'topic cluster', '#6b3fb5' );
	ttseo_kpi( ttseo_t( 'Đã có thứ hạng', 'Currently ranking' ), ttseo_num( $ranked ), ttseo_t( 'Google ghi nhận', 'per Google' ), '#1a7f5a' );
	ttseo_kpi( ttseo_t( 'Lệch trang đích', 'Target mismatches' ), ttseo_num( $mismatch ), ttseo_t( 'cần xem lại', 'needs review' ), $mismatch ? '#c0392b' : '#1a7f5a' );
	echo '</div>';

	if ( $mismatch ) {
		echo '<div class="ttseo-ins warn" style="margin:14px 0;"><div class="ic">⚠️</div><div><div class="t">' . (int) $mismatch . ' ' . esc_html( ttseo_t( 'từ khóa đang xếp hạng bằng TRANG KHÁC với trang đã gán', 'keyword(s) are ranking on a DIFFERENT page than the one mapped' ) ) . '</div><div class="d">' . esc_html( ttseo_t(
			'Google chọn trang khác trang bạn nhắm tới — dấu hiệu nội dung trùng ý (cannibalization) hoặc trang đích chưa đủ mạnh. Xem cột "Google đang xếp hạng" bên dưới để điều chỉnh liên kết nội bộ / nội dung.',
			'Google is choosing a different page than the one you targeted — a sign of keyword cannibalization or a weak target page. See the "Google currently ranks" column below to adjust internal links / content.'
		) ) . '</div></div></div>';
	}

	// Bảng theo cluster
	foreach ( $clusters as $cname => $items ) {
		echo '<h2 class="ttseo-sec" style="--b:#1f5c93;">📁 ' . esc_html( $cname ) . ' <span style="font-size:12px;color:#8a8f94;font-weight:400;">(' . count( $items ) . ' ' . esc_html( ttseo_t( 'từ khóa', 'keyword(s)' ) ) . ')</span></h2>';
		echo '<div class="ttseo-table"><table><thead><tr><th>' . esc_html( ttseo_t( 'Từ khóa', 'Keyword' ) ) . '</th><th>Intent</th><th>' . esc_html( ttseo_t( 'Ưu tiên', 'Priority' ) ) . '</th><th>' . esc_html( ttseo_t( 'URL đích (đã gán)', 'Target URL (mapped)' ) ) . '</th><th>' . esc_html( ttseo_t( 'Google đang xếp hạng', 'Google currently ranks' ) ) . '</th><th>' . esc_html( ttseo_t( 'V.trí', 'Pos.' ) ) . '</th><th></th></tr></thead><tbody>';
		foreach ( $items as $r ) {
			$a   = $actual[ strtolower( $r->keyword ) ] ?? null;
			$del = wp_nonce_url( admin_url( 'admin.php?page=ttseo-keywords&tab=mapping&ttseo_kw_del=1&id=' . $r->id ), 'ttseo_kw_del' );
			echo '<tr><td><b>' . esc_html( $r->keyword ) . '</b>' . ( 'kpi' === $r->kw_type ? ' <span class="ttseo-src src-g">KPI</span>' : '' ) . '</td>';
			echo '<td style="font-size:12px;">' . esc_html( ttseo_kw_intents()[ $r->intent ] ?? '—' ) . '</td>';
			$pc = array( 1 => '#c0392b', 2 => '#c77d16', 3 => '#8a8f94' );
			echo '<td><span style="font-size:11px;font-weight:700;color:' . $pc[ $r->priority ] . ';">' . esc_html( ttseo_kw_prios()[ $r->priority ] ?? '' ) . '</span></td>';
			echo '<td style="font-size:11.5px;"><a href="' . esc_url( $r->target_url ) . '" target="_blank">' . esc_html( str_replace( home_url(), '', $r->target_url ) ?: '/' ) . '</a></td>';
			if ( $a ) {
				$apath = str_replace( home_url(), '', $a['page'] ) ?: '/';
				$ok    = untrailingslashit( $a['page'] ) === untrailingslashit( $r->target_url );
				$col   = $ok ? '#1a7f5a' : '#c0392b';
				echo '<td style="font-size:11.5px;color:' . $col . ';">' . ( $ok ? '✓ ' . esc_html( ttseo_t( 'khớp', 'match' ) ) : '⚠ ' . esc_html( $apath ) ) . '</td>';
				echo '<td>' . number_format_i18n( $a['position'], 1 ) . '</td>';
			} else {
				echo '<td style="font-size:11.5px;color:#8a8f94;">' . esc_html( ttseo_t( 'chưa xếp hạng', 'not ranked' ) ) . '</td><td>—</td>';
			}
			echo '<td><a href="' . esc_url( $del ) . '" onclick="return confirm(\'' . esc_js( ttseo_t( 'Xóa?', 'Delete?' ) ) . '\')" style="color:#c0392b;font-size:11px;">' . esc_html( ttseo_t( 'Xóa', 'Delete' ) ) . '</a></td></tr>';
		}
		echo '</tbody></table></div>';
	}

	// Form thêm
	echo '<h2 class="ttseo-sec" style="--b:#c77d16;">' . esc_html( ttseo_t( 'Thêm từ khóa hỗ trợ', 'Add a supporting keyword' ) ) . '</h2>';
	echo '<form method="post" style="background:#fff;border:1px solid #dcdfe3;border-radius:8px;padding:14px 16px;display:grid;grid-template-columns:repeat(3,1fr);gap:12px;max-width:900px;">';
	wp_nonce_field( 'ttseo_kw_add' );
	echo '<label style="grid-column:1/3;">' . esc_html( ttseo_t( 'Từ khóa', 'Keyword' ) ) . '<br><input type="text" name="keyword" class="large-text" required></label>';
	echo '<label>' . esc_html( ttseo_t( 'Nhóm chủ đề', 'Topic cluster' ) ) . '<br><input type="text" name="cluster" class="large-text" list="ttseo-clusters" placeholder="' . esc_attr( ttseo_t( 'VD: Sản phẩm / Dịch vụ', 'e.g. Products / Services' ) ) . '"></label>';
	echo '<datalist id="ttseo-clusters">';
	foreach ( array_keys( $clusters ) as $c ) { echo '<option value="' . esc_attr( $c ) . '">'; }
	echo '</datalist>';
	echo '<label style="grid-column:1/3;">' . esc_html( ttseo_t( 'URL đích', 'Target URL' ) ) . '<br><input type="url" name="target_url" class="large-text" placeholder="' . esc_attr( home_url( '/products/...' ) ) . '"></label>';
	echo '<label>' . esc_html( ttseo_t( 'Loại', 'Type' ) ) . '<br><select name="kw_type"><option value="support">' . esc_html( ttseo_t( 'Hỗ trợ', 'Supporting' ) ) . '</option><option value="kpi">KPI</option></select></label>';
	echo '<label>Search Intent<br><select name="intent">';
	foreach ( ttseo_kw_intents() as $k => $v ) { echo '<option value="' . esc_attr( $k ) . '">' . esc_html( $v ) . '</option>'; }
	echo '</select></label>';
	echo '<label>' . esc_html( ttseo_t( 'Ưu tiên', 'Priority' ) ) . '<br><select name="priority">';
	foreach ( ttseo_kw_prios() as $k => $v ) { echo '<option value="' . (int) $k . '"' . ( 2 === $k ? ' selected' : '' ) . '>' . esc_html( $v ) . '</option>'; }
	echo '</select></label>';
	echo '<p style="grid-column:1/4;margin:0;"><button class="button button-primary" name="ttseo_kw_add" value="1">＋ ' . esc_html( ttseo_t( 'Thêm vào bảng gán', 'Add to mapping table' ) ) . '</button></p>';
	echo '</form>';
}
