<?php if ( !defined( 'ABSPATH' ) ) exit;//PHPの宣言と直接アクセスの拒否

/* https://ume-noki.com/wordpress-login-history-monitoring/を参考にGeminiと対話して完成 */
/***** ログイン状況に履歴を保存 *****/
function haup_record_login_success($user_login, $user) {
	if (!is_a($user, 'WP_User')) {
		return; // 念のためWP_Userオブジェクトか確認
	}

	if(isset( $_SERVER['REMOTE_ADDR'] )){
		$ip_address = sanitize_text_field(wp_unslash($_SERVER['REMOTE_ADDR']));
	}else{
		$ip_address = '';
	}

	if(isset( $_SERVER['HTTP_USER_AGENT'] )){
		$user_agent = sanitize_text_field(wp_unslash($_SERVER['HTTP_USER_AGENT']));
	}else{
		$user_agent = '';
	}

	$time = current_time('mysql' , 1);

	$logins = get_option('haup_custom_login_logs', []);

	if (!is_array($logins)) {
		$logins = [];
	}

	$logins[] = [
		'user'       => $user_login,
		'ip'         => $ip_address,
		'user_agent' => $user_agent,
		'time'       => $time,
		'status'     => 'success'
	];

	// 最大50件まで保存
	if (count($logins) > 50) {
		array_shift($logins);
	}

	update_option('haup_custom_login_logs', $logins);
}
add_action('wp_login', 'haup_record_login_success', 10, 2);

// ログイン失敗時に履歴を保存（計算問題エラーも含む）
function haup_record_login_failure_custom($username) {
	// 計算問題認証がエラーを発生させたかどうかを確認
	global $haup_math_error_occured;
	$status_text = 'fault'; // デフォルトの失敗ステータス

	if (isset($haup_math_error_occured) && $haup_math_error_occured === true) {
		$status_text = 'mathfault'; // 計算問題による失敗の場合
	}

	if(isset( $_SERVER['REMOTE_ADDR'] )){
		$ip_address = sanitize_text_field(wp_unslash($_SERVER['REMOTE_ADDR']));
	}else{
		$ip_address = '';
	}

	if(isset( $_SERVER['HTTP_USER_AGENT'] )){
		$user_agent = sanitize_text_field(wp_unslash($_SERVER['HTTP_USER_AGENT']));
	}else{
		$user_agent = '';
	}

	$time = current_time('mysql' , 1);

	$logins = get_option('haup_custom_login_logs', []);

	if (!is_array($logins)) {
		$logins = [];
	}

	$logins[] = [
		'user'       => $username, // wp_login_failedから渡されるユーザー名
		'ip'         => $ip_address,
		'user_agent' => $user_agent,
		'time'       => $time,
		'status'     => $status_text // 計算問題の失敗かどうかに応じてステータスを設定
	];

	if (count($logins) > 50) {
		array_shift($logins);
	}

	update_option('haup_custom_login_logs', $logins);
}
// wp_login_failed はユーザー名しか渡さないので、引数を1に固定
add_action('wp_login_failed', 'haup_record_login_failure_custom', 10, 1);


// 管理画面にログイン履歴表示ページを追加
function haup_add_login_history_submenu() {
	$title = __('Login History','hima-art-utility');
	add_submenu_page(
		'haumenu-admin-page',
		esc_html($title),
		esc_html($title),
		'manage_options',
		'haup-custom-login-history',
		'haup_display_login_history'
	);
}
add_action('admin_menu', 'haup_add_login_history_submenu');

// ログ削除処理
// admin-post.phpを利用し、POSTリクエストで安全に処理
function haup_handle_clear_login_logs() {
	// 適切な権限チェック
	if (!current_user_can('manage_options')) {
		wp_die(esc_html__('You do not have permission to access this page.','hima-art-utility'));
	}

	// ノンス（nonce）検証
	if (!isset($_POST['_wpnonce_clear_logs']) || !wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['_wpnonce_clear_logs'])), 'clear_login_logs_nonce')) {
		wp_die(esc_html__('Nonce verification failed.','hima-art-utility'));
	}

	// オプションを削除
	delete_option('haup_custom_login_logs');

	// 成功メッセージをトランジェントに保存
	set_transient('haup_logs_cleared_notice', '1', 30);

	// ログ削除後にリダイレクト
	wp_safe_redirect(admin_url('admin.php?page=haup-custom-login-history'));

	exit;
}
// フォームのaction="clear_logs"に対応
add_action('admin_post_clear_logs', 'haup_handle_clear_login_logs');

// 管理画面のログイン履歴ページの内容
function haup_display_login_history() {
	if (!current_user_can('manage_options')) {
		return;
	}

	//文字列の設定
	$title = __('HA Utility Login History','hima-art-utility');
	$log_deleted_title = __('Login history has been deleted','hima-art-utility');
	$description = __('Login attempt history (up to the last 50 attempts are displayed)','hima-art-utility');
	$clear_button_title = __('Clear Log','hima-art-utility');
	$clear_confirm = __('Do you really want to clear all login history? This action cannot be undone.','hima-art-utility');
	$column_1 = __('Username field value','hima-art-utility');
	$column_2 = __('IP address','hima-art-utility');
	$column_3 = __('Device/browser used','hima-art-utility');
	$column_4 = __('Attempt time','hima-art-utility');
	$column_5 = __('result','hima-art-utility');
	$no_log_text = __('There is no login history','hima-art-utility');

	// ログ削除後のメッセージ表示
	if (get_transient('haup_logs_cleared_notice')) {
		delete_transient('haup_logs_cleared_notice');
		echo '<div class="notice notice-success is-dismissible"><p>'.esc_html($log_deleted_title).'</p></div>';
	}

	//optionsテーブルから情報を取得
	$logins = get_option('haup_custom_login_logs', []);

	//ログリストの出力
	echo '<div class="wrap">';
	echo '<h1 style="margin-bottom:14px;">'.esc_html($title).'</h1>';
	echo '<p>'.esc_html($description).'</p>';

	// ログをクリアするためのボタンを追加
	echo '<form method="post" action="' . esc_url(admin_url('admin-post.php')) . '">';
	echo '<input type="hidden" name="action" value="clear_logs">';
	wp_nonce_field('clear_login_logs_nonce', '_wpnonce_clear_logs');
	echo '<p class="submit">';
	echo '<input type="submit" name="submit" id="submit" class="button button-secondary" value="'.esc_html($clear_button_title).'" onclick="return confirm(\' '.esc_html($clear_confirm).' \');">';
	echo '</p>';
	echo '</form>';
	echo '<table class="widefat striped" cellspacing="0">';
	echo '<thead><tr><th class="ha-log-10">'.esc_html($column_1).'</th><th class="ha-log-10">'.esc_html($column_2).'</th><th>'.esc_html($column_3).'</th><th class="ha-log-10">'.esc_html($column_4).'</th><th class="ha-log-10">'.esc_html($column_5).'</th></tr></thead>';
	echo '<tbody>';

	if (!empty($logins)) {
		foreach (array_reverse($logins) as $log) {
			$status_class = '';

			if ($log['status'] === 'success') {
				$status_class = 'login-success';
				$status_name = __('Success','hima-art-utility');
			} elseif (strpos($log['status'], 'mathfault') !== false) {
				$status_class = 'login-failure-math';
				$status_name = __('Failure(Math Check)','hima-art-utility');
			} else {
				$status_class = 'login-failure';
				$status_name = __('Failure(Others)','hima-art-utility');
			}
			
			echo '<tr>';
			echo '<td>' . esc_html($log['user']) . '</td>';
			echo '<td>' . esc_html($log['ip']) . '</td>';
			echo '<td class="log-device">' . esc_html($log['user_agent']) . '</td>';
			echo '<td>' . esc_html($log['time']) . '</td>';
			echo '<td class="' . esc_attr($status_class) . '">' . esc_html($status_name) . '</td>';
			echo '</tr>';
		}
	} else {
		echo '<tr><td colspan="5">'.esc_html($no_log_text).'</td></tr>';
	}
	echo '</tbody></table></div>';
?>
<style>
	.login-success {
		color: green!important;
		font-weight: 700!important;
	}
	
	.login-failure {
		color: red!important;
		font-weight: 700!important;
	}
	
	.login-failure-math {
		color: orange!important;
		font-weight: 700!important;
	}

	th.ha-log-10 {
		width: 13%;
	}
</style>
<?php
}

/*** ダッシュボードウィジェットにログイン履歴を表示 ***/
/* ダッシュボードウィジェットを登録 */
function haup_add_login_history_dashboard_widget() {
	wp_add_dashboard_widget(
		'haup_login_history_widget', // ウィジェットの一意のID
		__('Login History (Recent 5)', 'hima-art-utility'), // ウィジェットのタイトル
		'haup_display_login_history_dashboard_widget' // ウィジェットの内容を表示するコールバック関数
	);
}
add_action('wp_dashboard_setup', 'haup_add_login_history_dashboard_widget');

/* ダッシュボードウィジェットの内容を表示 */
function haup_display_login_history_dashboard_widget() {
	$logins = get_option('haup_custom_login_logs', []);

	//翻訳可能なテキストを変数化
	$text_nologin = __('No login history yet.', 'hima-art-utility');
	$text_username = __('Username field value', 'hima-art-utility');
	$text_time = __('Attempt time', 'hima-art-utility');
	$text_result = __('Result', 'hima-art-utility');
	$text_success = __('Success','hima-art-utility');
	$text_failure = __('Failure(Math Check)','hima-art-utility');
	$text_failure_o = __('Failure(Others)','hima-art-utility');
	$text_link = __('View All History', 'hima-art-utility');

	if (!is_array($logins) || empty($logins)) {
		echo '<p>' . esc_html($text_nologin) . '</p>';

		return;
	}

	// 最新の5件を取得（配列を逆順にしてから最初の5件を取得）
	$recent_logins = array_slice(array_reverse($logins), 0, 5);

	echo '<table class="widefat fixed striped" cellspacing="0">';
	echo '<thead><tr>';
	echo '<th>' . esc_html($text_username) . '</th>';
	echo '<th>' . esc_html($text_time) . '</th>';
	echo '<th>' . esc_html($text_result) . '</th>';
	echo '</tr></thead>';
	echo '<tbody>';

	foreach ($recent_logins as $log) {
		$status_class = '';

		if ($log['status'] === 'success') {
			$status_class = 'login-success';
			$status_name = esc_html($text_success);
		} elseif (strpos($log['status'], 'mathfault') !== false) {
			$status_class = 'login-failure-math';
			$status_name = esc_html($text_failure);
		} else {
			$status_class = 'login-failure';
			$status_name = esc_html($text_failure_o);
		}

		echo '<tr>';
		echo '<td>' . esc_html($log['user']) . '</td>';
		echo '<td>' . esc_html(wp_date('Y-m-d H:i', strtotime($log['time']))) . '</td>'; // 日付と時刻のフォーマット
		echo '<td class="' . esc_attr($status_class) . '">' . esc_html($status_name) . '</td>';
		echo '</tr>';
	}

	echo '</tbody></table>';

	// 完全な履歴ページへのリンク
	echo '<p><a href="' . esc_url(admin_url('admin.php?page=haup-custom-login-history')) . '" class="haup-dashboard-widget-button">' . esc_html($text_link) . '</a></p>';

// 管理画面用のCSSを再利用
?>
<style>
#haup_login_history_widget .login-success {
	color: green;
	font-weight: 700;
}

#haup_login_history_widget .login-failure {
	color: red;
	font-weight: 700;
}

#haup_login_history_widget .login-failure-math {
	color: orange;
	font-weight: 700;
}
</style>
<?php
}