Kontrakan::count(), 'jumlahLaundry' => Laundry::count(), 'jumlahUsers' => User::count(), 'totalReviews' => Review::count() ?? 0, ]; }); // Rekomendasi Kontrakan Terbaik (berdasarkan rating/harga) $topKontrakan = Cache::remember('top_kontrakan', 600, function () { return Kontrakan::select('id', 'nama', 'alamat', 'harga', 'jarak', 'luas', 'foto') ->orderBy('luas', 'desc') // Prioritas luas besar ->orderBy('harga', 'asc') // Harga murah ->take(3) ->get(); }); // Rekomendasi Laundry Terbaik (berdasarkan harga termurah) $topLaundry = Cache::remember('top_laundry', 600, function () { return DB::table('laundry') ->join(DB::raw('( SELECT laundry_id, MIN(harga) as min_harga FROM layanan_laundry GROUP BY laundry_id ) as layanan'), 'laundry.id', '=', 'layanan.laundry_id') ->select('laundry.*', 'layanan.min_harga') ->orderBy('layanan.min_harga', 'asc') ->take(3) ->get(); }); // Rating rata-rata (jika ada table reviews) $avgRating = Cache::remember('avg_rating', 600, function () { return Review::avg('rating') ?? 4.8; }); return view('welcome', compact( 'stats', 'topKontrakan', 'topLaundry', 'avgRating' )); } /** * API endpoint untuk mendapatkan statistik real-time */ public function getStats() { $stats = Cache::remember('api_welcome_stats', 60, function () { return [ 'jumlahKontrakan' => Kontrakan::count(), 'jumlahLaundry' => Laundry::count(), 'jumlahUsers' => User::count(), 'totalReviews' => Review::count() ?? 0, 'avgRating' => round(Review::avg('rating') ?? 4.8, 1), ]; }); return response()->json($stats); } /** * Show admin access page (separated from main homepage) */ public function adminAccess() { return view('admin.access'); } }