<?php
/**
 * #6 Reporting & Review — báo cáo tháng tổng hợp + biên bản họp, in/xuất PDF.
 * Require từ seo-console.php.
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'admin_menu', function () {
	if ( ttseo_module_on( 'report' ) ) {
		add_submenu_page( 'ttseo-dashboard', ttseo_t( 'Báo cáo & Review', 'Reports & Review' ), ttseo_t( 'Báo cáo & Review', 'Reports & Review' ), 'ttseo_access', 'ttseo-report', 'ttseo_render_report' );
	}
}, 50 );

// Lưu biên bản họp theo kỳ
add_action( 'admin_init', function () {
	if ( ! ttseo_access() || ! function_exists( 'ttseo_is_unlocked' ) || ! ttseo_is_unlocked() ) {
		return;
	}
	if ( isset( $_POST['ttseo_minutes_save'] ) ) {
		check_admin_referer( 'ttseo_minutes' );
		$p   = preg_replace( '/[^0-9\-]/', '', (string) ( $_POST['period'] ?? gmdate( 'Y-m' ) ) );
		$all = get_option( 'ttseo_minutes', array() );
		$all[ $p ] = array(
			'summary' => sanitize_textarea_field( wp_unslash( $_POST['summary'] ?? '' ) ),
			'actions' => sanitize_textarea_field( wp_unslash( $_POST['actions'] ?? '' ) ),
			'saved_at'=> current_time( 'mysql' ),
		);
		update_option( 'ttseo_minutes', $all );
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-report&period=' . $p . '&saved=1' ) );
		exit;
	}
} );

function ttseo_render_report() {
	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( 'Báo cáo & Review', 'Reports & Review' ) );
		ttseo_brand_footer(); echo '</div>';
		return;
	}
	global $wpdb;
	$period = preg_replace( '/[^0-9\-]/', '', (string) ( $_GET['period'] ?? gmdate( 'Y-m' ) ) );

	?>
	<style>
	@media print {
		#adminmenumain, #wpadminbar, #wpfooter, .ttseo-noprint, .notice { display: none !important; }
		#wpcontent, #wpbody-content { margin-left: 0 !important; padding: 0 !important; }
		.ttseo-wrap { max-width: 100% !important; }
		.ttseo-kpi, .ttseo-table { break-inside: avoid; }
		body { background: #fff !important; }
	}
	.ttseo-rep-sec { margin-top: 22px; }
	</style>
	<?php

	echo '<div class="wrap ttseo-wrap">';
	ttseo_brand_header();

	echo '<h1>📄 ' . esc_html( ttseo_t( 'Báo cáo & Review', 'Reports & Review' ) );
	echo ' <button onclick="window.print()" class="button button-primary ttseo-noprint" style="margin-left:10px;">🖨️ ' . esc_html( ttseo_t( 'In / Xuất PDF', 'Print / Export PDF' ) ) . '</button></h1>';
	if ( isset( $_GET['saved'] ) ) { echo '<div class="notice notice-success is-dismissible"><p>' . esc_html( ttseo_t( 'Đã lưu biên bản.', 'Minutes saved.' ) ) . '</p></div>'; }

	// Chọn kỳ
	echo '<form method="get" class="ttseo-noprint" style="margin:10px 0;">';
	echo '<input type="hidden" name="page" value="ttseo-report">';
	echo '<label>' . esc_html( ttseo_t( 'Kỳ báo cáo:', 'Report period:' ) ) . ' <input type="month" name="period" value="' . esc_attr( $period ) . '"></label> ';
	echo '<button class="button">' . esc_html( ttseo_t( 'Xem', 'View' ) ) . '</button></form>';

	echo '<div style="background:#fff;border:1px solid #dcdfe3;border-radius:8px;padding:18px 22px;margin:12px 0;">';
	echo '<h2 style="margin:0 0 4px;">' . esc_html( ttseo_t( 'Báo cáo SEO', 'SEO Report' ) ) . '</h2>';
	echo '<p style="margin:0;color:#646970;">' . esc_html( ttseo_t( 'Kỳ:', 'Period:' ) ) . ' <b>' . esc_html( $period ) . '</b> · ' . esc_html( ttseo_t( 'Xuất ngày', 'Exported' ) ) . ' ' . esc_html( gmdate( 'd/m/Y H:i' ) ) . ' · ' . esc_html( ttseo_t( 'Thực hiện: Sun Reaches', 'By Sun Reaches' ) ) . '</p>';
	echo '</div>';

	/* ---------- 1. Hiệu suất tìm kiếm ---------- */
	echo '<h2 class="ttseo-sec ttseo-rep-sec" style="--b:#1f5c93;">1. ' . esc_html( ttseo_t( 'Hiệu suất tìm kiếm (28 ngày gần nhất)', 'Search performance (last 28 days)' ) ) . '</h2>';
	echo '<div class="ttseo-strip">';
	$g = function_exists( 'ttseo_gsc_query' ) ? ttseo_gsc_query( array(), 1 ) : new WP_Error( 'x', '' );
	if ( ! is_wp_error( $g ) && ! empty( $g ) ) {
		$t = $g[0];
		ttseo_kpi( 'Google Clicks', ttseo_num( $t['clicks'] ?? 0 ), '', '#1f5c93' );
		ttseo_kpi( ttseo_t( 'Google Hiển thị', 'Google Impressions' ), ttseo_num( $t['impressions'] ?? 0 ), '', '#1f5c93' );
		ttseo_kpi( 'CTR', ttseo_pct( $t['ctr'] ?? 0 ), '', '#1f5c93' );
		ttseo_kpi( ttseo_t( 'Vị trí TB', 'Avg. position' ), number_format_i18n( (float) ( $t['position'] ?? 0 ), 1 ), '', '#1f5c93' );
	}
	$b = function_exists( 'ttseo_bing_call' ) ? ttseo_bing_call( 'GetRankAndTrafficStats' ) : new WP_Error( 'x', '' );
	if ( ! is_wp_error( $b ) ) {
		$bc = 0; $bi = 0;
		foreach ( (array) $b as $r ) { $bc += (int) ( $r['Clicks'] ?? 0 ); $bi += (int) ( $r['Impressions'] ?? 0 ); }
		ttseo_kpi( 'Bing Clicks', ttseo_num( $bc ), '', '#0f7a63' );
		ttseo_kpi( ttseo_t( 'Bing Hiển thị', 'Bing Impressions' ), ttseo_num( $bi ), '', '#0f7a63' );
	}
	echo '</div>';

	/* ---------- 2. Tiến độ KPI từ khóa ---------- */
	$kpi = get_option( 'ttseo_kpi', array() );
	$kws = $kpi['keywords'] ?? array();
	if ( $kws && function_exists( 'ttseo_gsc_query' ) ) {
		$q   = ttseo_gsc_query( array( 'query' ), 500 );
		$top = array( 20 => 0, 10 => 0, 5 => 0, 3 => 0 );
		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;
				if ( ! $row ) { continue; }
				$p = (float) $row['position'];
				if ( $p <= 20 ) { $top[20]++; }
				if ( $p <= 10 ) { $top[10]++; }
				if ( $p <= 5 ) { $top[5]++; }
				if ( $p <= 3 ) { $top[3]++; }
			}
		}
		echo '<h2 class="ttseo-sec ttseo-rep-sec" style="--b:#6b3fb5;">2. ' . esc_html( ttseo_t( 'Tiến độ 20 từ khóa KPI', '20 KPI keyword progress' ) ) . '</h2>';
		echo '<div class="ttseo-strip">';
		ttseo_kpi( ttseo_t( 'Trong TOP 3', 'In TOP 3' ), (string) $top[3], ttseo_t( 'từ khóa', 'keyword(s)' ), '#1a7f5a' );
		ttseo_kpi( ttseo_t( 'Trong TOP 5', 'In TOP 5' ), (string) $top[5], ttseo_t( 'từ khóa', 'keyword(s)' ), '#2f8f4e' );
		ttseo_kpi( ttseo_t( 'Trong TOP 10', 'In TOP 10' ), (string) $top[10], ttseo_t( 'từ khóa', 'keyword(s)' ), '#c77d16' );
		ttseo_kpi( ttseo_t( 'Trong TOP 20', 'In TOP 20' ), (string) $top[20], ttseo_t( 'từ khóa', 'keyword(s)' ), '#b96712' );
		ttseo_kpi( ttseo_t( 'Tổng theo dõi', 'Total tracked' ), (string) count( $kws ), ttseo_t( 'từ khóa KPI', 'KPI keywords' ), '#1f5c93' );
		echo '</div>';
	}

	/* ---------- 3. Khối lượng công việc theo nghiệm thu ---------- */
	echo '<h2 class="ttseo-sec ttseo-rep-sec" style="--b:#c77d16;">3. ' . esc_html( ttseo_t( 'Nghiệm thu khối lượng — kỳ', 'Workload sign-off — period' ) ) . ' ' . esc_html( $period ) . '</h2>';
	$wt = ttseo_wf_table();
	echo '<div class="ttseo-table"><table><thead><tr><th>' . esc_html( ttseo_t( 'Hạng mục', 'Category' ) ) . '</th><th>' . esc_html( ttseo_t( 'Chỉ tiêu', 'Quota' ) ) . '</th><th>' . esc_html( ttseo_t( 'Thực hiện', 'Recorded' ) ) . '</th><th>' . esc_html( ttseo_t( 'Hoàn thành', 'Completed' ) ) . '</th><th>' . esc_html( ttseo_t( 'Đánh giá', 'Assessment' ) ) . '</th></tr></thead><tbody>';
	foreach ( ttseo_wf_types() as $k => $cfg ) {
		$items = $wpdb->get_results( $wpdb->prepare( "SELECT status FROM $wt WHERE type=%s AND period=%s", $k, $period ) );
		$done  = 0;
		foreach ( $items as $it ) { if ( in_array( $it->status, $cfg['done'], true ) ) { $done++; } }
		$quota = $cfg['quota'];
		$pass  = $quota ? $done >= $quota : true;
		echo '<tr><td><b>' . esc_html( $cfg['label'] ) . '</b></td>';
		echo '<td>' . ( $quota ? $quota . ' ' . esc_html( $cfg['unit'] ) : '—' ) . '</td>';
		echo '<td>' . count( $items ) . '</td><td>' . $done . '</td>';
		echo '<td>' . ( $quota ? ( $pass ? '<span style="color:#1a7f5a;font-weight:700;">✓ ' . esc_html( ttseo_t( 'Đạt', 'Met' ) ) . '</span>' : '<span style="color:#c0392b;font-weight:700;">✗ ' . esc_html( ttseo_t( 'Thiếu', 'Short by' ) ) . ' ' . ( $quota - $done ) . '</span>' ) : '<span style="color:#8a8f94;">' . esc_html( ttseo_t( 'ghi nhận', 'logged' ) ) . '</span>' ) . '</td></tr>';
	}
	echo '</tbody></table></div>';

	/* ---------- 4. Chất lượng nội dung ---------- */
	if ( function_exists( 'ttseo_content_rows' ) ) {
		$live = ttseo_content_aggregate( ttseo_content_rows() );
		$base = get_option( 'ttseo_phase1_baseline', array() );
		$d    = round( ( $live['avg'] ?? 0 ) - ( $base['avg'] ?? 0 ), 1 );
		echo '<h2 class="ttseo-sec ttseo-rep-sec" style="--b:#1a7f5a;">4. ' . esc_html( ttseo_t( 'Chất lượng nội dung (điểm SEO)', 'Content quality (SEO score)' ) ) . '</h2>';
		echo '<div class="ttseo-strip">';
		ttseo_kpi( ttseo_t( 'Base GĐ1', 'Phase 1 baseline' ), ( $base['avg'] ?? 0 ) . '/100', ttseo_t( 'điểm TB ban đầu', 'initial avg. score' ), '#8a8f94' );
		ttseo_kpi( ttseo_t( 'Hiện tại', 'Current' ), ( $live['avg'] ?? 0 ) . '/100', ( $d >= 0 ? '▲ +' : '▼ ' ) . $d, $d >= 0 ? '#1a7f5a' : '#c0392b' );
		ttseo_kpi( ttseo_t( 'Bài Tốt (≥81)', 'Good posts (≥81)' ), ttseo_num( $live['good'] ?? 0 ), ttseo_t( 'trên', 'of' ) . ' ' . ttseo_num( $live['total'] ?? 0 ), '#1a7f5a' );
		ttseo_kpi( ttseo_t( 'Bài Yếu (≤50)', 'Weak posts (≤50)' ), ttseo_num( $live['poor'] ?? 0 ), ttseo_t( 'cần tối ưu', 'needs optimization' ), '#c0392b' );
		echo '</div>';
	}

	/* ---------- 5. Kết quả kinh doanh (Lead) ---------- */
	if ( function_exists( 'ttseo_leads_table' ) ) {
		$lt = ttseo_leads_table();
		if ( $wpdb->get_var( "SHOW TABLES LIKE '$lt'" ) === $lt ) {
			$lm  = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $lt WHERE DATE_FORMAT(created_at,'%%Y-%%m')=%s", $period ) );
			$lw  = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $lt WHERE status='won' AND DATE_FORMAT(created_at,'%%Y-%%m')=%s", $period ) );
			$lo  = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $lt WHERE channel LIKE 'organic%%' AND DATE_FORMAT(created_at,'%%Y-%%m')=%s", $period ) );
			echo '<h2 class="ttseo-sec ttseo-rep-sec" style="--b:#0f7a63;">5. ' . esc_html( ttseo_t( 'Kết quả kinh doanh — Lead', 'Business results — Leads' ) ) . '</h2>';
			echo '<div class="ttseo-strip">';
			ttseo_kpi( ttseo_t( 'Lead trong kỳ', 'Leads this period' ), ttseo_num( $lm ), esc_html( $period ), '#1f5c93' );
			ttseo_kpi( ttseo_t( 'Lead từ tìm kiếm', 'Leads from search' ), ttseo_num( $lo ), 'organic (SEO)', '#1a7f5a' );
			ttseo_kpi( ttseo_t( 'Chốt thành công', 'Won' ), ttseo_num( $lw ), '', '#1a7f5a' );
			ttseo_kpi( ttseo_t( 'Tỷ lệ chốt', 'Win rate' ), ( $lm ? round( $lw / $lm * 100, 1 ) : 0 ) . '%', '', '#6b3fb5' );
			echo '</div>';
		}
	}

	/* ---------- 6. Biên bản họp & kế hoạch kỳ tới ---------- */
	$minutes = get_option( 'ttseo_minutes', array() );
	$m       = $minutes[ $period ] ?? array( 'summary' => '', 'actions' => '' );
	echo '<h2 class="ttseo-sec ttseo-rep-sec" style="--b:#b96712;">6. ' . esc_html( ttseo_t( 'Biên bản review & kế hoạch kỳ tiếp theo', 'Review minutes & next-period plan' ) ) . '</h2>';
	echo '<form method="post">';
	wp_nonce_field( 'ttseo_minutes' );
	echo '<input type="hidden" name="period" value="' . esc_attr( $period ) . '">';
	echo '<div style="background:#fff;border:1px solid #dcdfe3;border-radius:8px;padding:14px 16px;">';
	echo '<label><b>' . esc_html( ttseo_t( 'Nội dung review / nhận xét', 'Review notes / comments' ) ) . '</b><br><textarea name="summary" rows="5" class="large-text">' . esc_textarea( $m['summary'] ) . '</textarea></label>';
	echo '<label style="display:block;margin-top:12px;"><b>' . esc_html( ttseo_t( 'Kế hoạch hành động kỳ tiếp theo', 'Next-period action plan' ) ) . '</b><br><textarea name="actions" rows="5" class="large-text">' . esc_textarea( $m['actions'] ) . '</textarea></label>';
	echo '<p class="ttseo-noprint" style="margin:12px 0 0;"><button class="button button-primary" name="ttseo_minutes_save" value="1">' . esc_html( ttseo_t( 'Lưu biên bản', 'Save minutes' ) ) . '</button>';
	if ( ! empty( $m['saved_at'] ) ) {
		echo ' <span class="ttseo-subtle" style="margin-left:8px;">' . esc_html( ttseo_t( 'Lưu lần cuối:', 'Last saved:' ) ) . ' ' . esc_html( mysql2date( 'd/m/Y H:i', $m['saved_at'] ) ) . '</span>';
	}
	echo '</p></div></form>';

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