<?php
/**
 * Phân hệ Quản lý công việc SEO (KPI · Duyệt bài · Nhật ký) — Sun Reaches plan.
 * Được require từ seo-console.php.
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

define( 'TTSEO_WF_DBVER', '4' );

/* =========================================================================
 * BẢNG DỮ LIỆU
 * ========================================================================= */
function ttseo_wf_table() {
	global $wpdb;
	return $wpdb->prefix . 'ttseo_items';
}
function ttseo_wf_install() {
	if ( get_option( 'ttseo_wf_dbver' ) === TTSEO_WF_DBVER ) {
		return;
	}
	global $wpdb;
	$table   = ttseo_wf_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,
		type VARCHAR(20) NOT NULL DEFAULT '',
		title TEXT NOT NULL,
		url VARCHAR(255) NOT NULL DEFAULT '',
		status VARCHAR(30) NOT NULL DEFAULT '',
		period VARCHAR(7) NOT NULL DEFAULT '',
		notes TEXT NULL,
		intent VARCHAR(30) NOT NULL DEFAULT '',
		audience VARCHAR(150) NOT NULL DEFAULT '',
		brief TEXT NULL,
		source_type VARCHAR(40) NOT NULL DEFAULT '',
		post_id BIGINT UNSIGNED NULL DEFAULT NULL,
		feedback LONGTEXT NULL,
		submitted_at DATETIME NULL DEFAULT NULL,
		reviewed_at DATETIME NULL DEFAULT NULL,
		reviewed_by VARCHAR(150) NOT NULL DEFAULT '',
		kw_matched_count SMALLINT NOT NULL DEFAULT 0,
		kw_matched_json LONGTEXT 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 type_period (type, period),
		KEY post_id (post_id)
	) $charset;" );
	update_option( 'ttseo_wf_dbver', TTSEO_WF_DBVER );
}
add_action( 'admin_init', 'ttseo_wf_install' );

/* =========================================================================
 * ĐỊNH NGHĨA LOẠI CÔNG VIỆC (theo bảng nghiệm thu Sun Reaches)
 * Nhãn hiển thị (label/statuses) chỉ dùng để hiển thị — dữ liệu lưu DB dùng
 * KEY ổn định (vd 'approved', 'checking') không đổi theo ngôn ngữ, nên đổi
 * ngôn ngữ không ảnh hưởng dữ liệu đã lưu.
 * ========================================================================= */
/**
 * Loại 'content' (Duyệt bài & Nội dung) KHÔNG còn có tab CRUD riêng ở trang
 * Công việc SEO — toàn bộ soạn/duyệt/xuất bản bài đã gộp một nơi duy nhất tại
 * "Soạn & Duyệt bài SEO" ([articles.php]), thao tác trực tiếp trên post WordPress
 * thật (preview, auto-publish khi duyệt, đếm ngược hạn, ma trận từ khóa KPI).
 * Định nghĩa 'content' vẫn giữ lại ở đây (label/quota/done) chỉ để các trang khác
 * (report.php, kpi-report.php) đối chiếu số liệu nghiệm thu — không dùng để tạo
 * form thêm/sửa nữa, tránh ghi dữ liệu trùng/lệch với bảng mà articles.php quản lý.
 */
function ttseo_wf_types() {
	return array(
		'content'   => array(
			'label'   => ttseo_t( 'Duyệt bài & Nội dung', 'Content & Approval' ),
			'quota'   => 10,
			'unit'    => ttseo_t( 'bài/tháng', 'posts/month' ),
			'statuses'=> array( 'draft' => ttseo_t( 'Nháp', 'Draft' ), 'submitted' => ttseo_t( 'Chờ duyệt', 'Pending review' ), 'approved' => ttseo_t( 'Đã duyệt', 'Approved' ), 'published' => ttseo_t( 'Đã xuất bản', 'Published' ), 'rejected' => ttseo_t( 'Cần sửa', 'Needs changes' ) ),
			'done'    => array( 'approved', 'published' ),
			'managed_elsewhere' => 'ttseo-articles',
		),
		'onpage'    => array(
			'label'   => ttseo_t( 'On-page Checklist', 'On-page Checklist' ),
			'quota'   => 15,
			'unit'    => ttseo_t( 'URL/tháng', 'URLs/month' ),
			'statuses'=> array( 'todo' => ttseo_t( 'Cần làm', 'To do' ), 'checking' => ttseo_t( 'Đang tối ưu', 'Optimizing' ), 'done' => ttseo_t( 'Hoàn thành', 'Done' ) ),
			'done'    => array( 'done' ),
		),
		'index'     => array(
			'label'   => ttseo_t( 'Indexation', 'Indexation' ),
			'quota'   => 0,
			'unit'    => ttseo_t( 'URL', 'URLs' ),
			'statuses'=> array( 'pending' => ttseo_t( 'Chờ submit', 'Pending submit' ), 'submitted' => ttseo_t( 'Đã submit', 'Submitted' ), 'indexed' => ttseo_t( 'Đã index', 'Indexed' ), 'error' => ttseo_t( 'Lỗi', 'Error' ) ),
			'done'    => array( 'indexed' ),
		),
		'authority' => array(
			'label'   => ttseo_t( 'Authority Signals', 'Authority Signals' ),
			'quota'   => 3,
			'unit'    => ttseo_t( 'nguồn/tháng', 'sources/month' ),
			'statuses'=> array( 'reviewed' => ttseo_t( 'Đã rà soát', 'Reviewed' ), 'proposed' => ttseo_t( 'Đề xuất', 'Proposed' ), 'deployed' => ttseo_t( 'Đã triển khai', 'Deployed' ) ),
			'done'    => array( 'deployed' ),
		),
		'action'    => array(
			'label'   => ttseo_t( 'Action & Report Log', 'Action & Report Log' ),
			'quota'   => 0,
			'unit'    => ttseo_t( 'việc', 'task(s)' ),
			'statuses'=> array( 'open' => ttseo_t( 'Đang mở', 'Open' ), 'progress' => ttseo_t( 'Đang làm', 'In progress' ), 'done' => ttseo_t( 'Xong', 'Done' ) ),
			'done'    => array( 'done' ),
		),
	);
}

/** #4 Search Intent cho nội dung */
function ttseo_wf_intents() {
	return array(
		'informational' => ttseo_t( 'Thông tin (tìm hiểu)', 'Informational' ),
		'commercial'    => ttseo_t( 'Thương mại (so sánh, cân nhắc)', 'Commercial (comparison)' ),
		'transactional' => ttseo_t( 'Giao dịch (mua/báo giá)', 'Transactional (purchase/quote)' ),
		'navigational'  => ttseo_t( 'Điều hướng (tìm thương hiệu)', 'Navigational (brand search)' ),
	);
}
/** #5 Loại nguồn uy tín (Authority) */
function ttseo_wf_source_types() {
	return array(
		'citation'  => ttseo_t( 'Citation / Niêm giám', 'Citation / Directory listing' ),
		'social'    => ttseo_t( 'Social entity (hồ sơ MXH)', 'Social entity (social profile)' ),
		'pr'        => ttseo_t( 'Digital PR / Báo chí', 'Digital PR / Press' ),
		'partner'   => ttseo_t( 'Hồ sơ đối tác', 'Partner profile' ),
		'directory' => ttseo_t( 'Directory B2B', 'B2B directory' ),
		'profile'   => ttseo_t( 'Hồ sơ doanh nghiệp', 'Business profile' ),
		'project'   => ttseo_t( 'Nội dung dự án', 'Project content' ),
	);
}

/* =========================================================================
 * CRUD HANDLERS
 * ========================================================================= */
add_action( 'admin_init', function () {
	if ( ! ttseo_access() || ! function_exists( 'ttseo_is_unlocked' ) || ! ttseo_is_unlocked() ) {
		return;
	}
	global $wpdb;
	$table = ttseo_wf_table();

	// Thêm item — KHÔNG cho tạo type='content' ở đây, phải qua "Soạn & Duyệt bài SEO"
	// (nơi duy nhất tạo post WordPress thật + preview + duyệt/xuất bản đúng quy trình).
	if ( isset( $_POST['ttseo_item_add'] ) ) {
		check_admin_referer( 'ttseo_item_add' );
		$type = sanitize_key( $_POST['type'] ?? '' );
		if ( 'content' === $type ) {
			wp_safe_redirect( admin_url( 'admin.php?page=ttseo-articles&action=edit&item=0' ) );
			exit;
		}
		if ( 'onpage' === $type ) {
			// Trạng thái on-page chỉ được ghi từ kết quả audit thật (ttseo_onpage_checklist_ui()).
			wp_safe_redirect( admin_url( 'admin.php?page=ttseo-work&tab=onpage' ) );
			exit;
		}
		if ( array_key_exists( $type, ttseo_wf_types() ) && trim( (string) ( $_POST['title'] ?? '' ) ) !== '' ) {
			$now = current_time( 'mysql' );
			$wpdb->insert( $table, array(
				'type'        => $type,
				'title'       => sanitize_text_field( wp_unslash( $_POST['title'] ) ),
				'url'         => esc_url_raw( wp_unslash( $_POST['url'] ?? '' ) ),
				'status'      => sanitize_key( $_POST['status'] ?? '' ),
				'period'      => preg_replace( '/[^0-9\-]/', '', (string) ( $_POST['period'] ?? gmdate( 'Y-m' ) ) ),
				'notes'       => sanitize_textarea_field( wp_unslash( $_POST['notes'] ?? '' ) ),
				'intent'      => sanitize_key( $_POST['intent'] ?? '' ),
				'audience'    => sanitize_text_field( wp_unslash( $_POST['audience'] ?? '' ) ),
				'brief'       => sanitize_textarea_field( wp_unslash( $_POST['brief'] ?? '' ) ),
				'source_type' => sanitize_key( $_POST['source_type'] ?? '' ),
				'created_at'  => $now,
				'updated_at'  => $now,
			) );
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-work&tab=' . $type . '&saved=1' ) );
		exit;
	}

	// Đổi trạng thái — chặn type='content' (phải duyệt/từ chối/xuất bản qua articles.php
	// để đồng bộ đúng post WordPress, email thông báo, đếm hạn & ma trận từ khóa).
	if ( isset( $_GET['ttseo_item_status'], $_GET['id'], $_GET['to'] ) ) {
		check_admin_referer( 'ttseo_item_status' );
		$id   = (int) $_GET['id'];
		$item = $wpdb->get_row( $wpdb->prepare( "SELECT type FROM $table WHERE id=%d", $id ) );
		if ( $item && ! in_array( $item->type, array( 'content', 'onpage' ), true ) ) {
			$wpdb->update( $table, array( 'status' => sanitize_key( $_GET['to'] ), 'updated_at' => current_time( 'mysql' ) ), array( 'id' => $id ) );
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-work&tab=' . sanitize_key( $_GET['tab'] ?? 'onpage' ) ) );
		exit;
	}

	// Xóa — chặn type='content' (xóa qua articles.php để chuyển post WordPress liên kết vào thùng rác).
	if ( isset( $_GET['ttseo_item_delete'], $_GET['id'] ) ) {
		check_admin_referer( 'ttseo_item_delete' );
		$id   = (int) $_GET['id'];
		$item = $wpdb->get_row( $wpdb->prepare( "SELECT type FROM $table WHERE id=%d", $id ) );
		if ( $item && 'content' !== $item->type ) {
			$wpdb->delete( $table, array( 'id' => $id ) );
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-work&tab=' . sanitize_key( $_GET['tab'] ?? 'onpage' ) ) );
		exit;
	}

	// Lưu KPI
	if ( isset( $_POST['ttseo_kpi_save'] ) ) {
		check_admin_referer( 'ttseo_kpi_save' );
		update_option( 'ttseo_kpi', array(
			'baseline_b' => (float) ( $_POST['baseline_b'] ?? 0 ),
			'baseline_c' => (float) ( $_POST['baseline_c'] ?? 0 ),
			'baseline_r' => (float) ( $_POST['baseline_r'] ?? 0 ),
			'start_month'=> preg_replace( '/[^0-9\-]/', '', (string) ( $_POST['start_month'] ?? gmdate( 'Y-m' ) ) ),
			'keywords'   => array_values( array_filter( array_map( 'trim', explode( "\n", (string) wp_unslash( $_POST['keywords'] ?? '' ) ) ) ) ),
		) );
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-kpi&saved=1' ) );
		exit;
	}
} );

function ttseo_wf_items( $type, $period = null ) {
	global $wpdb;
	$table = ttseo_wf_table();
	if ( $period ) {
		return $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table WHERE type=%s AND period=%s ORDER BY updated_at DESC", $type, $period ) );
	}
	return $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table WHERE type=%s ORDER BY updated_at DESC", $type ) );
}

/* =========================================================================
 * MENU
 * ========================================================================= */
add_action( 'admin_menu', function () {
	if ( ttseo_module_on( 'kpi' ) ) {
		add_submenu_page( 'ttseo-dashboard', ttseo_t( 'KPI & Tiến độ', 'KPI & Progress' ), ttseo_t( 'KPI & Tiến độ', 'KPI & Progress' ), 'ttseo_access', 'ttseo-kpi', 'ttseo_render_kpi' );
	}
	if ( ttseo_module_on( 'work' ) ) {
		add_submenu_page( 'ttseo-dashboard', ttseo_t( 'Công việc SEO', 'SEO Work' ), ttseo_t( 'Công việc SEO', 'SEO Work' ), 'ttseo_access', 'ttseo-work', 'ttseo_render_work' );
	}
}, 20 );

/* =========================================================================
 * BRANDING SUN REACHES
 * ========================================================================= */
function ttseo_logo_url( $variant = 'dark' ) {
	$file = 'assets/logo-' . ( 'dark' === $variant ? 'dark' : 'light' ) . '.svg';
	if ( defined( 'TTSEO_URL' ) && file_exists( plugin_dir_path( dirname( __FILE__ ) . '/seo-console.php' ) . $file ) ) {
		return TTSEO_URL . $file;
	}
	return '';
}
function ttseo_brand_header() {
	$logo = ttseo_logo_url( 'dark' ); // bản chữ trắng cho nền navy
	echo '<div style="display:flex;align-items:center;gap:14px;margin:14px 0 4px;padding:11px 18px;background:#0f2747;border-radius:8px;">';
	if ( $logo ) {
		echo '<img src="' . esc_url( $logo ) . '" alt="Sun Reaches — Innovate to Inspire" style="height:30px;width:auto;display:block;">';
	} else {
		echo '<span style="color:#fff;font-weight:800;letter-spacing:.06em;font-size:15px;">SUN REACHES</span>';
	}
	echo '<span style="margin-left:auto;color:#8fa6c4;font-size:11px;">SEO Console · Sun Reaches</span>';
	echo '</div>';
}
function ttseo_brand_footer() {
	$logo = ttseo_logo_url( 'light' ); // bản chữ đậm cho nền sáng
	echo '<div style="margin-top:34px;padding-top:14px;border-top:1px solid #dcdfe3;color:#8a8f94;font-size:12px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;">';
	echo '<span style="display:flex;align-items:center;gap:10px;">';
	if ( $logo ) {
		echo '<img src="' . esc_url( $logo ) . '" alt="Sun Reaches" style="height:22px;width:auto;opacity:.85;">';
	}
	echo '© ' . esc_html( gmdate( 'Y' ) ) . ' Sun Reaches — Innovate to Inspire. ' . esc_html( ttseo_t( 'Bảo lưu mọi quyền.', 'All rights reserved.' ) ) . '</span>';
	echo '<span>' . esc_html( ttseo_t( 'SEO Console by Sun Reaches — sunreaches.com', 'SEO Console by Sun Reaches — sunreaches.com' ) ) . '</span>';
	echo '</div>';
}

/* =========================================================================
 * TRANG KPI & TIẾN ĐỘ
 * ========================================================================= */
function ttseo_kpi_targets() {
	// [traffic_pct, top20, top10, top5, top3] theo plan Sun Reaches
	return array(
		1 => array( 105, 4, 1, 0, 0 ),
		2 => array( 110, 6, 2, 0, 0 ),
		3 => array( 120, 8, 3, 1, 0 ),
		4 => array( 130, 10, 4, 2, 1 ),
		5 => array( 140, 12, 6, 3, 1 ),
		6 => array( 145, 13, 7, 3, 1 ),
		7 => array( 150, 14, 8, 4, 2 ),
		8 => array( 150, 14, 8, 4, 2 ),
	);
}

function ttseo_render_kpi() {
	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( 'KPI & Tiến độ', 'KPI & Progress' ) );
		ttseo_brand_footer(); echo '</div>';
		return;
	}
	$kpi = get_option( 'ttseo_kpi', array() );
	$b   = (float) ( $kpi['baseline_b'] ?? 0 );
	$c   = (float) ( $kpi['baseline_c'] ?? 0 );
	$r   = (float) ( $kpi['baseline_r'] ?? 0 );
	$kws = $kpi['keywords'] ?? array();

	echo '<div class="wrap ttseo-wrap">';
	ttseo_brand_header();
	echo '<h1>🎯 ' . esc_html( ttseo_t( 'KPI & Tiến độ SEO', 'KPI & SEO Progress' ) ) . '</h1>';
	echo '<p class="ttseo-subtle" style="margin-left:0;">' . esc_html( ttseo_t( 'Baseline & mục tiêu theo kế hoạch Giai đoạn 2-3. Cột "Thực tế" tự đối chiếu từ Google Search Console.', 'Baseline & targets per the Phase 2-3 plan. The "Actual" column is auto-matched from Google Search Console.' ) ) . '</p>';
	if ( isset( $_GET['saved'] ) ) {
		echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( ttseo_t( 'Đã lưu KPI.', 'KPI saved.' ) ) . '</p></div>';
	}

	/* ----- Thực tế hiện tại từ GSC ----- */
	$cur_clicks = null; $top = array( 20 => 0, 10 => 0, 5 => 0, 3 => 0 ); $kw_rows = array();
	if ( function_exists( 'ttseo_gsc_query' ) ) {
		$tot = ttseo_gsc_query( array(), 1 );
		if ( ! is_wp_error( $tot ) && ! empty( $tot ) ) {
			$cur_clicks = (int) ( $tot[0]['clicks'] ?? 0 );
		}
		$q = ttseo_gsc_query( array( 'query' ), 500 );
		if ( ! is_wp_error( $q ) ) {
			$map = array();
			foreach ( (array) $q as $row ) {
				$map[ strtolower( $row['keys'][0] ?? '' ) ] = $row;
			}
			foreach ( $kws as $kw ) {
				$row = $map[ strtolower( $kw ) ] ?? null;
				$pos = $row ? (float) $row['position'] : null;
				if ( null !== $pos ) {
					if ( $pos <= 20 ) { $top[20]++; }
					if ( $pos <= 10 ) { $top[10]++; }
					if ( $pos <= 5 ) { $top[5]++; }
					if ( $pos <= 3 ) { $top[3]++; }
				}
				$kw_rows[] = array( 'kw' => $kw, 'pos' => $pos, 'clicks' => $row ? (int) $row['clicks'] : 0, 'imp' => $row ? (int) $row['impressions'] : 0 );
			}
		}
	}

	echo '<div class="ttseo-strip">';
	ttseo_kpi( 'Baseline Traffic (B)', $b ? ttseo_num( $b ) : '—', ttseo_t( 'organic sessions/tháng', 'organic sessions/month' ), '#1f5c93' );
	ttseo_kpi( 'Baseline Clicks (C)', $c ? ttseo_num( $c ) : '—', ttseo_t( 'GSC 30 ngày', 'GSC 30 days' ), '#1f5c93' );
	ttseo_kpi( ttseo_t( 'Clicks hiện tại', 'Current clicks' ), null === $cur_clicks ? '—' : ttseo_num( $cur_clicks ), ttseo_t( 'GSC 28 ngày', 'GSC 28 days' ), '#1a7f5a' );
	ttseo_kpi( ttseo_t( 'Từ khóa KPI', 'KPI keywords' ), count( $kws ) . '/20', ttseo_t( 'đang theo dõi', 'tracked' ), '#6b3fb5' );
	echo '</div>';

	/* ----- Bảng mục tiêu theo tháng ----- */
	echo '<h2 class="ttseo-sec" style="--b:#1f5c93;">' . esc_html( ttseo_t( 'Mục tiêu theo tháng (đối chiếu Top-N thực tế)', 'Monthly targets (vs. actual Top-N)' ) ) . '</h2>';
	echo '<div class="ttseo-table"><table><thead><tr><th>' . esc_html( ttseo_t( 'Mốc', 'Milestone' ) ) . '</th><th>' . esc_html( ttseo_t( 'Traffic mục tiêu', 'Traffic target' ) ) . '</th><th>Top 20</th><th>Top 10</th><th>Top 5</th><th>Top 3</th></tr></thead><tbody>';
	foreach ( ttseo_kpi_targets() as $m => $t ) {
		$traffic_goal = $b ? round( $b * $t[0] / 100 ) : null;
		echo '<tr><td><b>' . esc_html( ttseo_t( 'Tháng', 'Month' ) ) . ' ' . (int) $m . '</b><br><span style="color:#8a8f94;font-size:11px;">B×' . (int) $t[0] . '%</span></td>';
		echo '<td>' . ( $traffic_goal ? ttseo_num( $traffic_goal ) : '—' ) . '</td>';
		echo '<td>' . ttseo_kpi_cell( $t[1], $top[20] ) . '</td>';
		echo '<td>' . ttseo_kpi_cell( $t[2], $top[10] ) . '</td>';
		echo '<td>' . ttseo_kpi_cell( $t[3], $top[5] ) . '</td>';
		echo '<td>' . ttseo_kpi_cell( $t[4], $top[3] ) . '</td></tr>';
	}
	echo '</tbody></table></div>';
	echo '<p class="ttseo-subtle">' . esc_html( ttseo_t( 'Số nhỏ màu là thực tế của 20 từ khóa KPI (Top-N hiện tại) — xanh nếu đạt/vượt mục tiêu tháng đó.', 'The small colored number is the actual result across the 20 KPI keywords (current Top-N) — green if that month\'s target is met or exceeded.' ) ) . '</p>';

	/* ----- Bằng chứng KPI (snapshot GSC/GA4/Bing) + tiến độ đăng bài + nghiệm thu khác ----- */
	if ( function_exists( 'ttseo_render_kpi_evidence' ) ) {
		ttseo_render_kpi_evidence();
	}

	/* ----- Chi tiết 20 từ khóa ----- */
	if ( $kw_rows ) {
		echo '<h2 class="ttseo-sec" style="--b:#6b3fb5;">' . esc_html( ttseo_t( 'Vị trí 20 từ khóa KPI (GSC 28 ngày)', 'Ranking for the 20 KPI keywords (GSC, 28 days)' ) ) . '</h2>';
		echo '<div class="ttseo-table"><table><thead><tr><th>' . esc_html( ttseo_t( 'Từ khóa', 'Keyword' ) ) . '</th><th>' . esc_html( ttseo_t( 'Vị trí', 'Position' ) ) . '</th><th>' . esc_html( ttseo_t( 'Nhóm', 'Group' ) ) . '</th><th>Clicks</th><th>' . esc_html( ttseo_t( 'Hiển thị', 'Impressions' ) ) . '</th></tr></thead><tbody>';
		foreach ( $kw_rows as $kr ) {
			$pos = $kr['pos'];
			$grp = '—'; $col = '#8a8f94';
			if ( null !== $pos ) {
				if ( $pos <= 3 ) { $grp = 'TOP 3'; $col = '#1a7f5a'; }
				elseif ( $pos <= 5 ) { $grp = 'TOP 5'; $col = '#2f8f4e'; }
				elseif ( $pos <= 10 ) { $grp = 'TOP 10'; $col = '#c77d16'; }
				elseif ( $pos <= 20 ) { $grp = 'TOP 20'; $col = '#b96712'; }
				else { $grp = '>20'; $col = '#c0392b'; }
			}
			echo '<tr><td>' . esc_html( $kr['kw'] ) . '</td><td>' . ( null === $pos ? '<span style="color:#c0392b;">' . esc_html( ttseo_t( 'chưa xếp hạng', 'not ranked' ) ) . '</span>' : number_format_i18n( $pos, 1 ) ) . '</td>';
			echo '<td><span style="color:' . esc_attr( $col ) . ';font-weight:700;font-size:11px;">' . esc_html( $grp ) . '</span></td>';
			echo '<td>' . ttseo_num( $kr['clicks'] ) . '</td><td>' . ttseo_num( $kr['imp'] ) . '</td></tr>';
		}
		echo '</tbody></table></div>';
	}

	/* ----- Cấu hình ----- */
	echo '<h2 class="ttseo-sec" style="--b:#c77d16;">' . esc_html( ttseo_t( 'Cấu hình baseline & từ khóa KPI', 'Baseline & KPI keyword configuration' ) ) . '</h2>';
	echo '<form method="post"><table class="form-table">';
	wp_nonce_field( 'ttseo_kpi_save' );
	echo '<tr><th>' . esc_html( ttseo_t( 'Baseline Traffic B (organic sessions/tháng)', 'Baseline Traffic B (organic sessions/month)' ) ) . '</th><td><input type="number" step="any" name="baseline_b" value="' . esc_attr( $b ) . '" class="regular-text"></td></tr>';
	echo '<tr><th>' . esc_html( ttseo_t( 'Baseline Clicks C (GSC 30 ngày)', 'Baseline Clicks C (GSC 30 days)' ) ) . '</th><td><input type="number" step="any" name="baseline_c" value="' . esc_attr( $c ) . '" class="regular-text"></td></tr>';
	echo '<tr><th>' . esc_html( ttseo_t( 'Baseline Ranking R (vị trí TB 20 từ khóa)', 'Baseline Ranking R (avg. position, 20 keywords)' ) ) . '</th><td><input type="number" step="any" name="baseline_r" value="' . esc_attr( $r ) . '" class="regular-text"></td></tr>';
	echo '<tr><th>' . esc_html( ttseo_t( 'Tháng bắt đầu', 'Start month' ) ) . '</th><td><input type="month" name="start_month" value="' . esc_attr( $kpi['start_month'] ?? gmdate( 'Y-m' ) ) . '"></td></tr>';
	echo '<tr><th>' . esc_html( ttseo_t( '20 từ khóa KPI', '20 KPI keywords' ) ) . '<br><span style="font-weight:400;color:#8a8f94;">' . esc_html( ttseo_t( 'mỗi dòng 1 từ khóa', 'one keyword per line' ) ) . '</span></th><td><textarea name="keywords" rows="10" class="large-text code" placeholder="' . ttseo_t( 'tên thương hiệu của bạn&#10;giá sản phẩm/dịch vụ&#10;...', 'your brand name&#10;[product/service] price&#10;...' ) . '">' . esc_textarea( implode( "\n", $kws ) ) . '</textarea></td></tr>';
	echo '</table><p><button class="button button-primary" name="ttseo_kpi_save" value="1">' . esc_html( ttseo_t( 'Lưu KPI', 'Save KPI' ) ) . '</button></p></form>';

	ttseo_brand_footer();
	echo '</div>';
}
function ttseo_kpi_cell( $target, $actual ) {
	$ok = $actual >= $target && $target > 0;
	$col = $ok ? '#1a7f5a' : ( $actual > 0 ? '#c77d16' : '#8a8f94' );
	return (int) $target . ' <span style="color:' . $col . ';font-weight:700;">(' . (int) $actual . ')</span>';
}

/* =========================================================================
 * TRANG CÔNG VIỆC SEO — On-page · Indexation · Authority · Action log
 * (Nội dung & duyệt bài đã gộp hẳn về "Soạn & Duyệt bài SEO" trong articles.php)
 * ========================================================================= */
function ttseo_render_work() {
	if ( function_exists( 'ttseo_is_unlocked' ) && ! ttseo_is_unlocked() ) {
		ttseo_render_gate();
		return;
	}
	ttseo_styles();
	$types = ttseo_wf_types();
	unset( $types['content'] ); // đã gộp về "Soạn & Duyệt bài SEO" — không còn tab CRUD riêng ở đây.
	$tab   = sanitize_key( $_GET['tab'] ?? 'onpage' );
	if ( ! isset( $types[ $tab ] ) ) {
		$tab = 'onpage';
	}
	$cfg    = $types[ $tab ];
	$period = gmdate( 'Y-m' );

	echo '<div class="wrap ttseo-wrap">';
	ttseo_brand_header();
	echo '<h1>🗂️ ' . esc_html( ttseo_t( 'Công việc SEO', 'SEO Work' ) ) . '</h1>';

	// Thẻ điều hướng sang nơi soạn/duyệt bài (không còn trùng lặp ở trang này)
	$content_items = ttseo_wf_items( 'content', $period );
	$content_done  = 0;
	foreach ( $content_items as $it ) {
		if ( in_array( $it->status, array( 'approved', 'published' ), true ) ) {
			$content_done++;
		}
	}
	echo '<div style="background:#fff;border:1px solid #dcdfe3;border-left:4px solid #1a7f5a;border-radius:8px;padding:12px 16px;margin:14px 0;display:flex;align-items:center;gap:14px;flex-wrap:wrap;">';
	echo '<div><b>📝 ' . esc_html( ttseo_t( 'Soạn & Duyệt bài SEO', 'SEO Content & Approval' ) ) . '</b> — ' . esc_html( ttseo_t( 'quản lý nội dung, hạn duyệt, xuất bản và ma trận từ khóa KPI đã chuyển hẳn về một nơi duy nhất.', 'content management, approval deadlines, publishing and the KPI keyword matrix now live in one place.' ) ) . '<br>';
	echo '<span class="ttseo-subtle" style="margin:2px 0 0 0;">' . esc_html( ttseo_t( 'Tháng', 'Month' ) ) . ' ' . esc_html( gmdate( 'm/Y' ) ) . ': ' . esc_html( ttseo_t( 'đã duyệt/xuất bản', 'approved/published' ) ) . ' <b>' . (int) $content_done . '/10</b> ' . esc_html( ttseo_t( 'bài.', 'post(s).' ) ) . '</span></div>';
	echo '<a href="' . esc_url( admin_url( 'admin.php?page=ttseo-articles' ) ) . '" class="button button-primary" style="margin-left:auto;">' . esc_html( ttseo_t( 'Mở Soạn & Duyệt bài SEO →', 'Open SEO Content & Approval →' ) ) . '</a>';
	echo '</div>';

	// Tabs (chỉ còn các hạng mục KHÔNG trùng với Soạn & Duyệt bài SEO)
	echo '<h2 class="nav-tab-wrapper" style="margin-top:12px;">';
	foreach ( $types as $k => $c ) {
		$active = $k === $tab ? ' nav-tab-active' : '';
		echo '<a class="nav-tab' . $active . '" href="' . esc_url( admin_url( 'admin.php?page=ttseo-work&tab=' . $k ) ) . '">' . esc_html( $c['label'] ) . '</a>';
	}
	echo '</h2>';

	if ( isset( $_GET['saved'] ) ) {
		echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( ttseo_t( 'Đã lưu.', 'Saved.' ) ) . '</p></div>';
	}
	if ( isset( $_GET['inspected'] ) ) {
		echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( ttseo_t( 'Đã kiểm tra trạng thái index', 'Checked index status for' ) ) . ' ' . (int) $_GET['inspected'] . ' URL ' . esc_html( ttseo_t( 'với Google.', 'with Google.' ) ) . '</p></div>';
	}
	if ( isset( $_GET['imported'] ) ) {
		echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( ttseo_t( 'Đã nạp', 'Imported' ) ) . ' ' . (int) $_GET['imported'] . ' URL ' . esc_html( ttseo_t( 'vào nhật ký index.', 'into the indexation log.' ) ) . '</p></div>';
	}

	// Công cụ riêng cho tab Indexation
	if ( 'index' === $tab ) {
		$imp = wp_nonce_url( admin_url( 'admin.php?page=ttseo-work&tab=index&ttseo_index_import=1' ), 'ttseo_index_import' );
		$ins = wp_nonce_url( admin_url( 'admin.php?page=ttseo-work&tab=index&ttseo_inspect_all=1' ), 'ttseo_inspect_all' );
		echo '<div style="background:#fff;border:1px solid #dcdfe3;border-left:4px solid #1f5c93;border-radius:8px;padding:12px 16px;margin:12px 0;">';
		echo '<b>' . esc_html( ttseo_t( 'Công cụ lập chỉ mục', 'Indexation tools' ) ) . '</b> — ' . esc_html( ttseo_t( 'kiểm tra trạng thái thật từ Google (URL Inspection API).', 'check the real status from Google (URL Inspection API).' ) ) . '<br>';
		echo '<a href="' . esc_url( $imp ) . '" class="button" style="margin-top:8px;">⬇ ' . esc_html( ttseo_t( 'Nạp toàn bộ URL hiện có', 'Import all existing URLs' ) ) . '</a> ';
		echo '<a href="' . esc_url( $ins ) . '" class="button button-primary" style="margin-top:8px;">🔍 ' . esc_html( ttseo_t( 'Kiểm tra index (20 URL cũ nhất)', 'Check index (20 oldest URLs)' ) ) . '</a>';
		echo '<p class="ttseo-subtle" style="margin:8px 0 0 0;">' . esc_html( ttseo_t( 'Mỗi lần kiểm tra tối đa 20 URL để tránh timeout (hạn mức Google 2.000 URL/ngày). Bấm nhiều lần để quét hết.', 'Each check covers up to 20 URLs to avoid timeouts (Google\'s limit is 2,000 URLs/day). Click multiple times to scan everything.' ) ) . '</p>';
		echo '</div>';
	}

	// Tiến độ tháng này
	$items   = ttseo_wf_items( $tab, $period );
	$all     = ttseo_wf_items( $tab );
	$done_ct = 0;
	foreach ( $items as $it ) {
		if ( in_array( $it->status, $cfg['done'], true ) ) {
			$done_ct++;
		}
	}
	echo '<div class="ttseo-strip">';
	if ( $cfg['quota'] > 0 ) {
		ttseo_kpi( ttseo_t( 'Chỉ tiêu tháng', 'Monthly quota' ), $cfg['quota'] . ' ' . $cfg['unit'], ttseo_t( 'theo plan', 'per plan' ), '#1f5c93' );
		ttseo_kpi( ttseo_t( 'Hoàn thành tháng này', 'Completed this month' ), $done_ct . '/' . $cfg['quota'], gmdate( 'm/Y' ), $done_ct >= $cfg['quota'] ? '#1a7f5a' : '#c77d16' );
	} else {
		ttseo_kpi( ttseo_t( 'Mục tháng này', 'Items this month' ), (string) count( $items ), $cfg['unit'], '#1f5c93' );
	}
	ttseo_kpi( ttseo_t( 'Tổng tất cả', 'All-time total' ), (string) count( $all ), ttseo_t( 'toàn dự án', 'across the project' ), '#6b3fb5' );
	echo '</div>';

	if ( 'onpage' === $tab ) {
		// On-page Checklist đã gộp thẳng vào đây — không còn form "Thêm mục mới" thủ công
		// (trạng thái chỉ được ghi nhận từ kết quả audit thật, tránh đánh dấu khống).
		if ( function_exists( 'ttseo_onpage_checklist_ui' ) ) {
			ttseo_onpage_checklist_ui();
		}
	} else {
		// Form thêm
		echo '<h3>' . esc_html( ttseo_t( 'Thêm mục mới', 'Add new item' ) ) . '</h3>';
		echo '<form method="post" style="background:#fff;border:1px solid #dcdfe3;border-radius:8px;padding:14px 16px;display:grid;grid-template-columns:1fr 1fr;gap:12px;max-width:820px;">';
		wp_nonce_field( 'ttseo_item_add' );
		echo '<input type="hidden" name="type" value="' . esc_attr( $tab ) . '">';
		echo '<input type="hidden" name="period" value="' . esc_attr( $period ) . '">';
		echo '<label style="grid-column:1/3;">' . esc_html( ttseo_t( 'Tiêu đề / nội dung', 'Title / content' ) ) . '<br><input type="text" name="title" class="large-text" required></label>';
		echo '<label>' . esc_html( ttseo_t( 'URL (nếu có)', 'URL (optional)' ) ) . '<br><input type="url" name="url" class="large-text" placeholder="https://..."></label>';
		echo '<label>' . esc_html( ttseo_t( 'Trạng thái', 'Status' ) ) . '<br><select name="status" class="regular-text">';
		foreach ( $cfg['statuses'] as $sk => $sl ) {
			echo '<option value="' . esc_attr( $sk ) . '">' . esc_html( $sl ) . '</option>';
		}
		echo '</select></label>';

		// #5 Authority: phân loại nguồn
		if ( 'authority' === $tab ) {
			echo '<label>' . esc_html( ttseo_t( 'Loại nguồn uy tín', 'Authority source type' ) ) . '<br><select name="source_type" class="regular-text">';
			echo '<option value="">— ' . esc_html( ttseo_t( 'chọn', 'select' ) ) . ' —</option>';
			foreach ( ttseo_wf_source_types() as $k => $v ) {
				echo '<option value="' . esc_attr( $k ) . '">' . esc_html( $v ) . '</option>';
			}
			echo '</select></label>';
		}

		echo '<label style="grid-column:1/3;">' . esc_html( ttseo_t( 'Ghi chú', 'Notes' ) ) . '<br><input type="text" name="notes" class="large-text"></label>';
		echo '<p style="grid-column:1/3;margin:0;"><button class="button button-primary" name="ttseo_item_add" value="1">＋ ' . esc_html( ttseo_t( 'Thêm', 'Add' ) ) . '</button></p>';
		echo '</form>';

		// Danh sách
		echo '<h3>' . esc_html( ttseo_t( 'Danh sách', 'List' ) ) . '</h3>';
		if ( empty( $all ) ) {
			echo '<p class="ttseo-subtle">' . esc_html( ttseo_t( 'Chưa có mục nào.', 'No items yet.' ) ) . '</p>';
		} else {
			echo '<div class="ttseo-table"><table><thead><tr><th>' . esc_html( ttseo_t( 'Tiêu đề', 'Title' ) ) . '</th><th>URL</th><th>' . esc_html( ttseo_t( 'Trạng thái', 'Status' ) ) . '</th><th>' . esc_html( ttseo_t( 'Kỳ', 'Period' ) ) . '</th><th>' . esc_html( ttseo_t( 'Cập nhật', 'Updated' ) ) . '</th><th>' . esc_html( ttseo_t( 'Thao tác', 'Actions' ) ) . '</th></tr></thead><tbody>';
			foreach ( $all as $it ) {
				$del = wp_nonce_url( admin_url( 'admin.php?page=ttseo-work&tab=' . $tab . '&ttseo_item_delete=1&id=' . $it->id ), 'ttseo_item_delete' );
				// Nhãn phụ: intent / audience / loại nguồn
				$tags = '';
				if ( ! empty( $it->intent ) ) {
					$tags .= '<span class="ttseo-src src-g" style="margin-right:4px;">' . esc_html( ttseo_wf_intents()[ $it->intent ] ?? $it->intent ) . '</span>';
				}
				if ( ! empty( $it->source_type ) ) {
					$tags .= '<span class="ttseo-src src-b" style="margin-right:4px;">' . esc_html( ttseo_wf_source_types()[ $it->source_type ] ?? $it->source_type ) . '</span>';
				}
				if ( ! empty( $it->audience ) ) {
					$tags .= '<span class="ttseo-src src-a">👤 ' . esc_html( $it->audience ) . '</span>';
				}
				echo '<tr><td>' . esc_html( $it->title );
				if ( $tags ) { echo '<br>' . $tags; }
				if ( ! empty( $it->brief ) ) { echo '<br><span style="color:#646970;font-size:11px;">📋 ' . esc_html( wp_trim_words( $it->brief, 22 ) ) . '</span>'; }
				echo ( $it->notes ? '<br><span style="color:#8a8f94;font-size:11px;">' . esc_html( $it->notes ) . '</span>' : '' ) . '</td>';
				echo '<td>' . ( $it->url ? '<a href="' . esc_url( $it->url ) . '" target="_blank" rel="noopener">↗</a>' : '—' ) . '</td>';
				// status dropdown (links)
				echo '<td>' . ttseo_status_badge( $it, $cfg, $tab ) . '</td>';
				echo '<td>' . esc_html( $it->period ) . '</td>';
				echo '<td style="color:#8a8f94;font-size:11px;">' . esc_html( mysql2date( 'd/m H:i', $it->updated_at ) ) . '</td>';
				echo '<td style="white-space:nowrap;">';
				if ( 'index' === $tab && $it->url ) {
					$ins1 = wp_nonce_url( admin_url( 'admin.php?page=ttseo-work&tab=index&ttseo_inspect=1&id=' . $it->id ), 'ttseo_inspect' );
					echo '<a href="' . esc_url( $ins1 ) . '" style="font-size:11px;margin-right:8px;">🔍 ' . esc_html( ttseo_t( 'Kiểm tra', 'Check' ) ) . '</a>';
				}
				echo '<a href="' . esc_url( $del ) . '" onclick="return confirm(\'' . esc_js( ttseo_t( 'Xóa mục này?', 'Delete this item?' ) ) . '\')" style="color:#c0392b;font-size:11px;">' . esc_html( ttseo_t( 'Xóa', 'Delete' ) ) . '</a></td></tr>';
			}
			echo '</tbody></table></div>';
		}
	}

	echo '<p class="ttseo-subtle">' . esc_html( ttseo_t( 'Nguồn đối chiếu: Content calendar · Website Crawler · GSC/Bing · IndexNow · Digital PR Log — theo bảng nghiệm thu Sun Reaches.', 'Cross-referenced sources: Content calendar · Website Crawler · GSC/Bing · IndexNow · Digital PR Log.' ) ) . '</p>';
	ttseo_brand_footer();
	echo '</div>';
}

function ttseo_status_badge( $it, $cfg, $tab ) {
	$colors = array(
		'draft' => '#8a8f94', 'submitted' => '#c77d16', 'approved' => '#1a7f5a', 'published' => '#1f5c93', 'rejected' => '#c0392b',
		'todo' => '#8a8f94', 'checking' => '#c77d16', 'done' => '#1a7f5a',
		'pending' => '#8a8f94', 'indexed' => '#1a7f5a', 'error' => '#c0392b',
		'reviewed' => '#8a8f94', 'proposed' => '#c77d16', 'deployed' => '#1a7f5a',
		'open' => '#8a8f94', 'progress' => '#c77d16',
	);
	$cur = $it->status;
	$lab = $cfg['statuses'][ $cur ] ?? $cur;
	$col = $colors[ $cur ] ?? '#8a8f94';
	$out = '<span style="display:inline-block;font-size:11px;font-weight:700;color:' . $col . ';border:1px solid ' . $col . '33;background:' . $col . '14;border-radius:12px;padding:2px 9px;">' . esc_html( $lab ) . '</span> ';
	$out .= '<span style="white-space:nowrap;">';
	foreach ( $cfg['statuses'] as $sk => $sl ) {
		if ( $sk === $cur ) {
			continue;
		}
		$u = wp_nonce_url( admin_url( 'admin.php?page=ttseo-work&tab=' . $tab . '&ttseo_item_status=1&id=' . $it->id . '&to=' . $sk ), 'ttseo_item_status' );
		$out .= '<a href="' . esc_url( $u ) . '" style="font-size:10px;color:#646970;margin-left:5px;">→' . esc_html( $sl ) . '</a>';
	}
	$out .= '</span>';
	return $out;
}
