<?php
declare(strict_types=1);

/**
 * ============================================================
 *  お問い合わせフォーム（簡易版）  -  公開POST受け口（PRG方式）
 * ------------------------------------------------------------
 *  contact-form パーツからの POST を処理し、元ページへリダイレクト（?sent=1）。
 *  JS不要で動作（防御はサーバー側＝CSRF＋署名付き時間ゲート＋ハニーポット＋連投制限）。
 * ============================================================ */

require_once dirname(dirname(__DIR__)) . '/config.php';
require_once CMS_CORE . '/frame.php'; // プラグイン読み込み（formlite_* 関数が使える）

function formlite_redirect_back(string $back, bool $sent = false): void {
    $url = formlite_safe_back($back);
    if ($sent) { $url .= (strpos($url, '?') === false ? '?' : '&') . 'sent=1'; }
    // 送信結果（お礼・入力エラー）が画面の外に出ないよう、フォームがあった位置へ戻す。
    // ページ下部やLPの末尾にフォームを置くと、ページ先頭に戻されて
    // 「送れたのかどうか分からない」状態になるため。
    $anchor = (string)preg_replace('/[^A-Za-z0-9_-]/', '', (string)($_POST['_anchor'] ?? ''));
    if ($anchor !== '') $url .= '#' . $anchor;
    header('Location: ' . $url, true, 303);
    exit;
}

$back = (string)($_POST['_back'] ?? ($_SERVER['HTTP_REFERER'] ?? '/'));

if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') {
    header('Location: ' . url('/'), true, 303);
    exit;
}

// 1) CSRF
if (!csrf_check((string)($_POST['_csrf'] ?? ''))) {
    $_SESSION['formlite_flash'] = ['formError' => 'ページの有効期限が切れた可能性があります。'];
    formlite_redirect_back($back);
}
// 2) 署名付き時間ゲート（表示から最低4秒）
if (!formlite_ts_ok((string)($_POST['_ts'] ?? ''), 4)) {
    $_SESSION['formlite_flash'] = ['formError' => '送信が速すぎるか、ページが古くなっています。もう一度お試しください。'];
    formlite_redirect_back($back);
}
// 3) ハニーポット：埋まっていたらボット。成功に見せて何もしない。
$hp = trim((string)($_POST[formlite_honeypot_name()] ?? ''));
if ($hp !== '') {
    formlite_redirect_back($back, true);
}
// 4) IP/サブネット連投制限
if (!formlite_rate_ok()) {
    $_SESSION['formlite_flash'] = ['formError' => '短時間に連続して送信されたため、一時的に受付を制限しています。しばらくおいてお試しください。'];
    formlite_redirect_back($back);
}
// 5) バリデーション
[$errors, $values] = formlite_validate($_POST);
if ($errors) {
    $_SESSION['formlite_flash'] = ['errors' => $errors, 'old' => $values];
    formlite_redirect_back($back);
}
// 6) 送信（通知メール）。失敗したらユーザーに通知（簡易版は受信箱保存が無いため取りこぼし防止）。
if (!formlite_send_mail($values)) {
    $_SESSION['formlite_flash'] = ['formError' => '送信処理に失敗しました。お手数ですが時間をおいて再度お試しください。', 'old' => $values];
    formlite_redirect_back($back);
}
// 7) 自動返信（任意）
formlite_send_autoreply($values);

formlite_redirect_back($back, true);
