<?php
/**
 * Người dùng & Phân quyền — tạo tài khoản, đổi mật khẩu, đổi vai trò, cấp/thu quyền
 * duyệt bài SEO ngay trong SEO Console (không cần vào màn hình Users gốc của WP).
 * Cổng bảo vệ giống mọi phân hệ khác: capability manage_options + mật khẩu riêng
 * (ttseo_is_unlocked()). Được require từ seo-console.php.
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/* =========================================================================
 * GHI NHẬN LẦN ĐĂNG NHẬP GẦN NHẤT (WP không lưu sẵn — bổ sung nhẹ bằng user meta)
 * ========================================================================= */
add_action( 'wp_login', function ( $user_login, $user = null ) {
	if ( $user && isset( $user->ID ) ) {
		update_user_meta( $user->ID, 'ttseo_last_login', current_time( 'mysql' ) );
	}
}, 10, 2 );

/* =========================================================================
 * VAI TRÒ ĐƯỢC PHÉP GÁN — whitelist tường minh, tránh gán role lạ/không tồn tại.
 * ========================================================================= */
function ttseo_users_assignable_roles() {
	$names = wp_roles()->get_names();
	$allow = array( TTSEO_ROLE, 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
	$out   = array();
	foreach ( $allow as $slug ) {
		if ( TTSEO_ROLE === $slug && isset( $names[ $slug ] ) ) {
			$out[ $slug ] = ttseo_t( 'Người dùng SEO Dashboard', 'SEO Dashboard User' );
		} elseif ( isset( $names[ $slug ] ) ) {
			$out[ $slug ] = translate_user_role( $names[ $slug ] );
		}
	}
	return $out;
}

/** Có phải quản trị viên (administrator) duy nhất còn lại không — chặn tự khóa hệ thống. */
function ttseo_users_is_last_admin( $user_id ) {
	$user = get_userdata( $user_id );
	if ( ! $user || ! in_array( 'administrator', (array) $user->roles, true ) ) {
		return false;
	}
	$admins = get_users( array( 'role' => 'administrator', 'fields' => 'ID' ) );
	return count( $admins ) <= 1;
}

/** Gửi email đặt lại mật khẩu — tự dựng theo đúng cơ chế lõi WordPress (không cần include wp-login.php). */
function ttseo_users_send_reset_email( $user ) {
	$key = get_password_reset_key( $user );
	if ( is_wp_error( $key ) ) {
		return $key;
	}
	$reset_url = network_site_url( 'wp-login.php?action=rp&key=' . $key . '&login=' . rawurlencode( $user->user_login ), 'login' );
	$message   = ttseo_t( 'Xin chào', 'Hello' ) . " {$user->user_login},\n\n";
	$message  .= ttseo_t( 'Có yêu cầu đặt lại mật khẩu cho tài khoản của bạn trên', 'A password reset was requested for your account on' ) . ' ' . home_url() . " (SEO Console).\n\n";
	$message  .= ttseo_t( 'Nếu đây là yêu cầu của bạn, bấm vào liên kết dưới đây để đặt mật khẩu mới:', 'If this was you, click the link below to set a new password:' ) . "\n{$reset_url}\n\n";
	$message  .= ttseo_t( 'Nếu bạn không yêu cầu việc này, hãy bỏ qua email này.', 'If you did not request this, you can ignore this email.' ) . "\n";
	$sent = wp_mail( $user->user_email, '[SEO Console] ' . ttseo_t( 'Đặt lại mật khẩu', 'Password reset' ) . ' — ' . home_url(), $message );
	return $sent ? true : new WP_Error( 'mail_fail', ttseo_t( 'Gửi email thất bại — kiểm tra cấu hình gửi mail của site.', 'Failed to send the email — check the site\'s mail configuration.' ) );
}

/* =========================================================================
 * MENU
 * ========================================================================= */
add_action( 'admin_menu', function () {
	if ( ttseo_module_on( 'users' ) ) {
		add_submenu_page( 'ttseo-dashboard', ttseo_t( 'Người dùng & Phân quyền', 'Users & Permissions' ), ttseo_t( 'Người dùng & Phân quyền', 'Users & Permissions' ), 'manage_options', 'ttseo-users', 'ttseo_render_users' );
	}
}, 60 );

/* =========================================================================
 * HANDLERS — mọi thao tác đều cần manage_options + mở khóa cổng mật khẩu riêng,
 * giống hệt các phân hệ khác của SEO Console.
 * ========================================================================= */
add_action( 'admin_init', function () {
	if ( ! current_user_can( 'manage_options' ) || ! function_exists( 'ttseo_is_unlocked' ) || ! ttseo_is_unlocked() ) {
		return;
	}
	require_once ABSPATH . 'wp-admin/includes/user.php';
	$roles = ttseo_users_assignable_roles();

	/* ---------- Tạo tài khoản mới ---------- */
	if ( isset( $_POST['ttseo_user_create'] ) ) {
		check_admin_referer( 'ttseo_user_create' );

		$username = sanitize_user( wp_unslash( $_POST['user_login'] ?? '' ), true );
		$email    = sanitize_email( wp_unslash( $_POST['user_email'] ?? '' ) );
		$name     = sanitize_text_field( wp_unslash( $_POST['display_name'] ?? '' ) );
		$role     = sanitize_key( $_POST['role'] ?? '' );
		$can_review = ! empty( $_POST['can_review'] );
		$mode     = 'manual' === ( $_POST['pass_mode'] ?? '' ) ? 'manual' : 'email';
		$manual_pw = (string) ( $_POST['manual_password'] ?? '' );

		$err = '';
		if ( '' === $username || ! validate_username( $username ) ) {
			$err = ttseo_t( 'Tên đăng nhập không hợp lệ.', 'Invalid username.' );
		} elseif ( username_exists( $username ) ) {
			$err = ttseo_t( 'Tên đăng nhập đã tồn tại.', 'This username already exists.' );
		} elseif ( ! is_email( $email ) ) {
			$err = ttseo_t( 'Email không hợp lệ.', 'Invalid email.' );
		} elseif ( email_exists( $email ) ) {
			$err = ttseo_t( 'Email này đã có tài khoản.', 'This email already has an account.' );
		} elseif ( ! isset( $roles[ $role ] ) ) {
			$err = ttseo_t( 'Vai trò không hợp lệ.', 'Invalid role.' );
		} elseif ( 'manual' === $mode && mb_strlen( $manual_pw ) < 8 ) {
			$err = ttseo_t( 'Mật khẩu tự đặt cần tối thiểu 8 ký tự.', 'The manual password must be at least 8 characters.' );
		} elseif ( TTSEO_ROLE === $role && function_exists( 'ttseo_can_add_user' ) && ! ttseo_can_add_user() ) {
			$err = ttseo_t(
				'Bản Free chỉ được tạo tối đa ' . TTSEO_FREE_USER_LIMIT . ' tài khoản "Người dùng SEO Dashboard". Nâng cấp Pro để tạo không giới hạn.',
				'The Free plan allows up to ' . TTSEO_FREE_USER_LIMIT . ' "SEO Dashboard User" account(s). Upgrade to Pro for unlimited accounts.'
			);
		}

		if ( '' === $err ) {
			$password = 'manual' === $mode ? $manual_pw : wp_generate_password( 16, true );
			$user_id  = wp_insert_user( array(
				'user_login'   => $username,
				'user_email'   => $email,
				'user_pass'    => $password,
				'display_name' => $name ?: $username,
				'role'         => $role,
			) );
			if ( is_wp_error( $user_id ) ) {
				$err = $user_id->get_error_message();
			} else {
				if ( 'email' === $mode ) {
					wp_new_user_notification( $user_id, null, 'user' ); // chỉ gửi link đặt mật khẩu cho user, không lộ mật khẩu ngẫu nhiên
				}
				if ( $can_review ) {
					ttseo_users_set_reviewer( $email, true );
				}
				wp_safe_redirect( admin_url( 'admin.php?page=ttseo-users&created=1' ) );
				exit;
			}
		}
		set_transient( 'ttseo_users_err', $err, 60 );
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-users&err=1' ) );
		exit;
	}

	/* ---------- Đổi vai trò ---------- */
	if ( isset( $_POST['ttseo_user_role'], $_POST['user_id'] ) ) {
		check_admin_referer( 'ttseo_user_role' );
		$uid  = (int) $_POST['user_id'];
		$role = sanitize_key( $_POST['role'] ?? '' );
		if ( isset( $roles[ $role ] ) ) {
			if ( $uid === get_current_user_id() && 'administrator' !== $role ) {
				set_transient( 'ttseo_users_err', ttseo_t( 'Không thể tự hạ quyền tài khoản đang đăng nhập.', 'You cannot downgrade the account you are currently logged in as.' ), 60 );
			} elseif ( 'administrator' !== $role && ttseo_users_is_last_admin( $uid ) ) {
				set_transient( 'ttseo_users_err', ttseo_t( 'Đây là quản trị viên (Administrator) duy nhất — không thể hạ quyền.', 'This is the last Administrator — cannot downgrade.' ), 60 );
			} else {
				$user = new WP_User( $uid );
				$user->set_role( $role );
			}
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-users&updated=1' ) );
		exit;
	}

	/* ---------- Bật/tắt quyền duyệt bài SEO ---------- */
	if ( isset( $_GET['ttseo_user_review'], $_GET['email'] ) ) {
		check_admin_referer( 'ttseo_user_review' );
		ttseo_users_set_reviewer( sanitize_email( wp_unslash( $_GET['email'] ) ), '1' === $_GET['ttseo_user_review'] );
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-users&updated=1' ) );
		exit;
	}

	/* ---------- Đặt mật khẩu mới (admin tự gõ) ---------- */
	if ( isset( $_POST['ttseo_user_setpass'], $_POST['user_id'] ) ) {
		check_admin_referer( 'ttseo_user_setpass' );
		$uid = (int) $_POST['user_id'];
		$pw  = (string) ( $_POST['new_password'] ?? '' );
		if ( get_userdata( $uid ) && mb_strlen( $pw ) >= 8 ) {
			wp_set_password( $pw, $uid );
			// wp_set_password hủy hết session hiện tại của user đó (kể cả đang đăng nhập) — đúng ý đồ bảo mật.
			wp_safe_redirect( admin_url( 'admin.php?page=ttseo-users&pwset=1' ) );
		} else {
			set_transient( 'ttseo_users_err', ttseo_t( 'Mật khẩu cần tối thiểu 8 ký tự.', 'The password must be at least 8 characters.' ), 60 );
			wp_safe_redirect( admin_url( 'admin.php?page=ttseo-users&err=1' ) );
		}
		exit;
	}

	/* ---------- Gửi email đặt lại mật khẩu ---------- */
	if ( isset( $_GET['ttseo_user_sendreset'], $_GET['id'] ) ) {
		check_admin_referer( 'ttseo_user_sendreset' );
		$user   = get_userdata( (int) $_GET['id'] );
		$failed = true;
		if ( $user ) {
			$res    = ttseo_users_send_reset_email( $user );
			$failed = is_wp_error( $res );
			if ( $failed ) {
				set_transient( 'ttseo_users_err', $res->get_error_message(), 60 );
			}
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-users&' . ( $failed ? 'err=1' : 'reset_sent=1' ) ) );
		exit;
	}

	/* ---------- Xóa tài khoản ---------- */
	if ( isset( $_GET['ttseo_user_delete'], $_GET['id'] ) ) {
		check_admin_referer( 'ttseo_user_delete' );
		$uid = (int) $_GET['id'];
		if ( $uid === get_current_user_id() ) {
			set_transient( 'ttseo_users_err', ttseo_t( 'Không thể tự xóa tài khoản đang đăng nhập.', 'You cannot delete the account you are currently logged in as.' ), 60 );
		} elseif ( ttseo_users_is_last_admin( $uid ) ) {
			set_transient( 'ttseo_users_err', ttseo_t( 'Đây là quản trị viên (Administrator) duy nhất — không thể xóa.', 'This is the last Administrator — cannot delete.' ), 60 );
		} else {
			$u = get_userdata( $uid );
			wp_delete_user( $uid ); // reassign mặc định: chuyển nội dung của user này thành không gán tác giả
			if ( $u ) {
				ttseo_users_set_reviewer( $u->user_email, false );
			}
		}
		wp_safe_redirect( admin_url( 'admin.php?page=ttseo-users&' . ( get_transient( 'ttseo_users_err' ) ? 'err=1' : 'deleted=1' ) ) );
		exit;
	}
} );

/** Thêm/bỏ 1 email khỏi danh sách client_emails (option ttseo_settings) — dùng chung với Cài đặt kết nối. */
function ttseo_users_set_reviewer( $email, $add ) {
	$email = strtolower( trim( $email ) );
	if ( ! $email ) {
		return;
	}
	$o    = get_option( 'ttseo_settings', array() );
	$list = array_filter( array_map( 'trim', explode( "\n", (string) ( $o['client_emails'] ?? '' ) ) ) );
	$list = array_filter( $list, function ( $e ) use ( $email ) { return strtolower( $e ) !== $email; } );
	if ( $add ) {
		$list[] = $email;
	}
	$o['client_emails'] = implode( "\n", array_unique( $list ) );
	update_option( 'ttseo_settings', $o );
}

/* =========================================================================
 * TRANG NGƯỜI DÙNG & PHÂN QUYỀN
 * ========================================================================= */
function ttseo_render_users() {
	if ( function_exists( 'ttseo_is_unlocked' ) && ! ttseo_is_unlocked() ) {
		ttseo_render_gate();
		return;
	}
	ttseo_styles();
	$roles          = ttseo_users_assignable_roles();
	$reviewer_emails = function_exists( 'ttseo_art_client_emails' ) ? ttseo_art_client_emails() : array();

	echo '<div class="wrap ttseo-wrap">';
	ttseo_brand_header();
	echo '<h1>👤 ' . esc_html( ttseo_t( 'Người dùng & Phân quyền', 'Users & Permissions' ) ) . '</h1>';
	echo '<p class="ttseo-subtle" style="margin-left:0;">' . esc_html( ttseo_t(
		'Tạo tài khoản, đổi mật khẩu, đổi vai trò và cấp/thu quyền duyệt bài SEO (dùng ở "Soạn & Duyệt bài SEO") ngay tại đây — không cần vào màn hình Users gốc của WordPress.',
		'Create accounts, change passwords, change roles, and grant/revoke SEO content approval rights (used in "SEO Content & Approval") right here — no need to visit WordPress\'s native Users screen.'
	) ) . '</p>';

	$notices = array(
		'created'    => array( 'success', ttseo_t( 'Đã tạo tài khoản mới.', 'New account created.' ) ),
		'updated'    => array( 'success', ttseo_t( 'Đã cập nhật.', 'Updated.' ) ),
		'pwset'      => array( 'success', ttseo_t( 'Đã đặt mật khẩu mới cho tài khoản.', 'New password set for the account.' ) ),
		'reset_sent' => array( 'success', ttseo_t( 'Đã gửi email đặt lại mật khẩu.', 'Password reset email sent.' ) ),
		'deleted'    => array( 'success', ttseo_t( 'Đã xóa tài khoản.', 'Account deleted.' ) ),
	);
	foreach ( $notices as $k => $n ) {
		if ( isset( $_GET[ $k ] ) ) {
			echo '<div class="notice notice-' . esc_attr( $n[0] ) . ' is-dismissible"><p>' . esc_html( $n[1] ) . '</p></div>';
		}
	}
	if ( isset( $_GET['err'] ) ) {
		$msg = get_transient( 'ttseo_users_err' );
		delete_transient( 'ttseo_users_err' );
		echo '<div class="notice notice-error is-dismissible"><p>⚠️ ' . esc_html( $msg ?: ttseo_t( 'Có lỗi xảy ra.', 'An error occurred.' ) ) . '</p></div>';
	}

	if ( empty( ttseo_art_client_emails() ) ) {
		echo '<div class="notice notice-warning inline"><p>⚠️ ' . esc_html( ttseo_t(
			'Chưa cấp quyền duyệt bài SEO cho ai — theo cấu hình hiện tại, mọi tài khoản có quyền truy cập đều đang duyệt được bài (xem ghi chú ở Cài đặt kết nối). Bật cột "Quyền duyệt bài SEO" bên dưới cho đúng người để giới hạn chặt hơn.',
			'No one has content approval rights yet — under the current configuration, any account with dashboard access can approve posts (see the note in Connection Settings). Enable the "SEO content approval rights" column below for the right people to tighten this.'
		) ) . '</p></div>';
	}

	/* ---------- Thống kê nhanh ---------- */
	$all_users = get_users( array( 'orderby' => 'registered', 'order' => 'DESC' ) );
	$admin_ct  = count( get_users( array( 'role' => 'administrator', 'fields' => 'ID' ) ) );
	echo '<div class="ttseo-strip">';
	ttseo_kpi( ttseo_t( 'Tổng tài khoản', 'Total accounts' ), (string) count( $all_users ), ttseo_t( 'toàn site', 'site-wide' ), '#1f5c93' );
	ttseo_kpi( 'Administrator', (string) $admin_ct, ttseo_t( 'có toàn quyền wp-admin', 'full wp-admin access' ), '#c77d16' );
	ttseo_kpi( ttseo_t( 'Có quyền duyệt bài SEO', 'Has SEO approval rights' ), (string) count( $reviewer_emails ), ttseo_t( 'trong Soạn & Duyệt bài SEO', 'in SEO Content & Approval' ), '#1a7f5a' );
	echo '</div>';

	/* ---------- Form tạo tài khoản ---------- */
	echo '<h2 class="ttseo-sec" style="--b:#1a7f5a;">＋ ' . esc_html( ttseo_t( 'Tạo tài khoản mới', 'Create new account' ) ) . '</h2>';
	if ( ! ttseo_is_pro() ) {
		$used = count( get_users( array( 'role' => TTSEO_ROLE, 'fields' => 'ID' ) ) );
		echo '<p class="ttseo-subtle" style="margin-left:0;">' . esc_html( sprintf(
			ttseo_t( 'Bản Free: %1$d/%2$d tài khoản "Người dùng SEO Dashboard" đã dùng.', 'Free plan: %1$d/%2$d "SEO Dashboard User" account(s) used.' ),
			$used, TTSEO_FREE_USER_LIMIT
		) ) . ' <a href="https://sunreaches.com/seo-console/pricing" target="_blank" rel="noopener">' . esc_html( ttseo_t( 'Nâng cấp Pro để không giới hạn →', 'Upgrade to Pro for unlimited →' ) ) . '</a></p>';
	}
	echo '<form method="post" style="background:#fff;border:1px solid #dcdfe3;border-radius:8px;padding:16px 18px;max-width:820px;">';
	wp_nonce_field( 'ttseo_user_create' );
	echo '<table class="form-table">';
	echo '<tr><th>' . esc_html( ttseo_t( 'Tên đăng nhập', 'Username' ) ) . '</th><td><input type="text" name="user_login" class="regular-text" required autocomplete="off"></td></tr>';
	echo '<tr><th>' . esc_html( ttseo_t( 'Họ tên hiển thị', 'Display name' ) ) . '</th><td><input type="text" name="display_name" class="regular-text"></td></tr>';
	echo '<tr><th>Email</th><td><input type="email" name="user_email" class="regular-text" required></td></tr>';
	echo '<tr><th>' . esc_html( ttseo_t( 'Vai trò', 'Role' ) ) . '</th><td><select name="role">';
	foreach ( $roles as $slug => $label ) {
		echo '<option value="' . esc_attr( $slug ) . '"' . selected( 'administrator', $slug, false ) . '>' . esc_html( $label ) . '</option>';
	}
	echo '</select><p class="description">' . esc_html( sprintf(
		ttseo_t(
			'Chọn "Người dùng SEO Dashboard" để tạo tài khoản chỉ vào được SEO Console (không thấy Users/Plugins/Settings gốc của WordPress) — hợp cho coder/content creator ngoài chỉ cần làm SEO. Bản Free giới hạn %d tài khoản dạng này; Administrator thì có toàn quyền wp-admin và luôn vào được SEO Console.',
			'Choose "SEO Dashboard User" to create an account that can only access the SEO Console (no WordPress Users/Plugins/Settings) — good for an external coder/content creator who only needs to do SEO work. The Free plan limits this to %d such account(s); Administrator has full wp-admin access and always sees the SEO Console.'
		), TTSEO_FREE_USER_LIMIT
	) ) . '</p></td></tr>';
	echo '<tr><th>' . esc_html( ttseo_t( 'Quyền duyệt bài SEO', 'SEO content approval rights' ) ) . '</th><td><label><input type="checkbox" name="can_review" value="1"> ' . esc_html( ttseo_t( 'Cấp quyền Duyệt/Yêu cầu chỉnh sửa ở "Soạn & Duyệt bài SEO" (thêm email vào danh sách người duyệt)', 'Grant Approve/Request changes rights in "SEO Content & Approval" (adds the email to the reviewer list)' ) ) . '</label></td></tr>';
	echo '<tr><th>' . esc_html( ttseo_t( 'Mật khẩu', 'Password' ) ) . '</th><td>';
	echo '<label style="display:block;margin-bottom:6px;"><input type="radio" name="pass_mode" value="email" checked onchange="document.getElementById(\'ttseo-manual-pw\').style.display=\'none\'"> ' . esc_html( ttseo_t( 'Gửi email cho người dùng tự đặt mật khẩu (khuyến nghị)', 'Email the user to set their own password (recommended)' ) ) . '</label>';
	echo '<label style="display:block;"><input type="radio" name="pass_mode" value="manual" onchange="document.getElementById(\'ttseo-manual-pw\').style.display=\'block\'"> ' . esc_html( ttseo_t( 'Tự đặt mật khẩu ngay', 'Set the password myself now' ) ) . '</label>';
	echo '<div id="ttseo-manual-pw" style="display:none;margin-top:8px;"><input type="text" name="manual_password" class="regular-text" placeholder="' . esc_attr( ttseo_t( 'Tối thiểu 8 ký tự', 'At least 8 characters' ) ) . '" autocomplete="new-password"></div>';
	echo '</td></tr>';
	echo '</table>';
	echo '<p><button class="button button-primary" name="ttseo_user_create" value="1">' . esc_html( ttseo_t( 'Tạo tài khoản', 'Create account' ) ) . '</button></p>';
	echo '</form>';

	/* ---------- Danh sách tài khoản ---------- */
	echo '<h2 class="ttseo-sec" style="--b:#1f5c93;">' . esc_html( ttseo_t( 'Danh sách tài khoản', 'Account list' ) ) . '</h2>';
	echo '<div class="ttseo-table"><table><thead><tr><th>' . esc_html( ttseo_t( 'Tài khoản', 'Account' ) ) . '</th><th>' . esc_html( ttseo_t( 'Vai trò', 'Role' ) ) . '</th><th>' . esc_html( ttseo_t( 'Quyền duyệt bài SEO', 'SEO approval rights' ) ) . '</th><th>' . esc_html( ttseo_t( 'Đăng nhập gần nhất', 'Last login' ) ) . '</th><th>' . esc_html( ttseo_t( 'Thao tác', 'Actions' ) ) . '</th></tr></thead><tbody>';
	foreach ( $all_users as $u ) {
		$is_reviewer = in_array( strtolower( $u->user_email ), $reviewer_emails, true );
		$last_login  = get_user_meta( $u->ID, 'ttseo_last_login', true );
		$primary_role = $u->roles[0] ?? '';

		echo '<tr><td><b>' . esc_html( $u->display_name ) . '</b><br><span style="color:#8a8f94;font-size:11.5px;">@' . esc_html( $u->user_login ) . ' · ' . esc_html( $u->user_email ) . '</span></td>';

		echo '<td>';
		if ( isset( $roles[ $primary_role ] ) ) {
			echo '<form method="post" style="display:flex;gap:6px;align-items:center;">';
			wp_nonce_field( 'ttseo_user_role' );
			echo '<input type="hidden" name="user_id" value="' . (int) $u->ID . '">';
			echo '<select name="role" style="font-size:12px;">';
			foreach ( $roles as $slug => $label ) {
				echo '<option value="' . esc_attr( $slug ) . '"' . selected( $primary_role, $slug, false ) . '>' . esc_html( $label ) . '</option>';
			}
			echo '</select>';
			echo '<button class="button" name="ttseo_user_role" value="1" style="font-size:11px;padding:0 8px;">' . esc_html( ttseo_t( 'Cập nhật', 'Update' ) ) . '</button>';
			echo '</form>';
		} else {
			echo '<span style="color:#8a8f94;font-size:12px;">' . esc_html( $primary_role ?: '—' ) . ' (' . esc_html( ttseo_t( 'vai trò khác', 'other role' ) ) . ')</span>';
		}
		echo '</td>';

		echo '<td>';
		$toggle_url = wp_nonce_url( admin_url( 'admin.php?page=ttseo-users&ttseo_user_review=' . ( $is_reviewer ? '0' : '1' ) . '&email=' . rawurlencode( $u->user_email ) ), 'ttseo_user_review' );
		if ( $is_reviewer ) {
			echo '<span style="color:#1a7f5a;font-weight:700;font-size:12px;">✔ ' . esc_html( ttseo_t( 'Có quyền', 'Has rights' ) ) . '</span><br><a href="' . esc_url( $toggle_url ) . '" style="font-size:11px;">' . esc_html( ttseo_t( 'Thu hồi', 'Revoke' ) ) . '</a>';
		} else {
			echo '<span style="color:#8a8f94;font-size:12px;">' . esc_html( ttseo_t( 'Không', 'No' ) ) . '</span><br><a href="' . esc_url( $toggle_url ) . '" style="font-size:11px;">' . esc_html( ttseo_t( 'Cấp quyền', 'Grant' ) ) . '</a>';
		}
		echo '</td>';

		echo '<td style="color:#8a8f94;font-size:11.5px;">' . ( $last_login ? esc_html( mysql2date( 'd/m/Y H:i', $last_login ) ) : esc_html( ttseo_t( 'Chưa đăng nhập lần nào', 'Never logged in' ) ) ) . '</td>';

		echo '<td style="min-width:230px;">';
		echo '<details><summary style="cursor:pointer;font-size:11.5px;color:#1f5c93;">⚙ ' . esc_html( ttseo_t( 'Quản lý', 'Manage' ) ) . '</summary>';
		echo '<div style="margin-top:8px;display:grid;gap:8px;">';

		// Đặt mật khẩu mới
		echo '<form method="post" style="display:flex;gap:6px;">';
		wp_nonce_field( 'ttseo_user_setpass' );
		echo '<input type="hidden" name="user_id" value="' . (int) $u->ID . '">';
		echo '<input type="text" name="new_password" class="small-text" style="width:140px;" placeholder="' . esc_attr( ttseo_t( 'Mật khẩu mới (≥8 ký tự)', 'New password (≥8 chars)' ) ) . '" autocomplete="new-password">';
		echo '<button class="button" name="ttseo_user_setpass" value="1" style="font-size:11px;" onclick="return confirm(\'' . esc_js( ttseo_t( 'Đặt mật khẩu mới cho tài khoản này? Các phiên đăng nhập hiện tại của họ sẽ bị đăng xuất.', 'Set a new password for this account? Their current login sessions will be logged out.' ) ) . '\')">' . esc_html( ttseo_t( 'Đặt mật khẩu', 'Set password' ) ) . '</button>';
		echo '</form>';

		// Gửi email đặt lại
		$reset_url = wp_nonce_url( admin_url( 'admin.php?page=ttseo-users&ttseo_user_sendreset=1&id=' . $u->ID ), 'ttseo_user_sendreset' );
		echo '<a href="' . esc_url( $reset_url ) . '" class="button" style="font-size:11px;text-align:center;">✉ ' . esc_html( ttseo_t( 'Gửi email đặt lại mật khẩu', 'Send password reset email' ) ) . '</a>';

		// Xóa
		if ( $u->ID !== get_current_user_id() ) {
			$del_url = wp_nonce_url( admin_url( 'admin.php?page=ttseo-users&ttseo_user_delete=1&id=' . $u->ID ), 'ttseo_user_delete' );
			echo '<a href="' . esc_url( $del_url ) . '" style="font-size:11px;color:#c0392b;" onclick="return confirm(\'' . esc_js( ttseo_t( 'Xóa vĩnh viễn tài khoản này?', 'Permanently delete this account?' ) ) . '\')">🗑 ' . esc_html( ttseo_t( 'Xóa tài khoản', 'Delete account' ) ) . '</a>';
		}
		echo '</div></details>';
		echo '</td></tr>';
	}
	echo '</tbody></table></div>';
	echo '<p class="ttseo-subtle">' . esc_html( ttseo_t(
		'"Quyền duyệt bài SEO" chính là danh sách email cấu hình ở Cài đặt kết nối → mục Soạn & Duyệt bài SEO — thay đổi ở đây sẽ đồng bộ hai chiều với màn hình đó.',
		'"SEO content approval rights" is the same email list configured in Connection Settings → SEO Content & Approval — changes here sync both ways with that screen.'
	) ) . '</p>';

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