<?php

namespace Acms\Services\Setup\Http\Middleware;

use Acms\Services\Facades\Application;
use Acms\Services\Facades\Database;
use Acms\Services\Setup\Http\Middleware;
use Acms\Services\Setup\Http\Request;
use Acms\Services\Setup\Http\Response;
use Acms\Services\Setup\SetupSession;
use Exception;

/**
 * setup の実行環境初期化ミドルウェア（旧 AbstractSetup::initialize 相当）。
 *
 * - 一部 MySQL 環境の STRICT モードを避けるため sql_mode を空にリセットする。
 * - setup 専用セッションを開始する。
 * - ネイティブ PHP セッション Cookie を失効させる（setup は独自セッション名で運用するため）。
 *
 * パイプラインの最外（他ミドルウェア・Action より前）に置く。
 */
final class SessionMiddleware implements Middleware
{
    public function __construct(private readonly SetupSession $session)
    {
    }

    public function process(Request $request, callable $next): Response
    {
        try {
            Database::query(['sql' => "SET SESSION sql_mode=''", 'params' => []], 'exec');
        } catch (Exception $e) {
            Application::deleteExceptionStack();
        }

        $this->session->start();
        setcookie(SESSION_NAME, '', time() - 1, '/', (string)($_SERVER['HTTP_HOST'] ?? ''), false, true);

        return $next($request);
    }
}
