<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use App\Services\MenuAccessService;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\DB;

/**
 * メニューアクセス制御データをビューに共有する Middleware
 * 
 * すべてのビューで $isSorin と $visibleCities が利用可能になります。
 * また、nav bar に表示される ハード異常・タスク情報も同時に共有します。
 */
class ShareMenuAccessData
{
    public function handle(Request $request, Closure $next)
    {
        $menuAccessService = app(MenuAccessService::class);

        // メニュー関連データ
        $viewData = [
            'isSorin' => $menuAccessService->isSorin(),
            'visibleCities' => $menuAccessService->visibleCities(),
        ];

        // Nav bar に表示される ハード異常・タスク件数を取得
        if (auth()->check()) {
            // ハード異常（que_class > 99）かつステータスが未対応(1)または進行中(2)
            $hardwareIssues = DB::table('operator_que as oq')
                ->leftJoin('user as u', 'oq.user_id', '=', 'u.user_id')
                ->leftJoin('park as p', 'oq.park_id', '=', 'p.park_id')
                ->select(
                    'oq.que_id', 'oq.que_class', 'oq.que_comment',
                    'oq.created_at', 'oq.updated_at', 'oq.que_status'
                )
                ->where('oq.que_class', '>', 99)
                ->whereIn('oq.que_status', [1, 2])
                ->orderBy('oq.created_at', 'DESC')
                ->limit(5)
                ->get();

            // タスク（que_class < 99）かつステータスが未対応(1)または進行中(2)
            $taskIssues = DB::table('operator_que as oq')
                ->leftJoin('user as u', 'oq.user_id', '=', 'u.user_id')
                ->leftJoin('park as p', 'oq.park_id', '=', 'p.park_id')
                ->select(
                    'oq.que_id', 'oq.que_class', 'oq.que_comment',
                    'oq.created_at', 'oq.updated_at', 'oq.que_status'
                )
                ->where('oq.que_class', '<', 99)
                ->whereIn('oq.que_status', [1, 2])
                ->orderBy('oq.created_at', 'DESC')
                ->limit(5)
                ->get();

            // ハード異常・タスク件数計算
            $hardCount = DB::table('operator_que')
                ->where('que_class', '>', 99)
                ->whereIn('que_status', [1, 2])
                ->count();

            $taskCount = DB::table('operator_que')
                ->where('que_class', '<', 99)
                ->whereIn('que_status', [1, 2])
                ->count();

            // 最新のハード異常・タスク日時
            $hardLatest = $hardwareIssues->first()?->created_at;
            $taskLatest = $taskIssues->first()?->created_at;

            // Nav bar 関連データをマージ
            $viewData = array_merge($viewData, [
                'hardCount' => $hardCount,
                'hardLatest' => $hardLatest,
                'latestHards' => $hardwareIssues,
                'taskCount' => $taskCount,
                'taskLatest' => $taskLatest,
                'latestTasks' => $taskIssues,
            ]);
        }

        // すべてのビューでこれらのデータが利用可能
        View::share($viewData);

        return $next($request);
    }
}
