<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class NavController extends Controller { // Existing: start navigating to a destination (kept as you have) public function to(string $block, string $slug) { $dest = DB::table('checkpoints')->where('slug', $slug)->first(); if (!$dest) { return redirect()->route('map.show', 'floor1') ->with('status', "Destination checkpoint '{$slug}' not found. Add it via /map/coords/{floor}."); } session([ 'nav.dest_slug' => $slug, 'nav.dest_name' => $dest->name, ]); if (!session()->has('nav.current_id')) { $fallback = DB::table('checkpoints') ->where('floor_id', $dest->floor_id) ->where('type', 'entrance') ->orderBy('id')->first() ?? DB::table('checkpoints')->where('slug', 'entrance-f1')->first() ?? $dest; session(['nav.current_id' => $fallback->id]); } $current = DB::table('checkpoints')->find(session('nav.current_id')); $floorSlug = DB::table('floors')->where('id', $current->floor_id)->value('slug') ?: 'floor1'; // s=1 asks the map page to auto-speak next instruction return redirect()->route('map.show', [$floorSlug, 's' => 1]) ->with('status', "Navigation started to {$dest->name}"); } // NEW: handle QR that sets CURRENT (and optional ?to=dest slug) // public function qr(string $slug, Request $request) // { // $cp = DB::table('checkpoints')->where('slug', $slug)->first(); // if (!$cp) abort(404, 'Checkpoint not found'); // session(['nav.current_id' => $cp->id]); // // Optional ?to=slug to set destination with the same scan // if ($request->filled('to')) { // $dest = DB::table('checkpoints')->where('slug', $request->query('to'))->first(); // if ($dest) { // session(['nav.dest_slug' => $dest->slug, 'nav.dest_name' => $dest->name]); // } // } // $floorSlug = DB::table('floors')->where('id', $cp->floor_id)->value('slug') ?? 'floor1'; // return redirect()->route('map.show', [$floorSlug, 's' => 1]) // ->with('status', "Location updated: {$cp->name}"); // } // NEW: QR that encodes both current and destination in path // public function qrTo(string $slug, string $dest) // { // $cp = DB::table('checkpoints')->where('slug', $slug)->first(); // if (!$cp) abort(404, 'Checkpoint not found'); // session(['nav.current_id' => $cp->id]); // $destCp = DB::table('checkpoints')->where('slug', $dest)->first(); // if ($destCp) session(['nav.dest_slug' => $destCp->slug, 'nav.dest_name' => $destCp->name]); // $floorSlug = DB::table('floors')->where('id', $cp->floor_id)->value('slug') ?? 'floor1'; // return redirect()->route('map.show', [$floorSlug, 's' => 1]) // ->with('status', $destCp ? "Location set: {$cp->name}. Navigating to {$destCp->name}" : "Location set: {$cp->name}"); // } // When the user scans a QR at a checkpoint public function qr(string $checkpointSlug) { $cp = \DB::table('checkpoints')->where('slug', $checkpointSlug)->first(); abort_unless($cp, 404, 'Checkpoint not found'); session(['nav.current_id' => $cp->id]); $floorSlug = \DB::table('floors')->where('id', $cp->floor_id)->value('slug') ?? 'floor1'; return redirect()->route('map.show', [$floorSlug, 's' => 1]) ->with('status', "Location updated: {$cp->name}"); } // QR that sets current + destination public function qrTo(string $slug, string $dest) { $cp = \DB::table('checkpoints')->where('slug', $slug)->first(); abort_unless($cp, 404, 'Checkpoint not found'); session(['nav.current_id' => $cp->id]); $destCp = \DB::table('checkpoints')->where('slug', $dest)->first(); if ($destCp) session(['nav.dest_slug' => $destCp->slug, 'nav.dest_name' => $destCp->name]); $floorSlug = \DB::table('floors')->where('id', $cp->floor_id)->value('slug') ?? 'floor1'; return redirect()->route('map.show', [$floorSlug, 's' => 1]) ->with('status', $destCp ? "Location set: {$cp->name}. Navigating to {$destCp->name}" : "Location set: {$cp->name}"); } // NEW: in-app QR scanner page public function scan() { return view('nav.scan'); } public function clear() { session()->forget(['nav.dest_slug', 'nav.dest_name', 'nav.current_id']); return redirect()->route('map.show', 'floor1')->with('status', 'Navigation cleared'); } public function set(Request $request) { $slug = $request->input('slug'); $cp = \DB::table('checkpoints')->where('slug', $slug)->first(); if (!$cp) { return back()->with('status', "Checkpoint '{$slug}' not found."); } session(['nav.current_id' => $cp->id]); $floorSlug = \DB::table('floors')->where('id', $cp->floor_id)->value('slug') ?? 'floor1'; return redirect()->route('map.show', $floorSlug)->with('status', "Location set: {$cp->name}"); } }