<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class ManagementMiddleware
{
    /**
     * リクエストから運営元コードを取得し、DBから運営元情報を検証・セッションに保存する。
     * 運営元コードがない場合やDBに存在しない場合は404を返す。
     * 
     * @param Request $request 受信したHTTPリクエスト
     * @param Closure $next 次のミドルウェア処理
     * @return mixed 次の処理のレスポンス
     * @throws \Symfony\Component\HttpKernel\Exception\HttpException 運営元コードが見つからない場合
     */
    public function handle(Request $request, Closure $next): mixed
    {
        // マルチテナント対応のため、URLの最初のセグメントを運営元コードとして扱う
        $path = $request->getPathInfo();  // パス全体を取得
        $segments = explode('/', trim($path, '/'));  // '/'で分割
        $managementCode = $segments[0] ?? null;  // 最初の部分を運営元コードとする

        if (!$managementCode) {
            // 不正アクセス防止のため、エラーログでシステム例外を記録
            Log::error("[ERROR] " . now()->format('Y-m-d H:i:s') . " 運営元コードが見つからない: " . $request->getPathInfo());
            abort(404, '運営元コードが見つかりません');
        }

        // 運営元コードの正当性検証のため、DBで存在確認
        $management = DB::table('management')
            ->where('management_code', $managementCode)
            ->where('valid_flag', 1)  // 有効フラグが1の場合のみ
            ->first();

        if (!$management) {
            // 不正アクセス防止のため、エラーログでシステム例外を記録
            Log::error("[ERROR] " . now()->format('Y-m-d H:i:s') . " 運営元が見つからない: " . $managementCode);
            abort(404, '運営元が見つかりません');
        }

        // システム操作追跡のため、成功した運営元取得を記録
        Log::info("[INFO] " . now()->format('Y-m-d H:i:s') . " 運営元コード取得成功: " . $managementCode);

        // 運営元情報を他の処理で利用可能にするため、セッションに保存
        session(['management' => $management]);

        return $next($request);
    }
}
