/home2/mshostin/hall-management.ms-hostingladz.com/app/Http/Controllers/Backend/AdminController.php
<?php
namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Models\Activity;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class AdminController extends Controller
{
    public function __construct()
    {
        $permissions = [
            'activityLogs' => 'view-activityLogs',
        ];

        foreach ($permissions as $method => $permission) {
            $this->middleware("permission:{$permission}")->only($method);
        }
    }

    public function activityLogs(Request $request)
    {
        $search = $request->input('search');

        $logs = Activity::with(['causer', 'subject'])
            ->when($search, function ($query) use ($search) {
                $query->where(function ($q) use ($search) {
                    $q->where('log_name', 'LIKE', "%{$search}%")
                        ->orWhere('description', 'LIKE', "%{$search}%")
                        ->orWhere('causer_type', 'LIKE', "%{$search}%")
                        ->orWhere('subject_type', 'LIKE', "%{$search}%")
                        ->orWhere('properties', 'LIKE', "%{$search}%")
                        ->orWhere('created_at', 'LIKE', "%{$search}%");
                });
            })
            ->latest()
            ->paginate(20)
            ->appends(['search' => $search]);

        // ⭐ Convert properties into readable messages
        foreach ($logs as $log) {
            $old     = $log->properties['old_values'] ?? [];
            $new     = $log->properties['new_values'] ?? [];
            $changes = [];

            $modelName = class_basename($log->subject_type); // e.g., User, Category, Booking

            $excludeFields = ['created_at', 'updated_at', 'deleted_at', 'password'];

            if (Str::contains(strtolower($log->description), 'created')) {
                // NEW record: show only fields that have actual data
                foreach ($new as $key => $value) {
                    if (in_array($key, $excludeFields)) {
                        continue;
                    }

                    if ($value === null || $value === '' || (is_array($value) && empty($value))) {
                        continue;
                    }

                    if (is_array($value)) {
                        $value = implode(', ', $value); // nice display for array fields
                    }

                    $changes[] = ucfirst(str_replace('_', ' ', $key)) . ": " . $value;
                }

                if (! empty($changes)) {
                    array_unshift($changes, "New {$modelName} created"); // add headline
                } else {
                    $changes[] = "New {$modelName} created (no details filled)";
                }
            } elseif (Str::contains(strtolower($log->description), 'updated')) {
                // UPDATED record: show only changed values except excluded
                foreach ($new as $key => $value) {
                    if (in_array($key, $excludeFields)) {
                        continue;
                    }

                    $oldValue = $old[$key] ?? null;
                    if ($oldValue != $value) {
                        if (is_array($value)) {
                            $value    = implode(', ', $value);
                            $oldValue = is_array($oldValue) ? implode(', ', $oldValue) : $oldValue;
                        }
                        $changes[] = ucfirst(str_replace('_', ' ', $key))
                            . " changed from '" . ($oldValue ?? '') . "' to '{$value}'";
                    }
                }
            } elseif (Str::contains(strtolower($log->description), 'deleted')) {
                $changes[] = "{$modelName} deleted: #" . ($log->subject_id ?? '-');
            } elseif ($log->log_name === 'auth') {
                if (isset($log->properties['credentials']['email'])) {
                    $changes[] = "Attempted Email: " . $log->properties['credentials']['email'];
                } elseif (isset($log->properties['email'])) {
                    $changes[] = "Email: " . $log->properties['email'];
                }
                
                if (isset($log->properties['ip_address'])) {
                    $changes[] = "IP: " . $log->properties['ip_address'];
                }
            }

            $log->readable_changes = $changes;
            $log->readable_causer  = $log->causer->name ?? ($log->causer_type ? ($log->causer_type . ' #' . $log->causer_id) : 'Guest');
            $log->readable_subject = $log->subject_id ? "{$modelName} #{$log->subject_id}" : '-';
        }

        return view('dashboard.pages.activity_logs', compact('logs', 'search'));
    }

    // public function activityLogs(Request $request)
    // {
    //     $search = $request->input('search');

    //     $logs = Activity::when($search, function ($query) use ($search) {
    //         $query->where(function ($q) use ($search) {
    //             $q->where('log_name', 'LIKE', "%{$search}%")
    //                 ->orWhere('description', 'LIKE', "%{$search}%")
    //                 ->orWhere('causer_type', 'LIKE', "%{$search}%")
    //                 ->orWhere('subject_type', 'LIKE', "%{$search}%")
    //                 ->orWhere('properties', 'LIKE', "%{$search}%")
    //                 ->orWhere('created_at', 'LIKE', "%{$search}%");
    //         });
    //     })
    //         ->latest()
    //         ->paginate(20)
    //         ->appends(['search' => $search]);

    //     return view('dashboard.pages.activity_logs', compact('logs', 'search'));
    // }
}