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

/***** 20250623 ログインログの記録機能を追加するため、コード改変 *****/
/***** $haup_math_error_occuredというグローバル関数を定義 *****/

/***** ログインフォームに足し算を追加 *****/
/* ランダムな足し算の問題を生成 */
function haup_generate_math_problem() {
	$num1 = wp_rand(1, 10);
	$num2 = wp_rand(1, 10);
	$answer = $num1 + $num2;
	$token = base64_encode($answer);

	return [
		'problem' => "$num1 + $num2 = ?",
		'token' => $token,
	];
}

/* ログインフォームに計算問題を追加 */
function haup_add_math_problem_to_login() {
	$math_data = haup_generate_math_problem();
	$nonce = wp_create_nonce('haup_login_math_nonce'); // Nonceの生成
	
	$title = __('Calculation Problems: ','hima-art-utility');

	echo '<p>';
	echo '<label for="haup_math_answer">' . esc_html($title) . esc_html($math_data['problem']) . '</label><br />';
	echo '<input type="hidden" name="haup_math_token" value="' . esc_attr($math_data['token']) . '" />';
	echo '<input type="hidden" name="haup_login_math_nonce" value="' . esc_attr($nonce) . '" />';
	echo '<input type="text" name="haup_math_answer" id="haup_math_answer" required pattern="[0-9]*" inputmode="numeric" />';
	echo '</p>';
}
add_action('login_form', 'haup_add_math_problem_to_login');

/* 回答のチェック */
/* 計算に失敗したときに管理者にメールを送信 */
function haup_check_math_answer($user, $username, $password) {
    // グローバル変数としてエラーフラグを定義
    global $haup_math_error_occured;
    $haup_math_error_occured = false; // デフォルトはfalse

	$nonce_error_text = __('Invalid request','hima-art-utility');

	// Nonceまたは計算問題のPOSTデータがない場合は、この認証ロジックをスキップし、後続の認証を継続させる
    // これにより、ログインフォームが表示されただけの時にwp_login_failedが発火するのを防ぐ
    if (!isset($_POST['haup_login_math_nonce']) || !isset($_POST['haup_math_answer']) || !isset($_POST['haup_math_token'])) {
        return $user;
    }

	$nonce = sanitize_text_field(wp_unslash($_POST['haup_login_math_nonce']));

	if (empty($nonce) || !wp_verify_nonce($nonce, 'haup_login_math_nonce')) {
        $haup_math_error_occured = true; // Nonceエラーも計算問題のエラーとみなす
		return new WP_Error('nonce_error', esc_html($nonce_error_text));
	}


	// トークンとユーザーの回答の検証
	// このif文は、上記のnonceチェックと`return $user`でカバーされるため、実質的には常にtrueになるが、
	// コードの意図を明確にするために残しておく
	if (isset($_POST['haup_math_answer']) && isset($_POST['haup_math_token'])) {
		$token = sanitize_text_field(wp_unslash($_POST['haup_math_token']));
		$expected_answer = base64_decode($token);

		$input_answer = intval(wp_unslash($_POST['haup_math_answer']));

		if ($input_answer != $expected_answer) {
            $haup_math_error_occured = true; // 計算問題エラーが発生したことを記録

			// メール送信処理
			$locale = get_locale();
			switch_to_locale($locale);

			$sub_text = __('There may have been an unauthorized login attempt.','hima-art-utility');
			$message_text = __('Did you make a mistake in the answer to the calculation question when logging in? If you do not remember this, there may be an unauthorized login.','hima-art-utility');
			$error_text = __('The answer to the math problem is incorrect.','hima-art-utility');


			$admin_email = get_option('admin_email');
			$subject = apply_filters('haup_math_error_mail_subject_filter' ,esc_html($sub_text));
			$message = apply_filters('haup_math_error_mail_message_filter' ,esc_html($message_text));

			wp_mail($admin_email, $subject, $message);

			restore_previous_locale();

			return new WP_Error('haup_math_error', esc_html($error_text));
		}
	}

	return $user;
}
add_filter('authenticate', 'haup_check_math_answer', 30, 3);