HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/owlcrm/app/Http/Controllers/user/UserController.php
<?php

namespace App\Http\Controllers\user;

use App\Http\Controllers\Controller;
use App\Models\Reminder;
use App\Models\Role;
use App\Models\Task;
use App\Models\User;
use App\Models\UserActivityLog;
use App\Models\UserNote;
use App\Models\UserRole;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
use Yajra\DataTables\Facades\DataTables;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index(Request $request)
    {
        if ($request->ajax()) {
            $search_keyword = '';
            $status = 'all'; // all status
            $start_date = '';
            $end_date = '';
            $request_data = $request->all();
            if ($request->has('search_keyword')) {
                $search_keyword = $request->search_keyword;
            }
            if ($request->has('status_filter')) {
                $status = $request->status_filter;
            }
            // avoid zero column as it's checkbox so we can't sort by it
            if ($request->has('order') && $request->order[0]['column'] != 0) {
                $sort_column_number = $request->order[0]['column'];
                $sort_column_dir = $request->order[0]['dir'];
                $sort_column_key = $request->columns[$sort_column_number]['data'];
            }
            if ($request->has('date_range_filter') && $request->date_range_filter != '') {
                $date_range_filter_arr = explode(' - ', $request->date_range_filter);
                $start_date = formatDate($date_range_filter_arr[0]);
                $end_date = formatDate($date_range_filter_arr[1]);
            }
            $main_query = User::query()
            ->where(function ($query) {
                $authUser = auth()->user();
        
                // Logged-in admin ka apna data
                $query->orWhere('parent_id', '=', $authUser->id);
                    // Direct Sibling (staff) users ka data
    
            });
            
            $query = $main_query;
            if (!empty($search_keyword)) {
                $query = $query->where('first_name', 'LIKE', '%' . $search_keyword . '%')->orWhere('last_name', 'LIKE', '%' . $search_keyword . '%');
            }
            if ($status != 'all' && $status != '') {
                $query = $query->where('status', $status);
            }
            if (!empty($sort_column_key)) {
                $query = $query->orderBy($sort_column_key, $sort_column_dir);
            } else {
                $query = $query->latest();
            }
            if ($start_date != '' && $end_date != '') {
                $query = $query->whereDate('created_at', '>=', $start_date)->whereDate('created_at', '<=', $end_date);
            }


            $data = $query->with('userRoles')->get();
            $count_total = $main_query->count();
            $count_filter = $count_total;
            return DataTables::of($data)

                ->addColumn('first_name', function ($row) {
                    return $row->first_name . ' ' . $row->last_name;
                })
                ->addColumn('email', function ($row) {
                    return $row->email;
                })
                ->editColumn('status', function ($row) {
                    $update_url = route('user.update.status', $row->id);
                    return setStatus($row, $update_url);
                })

                ->addColumn('role', function ($row) {
                    $roleNames = '';
                    if (isset($row->userRoles) && isset($row->userRoles->role)) {

                        $roleNames = $row->userRoles->role->name;
                    }
                    return $roleNames;
                })


                ->editColumn('created_at', function ($row) {
                    return formatDate($row->created_at);
                })
                ->addColumn('action', function ($row) {

                    // if ($row->parent_id == Auth::user()->id) {

                        return view('users.user.partially.delete', compact('row'));
                    // }
                })
                ->rawColumns(['action', 'status'])
                ->with([
                    "recordsTotal"    => $count_total,
                    "recordsFiltered" => $count_filter,
                ])
                ->make(true);
        }
        return view('users.user.index');
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
            $user = auth()->user();

    // Fetch roles based on parent and sibling criteria
    $roles = Role::query()
        ->where(function ($query) use ($user) {
            $query->where('created_by', $user->parent_id) // Roles created by the parent
                  ->orWhere('created_by', $user->id);     // Roles created by the logged-in user
        })
        ->get();



        // $user_roles = Role::all();

        return view('users.user.create', compact('roles'));
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'first_name' => 'required',
            'last_name' => 'required',
            'email' => 'required|string|lowercase|email|max:255|unique:users',
            'password' => 'required|string|min:8|confirmed',
            'role_id' => 'required|exists:roles,id',
        ]);
        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }
        
        // $userId = auth()->id(); // The ID of the user adding new users
        // if (!canAddMoreUsers($userId)) {
        //     return redirect()->route('users.index')->with('success', 'You have reached your staff limit for your subscription plan..');
        // }
        
        DB::beginTransaction();
        try {
            $user = new User();
            $user->first_name = $request->first_name;
            $user->last_name = $request->last_name;
            $user->status = $request->has('is_active') ? 1 : 0;
            $user->is_admin = $request->has('is_admin') ? 1 : 0;
            $user->email = $request->email;
            $user->password = bcrypt($request->password);

            $adminIds = getAdminId();
            $user->parent_id = $adminIds->parent_id;

            $user->created_by = $adminIds->created_by;
            $user->save();

            $user_role = new UserRole();
            $user_role->user_id = $user->id;
            $user_role->role_id = $request->role_id;
            $user_role->save();
            DB::commit();

            return redirect()->route('users.index')->with('success', 'Staff has been added successfully.');
        } catch (\Exception $e) {
            DB::rollback();
            return response()->json(['success' => false, 'message' => $e->getMessage()]);
        }
    }


    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {

        $user = User::find($id);
        $users = User::all();
        $user_activity_logs = UserActivityLog::where('user_id', $id)->with(['user', 'get_created_by'])->get();
        return view('users.user.show', compact('user', 'users', 'user_activity_logs'));
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        $user = User::with('userRoles')->find($id);
        $user_role = Role::all();
        if (isset($user_role)) {
            return view('users.user.edit', ['user' => $user, 'user_role' => $user_role]);
        } else {
            return back()->with('error', 'Staff does not exist');
        }
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        $validator = Validator::make($request->all(), [
            'first_name' => 'required',
            'last_name' => 'required',
            'email' => ['required', 'string', 'lowercase', 'email', 'max:255',  Rule::unique('users')->ignore($id)],
            'role_id' => 'required|exists:roles,id',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }


        try {
            DB::beginTransaction();

            User::updateOrCreate(
                ['id' => $id],
                [
                    'first_name' => $request->input('first_name'),
                    'last_name' => $request->input('last_name'),
                    'status' =>  $request->has('is_active') ? 1 : 0,
                    'email' =>  $request->input('email')

                ],
            );

            UserRole::updateOrCreate(
                ['user_id' => $id], //n=match 
                ['role_id' => $request->role_id] //udpate or create
            );
            DB::commit();
            return redirect()->route('users.index')->with('success', 'Staff has been updated successfully');
        } catch (\Exception $e) {
            DB::rollback();
            return response()->json(['success' => false, 'message' => $e->getMessage()]);
        }
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        $user = User::find($id);
        if (isset($user)) {
            $user->forceDelete();
            $user_role = UserRole::where('user_id', $id)->delete();
            return redirect()->back()->with('success', 'Staff has been deleted successfully.');
        } else {
            return back()->with('error', 'User not found.');
        }
    }
    public function updateUsersStatus(Request $request, $id)
    {
        if ($request->has('new_status')) {
            $user = User::find($id);

            if ($user) {
                $user->status = $request->new_status;
                $user->save();
                return response()->json(['status' => 'success', 'message' => 'Staff status updated successfully']);
            } else {
                return response()->json(['status' => 'error', 'message' => 'Staff not found'], 404);
            }
        } else {
            return response()->json(['status' => 'error', 'message' => 'Missing status value'], 404);
        }
    }

    public function addUserReminder(Request $request, $user_id)
    {

        // Validate the request
        $validator = Validator::make($request->all(), [
            'reminder_to' => 'required|exists:users,id',
            'description' => 'required|string',
            'reminder_date' => 'required|date',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        $reminder = new Reminder();
        if (isset($reminder)) {

            $reminder->reminder_to = $request->input('reminder_to');

            $currentUserId = getAdminId();
            $reminder->created_by = $currentUserId->created_by;
            $reminder->entity_type = 'user';
            $reminder->entity_id = $user_id;
            $reminder->is_notified = 0;
            $reminder->status = 1;
            $reminder->description = $request->input('description');
            $reminder->reminder_date = $request->input('reminder_date');
            $reminder->email_notification = $request->input('email_notification', 0);
            $reminder->save();

            $user_activity_log = new UserActivityLog();
            if (isset($user_activity_log)) {
                $user_activity_log->user_id = $user_id;
                $user_activity_log->activity_on = 'Reminder';
                $user_activity_log->activity = 'added';
                $user_activity_log->created_by = $currentUserId->created_by;

                $description = "<b>Reminder Values:</b><br>";
                $description .= "<b>Reminder Date:</b> " . formatDate($reminder->reminder_date, 'Y/m/d H:i:s') . "<br>";
                $description .= "<b>Description:</b> " . $reminder->description . "<br>";
                $description .= "<b>Reminder To:</b> " . $reminder->user->first_name . '' . $reminder->user->last_name . "<br>";




                $user_activity_log->description = $description;

                $user_activity_log->save();
            }
            return redirect()->back()->with('success-reminder', 'Staff Reminder has been Added successfully.');
        } else {
            return back()->with('error-reminder', 'Staff Reminder does not exist');
        }
    }
    public function userReminder_index(Request $request)
    {


        if ($request->ajax()) {

            $request_data = $request->all();


            $query = Reminder::where('entity_type', 'user')
                ->where('entity_id', $request->user)
                ->with('user', 'reminder_user_get');

            // Execute the query to get the data
            $data = $query->get();

            // Calculate the total count of reminders and the filtered count
            $count_total = Reminder::where('entity_type', 'user')->count();
            $count_filter = $query->count();

            // Return the data formatted for DataTables
            return DataTables::of($data)
                ->with('recordsTotal', $count_total)
                ->with('recordsFiltered', $count_filter)



                ->addColumn('reminder_to', function ($row) {

                    return isset($row->user) && ($row->user->first_name . $row->user->last_name) ? $row->first_name . $row->user->last_name : '';
                })
                ->addColumn('user', function ($row) {

                    return isset($row->created_by_user) && ($row->first_name . $row->created_by_user->last_name) ? $row->first_name . $row->created_by_user->last_name : '';
                })

                ->addColumn('reminder_date', function ($row) {
                    return formatDate($row->reminder_date, 'Y/m/d H:i:s');
                })
                ->addColumn('is_notified', function ($row) {
                    return  $row->is_notified == 0 ? 'No' : 'Yes';
                })



                ->addColumn('action', function ($row) {

                    if ($row->is_admin !== 1) {
                        $reminder = Reminder::findOrFail($row->id);
                        $users = User::all();
                        return view('users.user.partially.user-reminder-delete', compact('row', 'reminder', 'users'));
                    }
                })
                ->rawColumns(['action'])
                ->with([
                    "recordsTotal"    => $count_total,
                    "recordsFiltered" => $count_filter,
                ])
                ->make(true);
        }

        return view('users.user.show');
    }

    public function updateUserReminder(Request $request, string $id)
    {
        // Validate the request inputs
        $validator = Validator::make($request->all(), [
            'reminder_to' => 'required|exists:users,id',
            'description' => 'required|string',
            'reminder_date' => 'required|date',
        ]);

        // Return with validation errors if any
        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        // Fetch the latest reminder from the database
        $reminder = Reminder::find($id);
        if ($reminder) {

            $originalReminder = $reminder->getOriginal();


            $reminder->reminder_date = $request->input('reminder_date');
            $reminder->reminder_to = $request->input('reminder_to');
            $reminder->description = $request->input('description');
            $reminder->email_notification = $request->input('email_notification', 0); // Default to 0 if not present


            $reminder->save();


            $user_activity_log = new UserActivityLog();
            if ($user_activity_log) {
                $user_activity_log->user_id = $reminder->entity_id;
                $user_activity_log->activity_on = 'reminder';
                $user_activity_log->activity = 'updated';
                $currentUserId = getAdminId();
                $user_activity_log->created_by = $currentUserId->created_by;

                $oldValues = [];
                $newValues = [];

                // Check and log changes in reminder date
                if ($originalReminder['reminder_date'] !== $reminder->reminder_date) {
                    $oldValues['<b>Reminder Date</b>'] = formatDate($originalReminder['reminder_date'], 'Y/m/d H:i:s');
                    $newValues['<b>Reminder Date</b>'] = formatDate($reminder->reminder_date, 'Y/m/d H:i:s');
                }

                // Check and log changes in reminder to (user)
                if ($originalReminder['reminder_to'] !== $reminder->reminder_to) {
                    $originalReminderToUser = User::find($originalReminder['reminder_to']);
                    $newReminderToUser = User::find($reminder->reminder_to);
                    $oldValues['<b>Reminder To</b>'] = $originalReminderToUser ? $originalReminderToUser->first_name . ' ' . $originalReminderToUser->last_name : "Unknown";
                    $newValues['<b>Reminder To</b>'] = $newReminderToUser ? $newReminderToUser->first_name . ' ' . $newReminderToUser->last_name : "Unknown";
                }

                // Check and log changes in description
                if ($originalReminder['description'] !== $reminder->description) {
                    $oldValues['<b>description</b>'] = $originalReminder['description'];
                    $newValues['<b>description</b>'] = $reminder->description;
                }


                // Check and log changes in email notification status
                if ($originalReminder['email_notification'] != $reminder->email_notification) {
                    $oldValues['<b>Email Notification</b>'] = $originalReminder['email_notification'] ? 'Enabled' : 'Disabled';
                    $newValues['<b>Email Notification</b>'] = $reminder->email_notification ? 'Enabled' : 'Disabled';
                }

                // Create a formatted description string
                $descriptionParts = [];

                if (!empty($oldValues)) {
                    $descriptionParts[] = "<b>Old Values:</b><br> " . implode("<br> ", array_map(function ($key, $value) {
                        return "$key: $value";
                    }, array_keys($oldValues), $oldValues));
                }

                if (!empty($newValues)) {
                    $descriptionParts[] = "<b>New Values:</b><br>" . implode("<br> ", array_map(function ($key, $value) {
                        return "$key: $value";
                    }, array_keys($newValues), $newValues));
                }

                if (!empty($descriptionParts)) {
                    $user_activity_log->description = implode("<br> ", $descriptionParts);
                    $user_activity_log->save();
                }
            }

            return redirect()->back()->with('success-reminder', 'Staff Reminder has been updated successfully.');
        } else {

            return back()->with('error-reminder', 'Staff Reminder does not exist.');
        }
    }
    public function UserReminder_delete(string $id)
    {

        $user_reminder = Reminder::find($id);
        if (isset($user_reminder)) {
            $reminderId = $user_reminder->entity_id;
            $user_reminder->delete();

            $user_activity_log = new UserActivityLog();
            if (isset($user_activity_log)) {
                $user_activity_log->user_id = $reminderId;
                $user_activity_log->activity_on = 'reminder';
                $user_activity_log->activity = 'deleted';
                $currentUserId =  getAdminId();
                $user_activity_log->created_by = $currentUserId->created_by;
                $user_activity_log->description = $user_reminder->description;
                $user_activity_log->save();
            }
            return redirect()->back()->with('success-reminder', 'Staff Reminder has been deleted successfully.');
        } else {
            return back()->with('error-reminder', 'Staff Reminder does not exist');
        }
    }

    public function addUserNotes(Request $request, $user_id)
    {

        $validator = Validator::make($request->all(), [
            'notes' => 'required|string',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        $user_note = new UserNote();
        if (isset($user_note)) {
            $user_note->user_id = $user_id;


            $currentUserId = getAdminId();
            $user_note->created_by = $currentUserId->created_by;
            $user_note->notes = $request->notes;
            $user_note->save();

            $user_activity_log = new UserActivityLog();
            if (isset($user_activity_log)) {
                $user_activity_log->user_id = $user_id;
                $user_activity_log->activity_on = 'Note';
                $user_activity_log->activity = 'added';
                $user_activity_log->created_by = $currentUserId->created_by;

                $user_activity_log->description = $user_note->notes;

                $user_activity_log->save();
            }

            return redirect()->back()->with('success-usernote', 'Staff Note added successfully');
        } else {
            return redirect()->back()->with('error-usernote', 'Staff Note does not exist');
        }
    }

    public function userNotes_index(Request $request)
    {
        if ($request->ajax()) {

            $request_data = $request->all();

            // avoid zero column as it's checkbox so we can't sort by it
            if ($request->has('order') && $request->order[0]['column'] != 0) {
                $sort_column_number = $request->order[0]['column'];
                $sort_column_dir = $request->order[0]['dir'];
                $sort_column_key = $request->columns[$sort_column_number]['data'];
            }

            $main_query = UserNote::query();
            $query = $main_query->where('user_id', $request->user_id);
            $data = $query->with('get_user')->get();
            $count_total = $main_query->count();
            $count_filter = $count_total;
            return DataTables::of($data)



                ->addColumn('user', function ($row) {
                    return isset($row->get_user) && ($row->first_name . $row->get_user->last_name) ? $row->get_user->first_name . ' ' . $row->get_user->last_name : '';
                })
                ->addColumn('notes', function ($row) {
                    return $row->notes;
                })
                ->addColumn('date', function ($row) {
                    return formatDate($row->created_at, 'Y/m/d H:i:s');
                })

                ->addColumn('action', function ($row) {

                    if ($row->is_admin !== 1) {
                        $user_note = UserNote::find($row->id);
                        return view('users.user.partially.usernotes-delete', compact('row', 'user_note'));
                    }
                })
                ->rawColumns(['action'])
                ->with([
                    "recordsTotal"    => $count_total,
                    "recordsFiltered" => $count_filter,
                ])
                ->make(true);
        }
        return view('users.user.show');
    }

    public function UserNotesUpdate(Request $request, $id)
    {


        $validator = Validator::make($request->all(), [
            'notes' => 'required|string',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        $user_notes = UserNote::find($id);
        if (isset($user_notes)) {

            $originalNotes = $user_notes->getOriginal('notes');

            $user_notes->notes = $request->notes;
            $currentUserId =  getAdminId();
            $user_notes->created_by = $currentUserId->created_by;
            $user_notes->save();


            $user_activity_log = new UserActivityLog();
            if (isset($user_activity_log)) {
                $user_activity_log->user_id = $user_notes->user_id;
                $user_activity_log->activity_on = 'note';
                $user_activity_log->activity = 'updated';
                $user_activity_log->created_by = $currentUserId->created_by;


                $oldValues = [];
                $newValues = [];
                $descriptionParts = []; // Initialize descriptionParts array
                $originalNote = $originalNotes;

                $newNote = $user_notes->notes;
                $descriptionParts = []; // Initialize descriptionParts array

                // Check if the note has changed
                if ($originalNote !== $newNote) {
                    $descriptionParts[] = "<b>Old Note:</b><br> " . $originalNote;
                    $descriptionParts[] = "<b>New Note:</b><br> " . $newNote;
                }

                // If there are description parts, concatenate and save to the log
                if (!empty($descriptionParts)) {
                    $user_activity_log->description = implode("<br>", $descriptionParts);
                    $user_activity_log->save();
                }
            }


            return redirect()->back()->with('success-usernote', 'Staff Note Updated successfully');
        } else {
            return redirect()->back()->with('error-usernote', 'Notes does not exist');
        }
    }

    public function UserNotesDelete(string $id)
    {
        $user_note = UserNote::find($id);
        if (isset($user_note)) {
            $userId = $user_note->user_id;
            $user_note->delete();

            $user_activity_log = new UserActivityLog();
            if (isset($user_activity_log)) {
                $user_activity_log->user_id = $userId;
                $user_activity_log->activity_on = 'notes';
                $user_activity_log->activity = 'deleted';
                $currentUserId =  getAdminId();
                $user_activity_log->created_by = $currentUserId->created_by;
                $user_activity_log->description = $user_note->notes;
                $user_activity_log->save();
            }
            return redirect()->back()->with('success-usernote', 'Staff Notes has been deleted successfully.');
        } else {
            return back()->with('error-usernote', 'Staff Notes does not exist');
        }
    }

    public function addUserTask(Request $request, $id)
    {

        $validator = Validator::make($request->all(), [
            'user_id' => 'required|exists:users,id',
            'subject' => 'required|string',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        $usertask = new Task();
        if (isset($usertask)) {
            $usertask->subject = $request->subject;
            $usertask->start_date = $request->start_date;
            $usertask->due_date = $request->due_date;
            $usertask->priority = $request->priority;

            $usertask->assigned_to = $request->user_id;

            $currentUserId =  getAdminId();
            $usertask->created_by = $currentUserId->created_by;

            $usertask->entity_type = 'user';
            $usertask->entity_id = $id;
            $usertask->description = $request->description;
            $usertask->state = $request->state;
            $usertask->status = 1;
            $usertask->save();

            $user_activity_log = new UserActivityLog();
            if (isset($user_activity_log)) {
                $user_activity_log->user_id = $id;
                $user_activity_log->activity_on = 'Task';
                $user_activity_log->activity = 'added';
                $user_activity_log->created_by = $currentUserId->created_by;

                $description = "<b>Task added:</b><br>";
                $description .= "<b>Subject:</b> " . $usertask->subject . "<br>";
                $description .= "<b>Start Date:</b> " . formatDate($usertask->start_date, 'Y/m/d H:i:s') . "<br>";
                $description .= "<b>Due Date:</b> " . formatDate($usertask->due_date, 'Y/m/d H:i:s') . "<br>";
                $description .= "<b>Priority:</b> " . $usertask->priority . "<br>";
                $description .= "<b>Assigned To:</b> " . $usertask->user->first_name . '' . $usertask->user->last_name . "<br>";
                $description .= "<b>Description:</b> " . $usertask->description . "<br>";
                $description .= "<b>State:</b> " . $usertask->state . "<br>";


                $user_activity_log->description = $description;
                $user_activity_log->save();
            }

            return redirect()->back()->with('success-usertask', 'Staff Task added successfully');
        } else {
            return redirect()->back()->with('error-usertask', 'Staff Task does not exist');
        }
    }
    public function userTask_index(Request $request)
    {
        if ($request->ajax()) {

            $request_data = $request->all();


            $main_query = Task::query();

            $query = $main_query->where('entity_type', 'user')->where('entity_id', $request->user);
            $data = $query->with('created_by_user', 'user')->get();
            $count_total = $main_query->count();
            $count_filter = $query->count();
            return DataTables::of($data)


                ->addColumn('assigned_to', function ($row) {
                    return isset($row->user) && ($row->user->first_name . $row->user->last_name) ? $row->user->first_name . $row->user->last_name : '';
                })
                ->addColumn('user', function ($row) {
                    return isset($row->created_by_user) && ($row->created_by_user->first_name . $row->created_by_user->last_name) ? $row->created_by_user->first_name . ' ' . $row->created_by_user->last_name : '';
                })

                ->addColumn('subject', function ($row) {
                    return $row->subject;
                })


                ->addColumn('action', function ($row) {

                    if ($row->is_admin !== 1) {
                        $task = Task::findOrFail($row->id);
                        $users = User::all();
                        return view('users.user.partially.usertask-delete', compact('row', 'task', 'users'));
                    }
                })
                ->rawColumns(['action'])
                ->with([
                    "recordsTotal"    => $count_total,
                    "recordsFiltered" => $count_filter,
                ])
                ->make(true);
        }

        return view('users.user.show');
    }

    public function updateUserTask(Request $request, $id)
    {

        $validator = Validator::make($request->all(), [
            'user_id' => 'required|exists:users,id',
            'subject' => 'required|string',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }
        $usertask = Task::find($id);
        if (isset($usertask)) {
            $originalTask = $usertask->getOriginal();

            $usertask->subject = $request->subject;
            $usertask->start_date = $request->start_date;
            $usertask->due_date = $request->due_date;
            $usertask->priority = $request->priority;

            $usertask->assigned_to = $request->user_id;

            $currentUserId =  getAdminId();
            $usertask->created_by = $currentUserId->created_by;


            $usertask->description = $request->description;
            $usertask->state = $request->state;

            $usertask->save();



            $user_activity_log = new UserActivityLog();
            if ($user_activity_log) {
                $user_activity_log->user_id = $usertask->entity_id;
                $user_activity_log->activity_on = 'Task';
                $user_activity_log->activity = 'updated';
                $currentUserId = getAdminId();
                $user_activity_log->created_by = $currentUserId->created_by;

                $oldValues = [];
                $newValues = [];


                // Check and log changes for Subject



                if ($originalTask['subject'] !== $usertask->subject) {
                    $oldValues['<b>subject</b>'] = $originalTask['subject'];
                    $newValues['<b>subject</b>'] = $usertask->subject;
                }


                if ($originalTask['start_date'] !== $usertask->start_date) {
                    $oldValues['<b>Start Date</b>'] = formatDate($originalTask['start_date'], 'Y/m/d H:i:s');
                    $newValues['<b>Start Date</b>'] = formatDate($usertask->start_date, 'Y/m/d H:i:s');
                }

                if ($originalTask['due_date'] !== $usertask->due_date) {
                    $oldValues['<b>Due Date</b>'] = formatDate($originalTask['due_date'], 'Y/m/d H:i:s');
                    $newValues['<b>Due Date</b>'] = formatDate($usertask->due_date, 'Y/m/d H:i:s');
                }


                if ($originalTask['priority'] !== $usertask->priority) {
                    $oldValues['<b>Priority</b>'] = $originalTask['priority'];
                    $newValues['<b>Priority</b>'] = $usertask->priority;
                }

                if ($originalTask['assigned_to'] !== $usertask->assigned_to) {
                    $originalAssignedToUser = User::find($originalTask['assigned_to']);
                    $newAssignedToUser = User::find($usertask->assigned_to);
                    $oldValues['<b>Assigned To</b>'] = $originalAssignedToUser ? $originalAssignedToUser->first_name . ' ' . $originalAssignedToUser->last_name : "Unknown";
                    $newValues['<b>Assigned To</b>'] = $newAssignedToUser ? $newAssignedToUser->first_name . ' ' . $newAssignedToUser->last_name : "Unknown";
                }

                if ($originalTask['state'] !== $usertask->state) {
                    $oldValues['<b>State</b>'] = $originalTask['state'];
                    $newValues['<b>State</b>'] = $usertask->state;
                }


                if ($originalTask['description'] !== $usertask->description) {
                    $oldValues['<b>Description</b>'] = $originalTask['description'];
                    $newValues['<b>Description</b>'] = $usertask->description;
                }
                $descriptionParts = [];

                if (!empty($oldValues)) {
                    $descriptionParts[] = "<b>Old Values:</b><br> " . implode("<br> ", array_map(function ($key, $value) {
                        return "$key: $value";
                    }, array_keys($oldValues), $oldValues));
                }

                if (!empty($newValues)) {
                    $descriptionParts[] = "<b>New Values:</b><br>" . implode("<br> ", array_map(function ($key, $value) {
                        return "$key: $value";
                    }, array_keys($newValues), $newValues));
                }

                if (!empty($descriptionParts)) {
                    $user_activity_log->description = implode("<br> ", $descriptionParts);
                    $user_activity_log->save();
                }

                return redirect()->back()->with('success-usertask', 'Staff Task Updated successfully');
            } else {
                return redirect()->back()->with('error-usertask', 'Staff Task does not exist');
            }
        }
    }

    public function userTask_delete(string $id)
    {

        $task = Task::find($id);
        if (isset($task)) {
            $leadId = $task->entity_id;
            $task->delete();

            $user_activity_log = new UserActivityLog();
            if (isset($user_activity_log)) {
                $user_activity_log->user_id = $leadId;
                $user_activity_log->activity_on = 'Task';
                $user_activity_log->activity = 'deleted';
                $currentUserId =  getAdminId();
                $user_activity_log->created_by = $currentUserId->created_by;
                $user_activity_log->description = $task->subject;
                $user_activity_log->save();
            }
            return redirect()->back()->with('success-usertask', 'Staff Task has been deleted successfully.');
        } else {
            return back()->with('error-usertask', 'Staff Task does not exist');
        }
    }

    public function upload(Request $request, user $user)
    {


        $request->validate([
            'title' => 'required',
            'file' => 'required|mimes:jpeg,jpg,png,pdf', // Example validation rules
        ]);

        // Debug: Check if the request contains a file
        if ($request->hasFile('file')) {
            // Get the uploaded file
            $file = $request->file('file');

            // Debug: Check file properties
            if (!$file->isValid()) {
                return redirect()->back()->with('error', 'Invalid file upload.');
            }

            try {
                // Add media to the user's media collection
                $media = $user->addMedia($file)
                    ->usingFileName(time() . '_' . $file->getClientOriginalName()) // Optionally rename the file
                    ->toMediaCollection('users');

                // Set custom property 'title' if provided
                if ($request->has('title')) {
                    $media->setCustomProperty('title', $request->input('title'));
                }

                // Save media changes
                $media->save();

                $user_activity_log = new UserActivityLog();
                if (isset($user_activity_log)) {
                    $user_activity_log->user_id = $user->id; // Use $user->id instead of $user
                    $user_activity_log->activity_on = 'Image';
                    $user_activity_log->activity = 'added';

                    // Ensure getAdminId() returns the correct object or value
                    $currentUser = getAdminId();
                    $user_activity_log->created_by = $currentUser->created_by;

                    $description = "<b>Image added:</b><br>";
                    $description .= "<b>Name:</b> " . $media->name . "<br>";
                    $description .= "<b>File Name:</b> " . $media->file_name . "<br>";

                    $user_activity_log->description = $description;

                    $user_activity_log->save();
                }

                return redirect()->back()->with('success', 'File uploaded successfully.');
            } catch (\Exception $e) {
                // Debug: Log exception details
                \log::error('File upload error: ' . $e->getMessage());

                return redirect()->back()->with('error', 'File upload failed.');
            }
        } else {
            return redirect()->back()->with('error', 'No file uploaded.');
        }
    }
    public function destroyMediaRecords(string $id)
    {

        // Fetch the media record to be deleted
        $mediaRecord = DB::table('media')->where('id', $id)->first();

        // Initialize the UserActivityLog instance
        $user_activity_log = new UserActivityLog();

        // If media record exists, proceed with deletion
        if ($mediaRecord) {
            // Fetch the filename before deletion
            $fileName = $mediaRecord->file_name;
            $userId = $mediaRecord->model_id;
            // Delete the media record
            $deleted = DB::table('media')->where('id', $id)->delete();

            // Log the deletion activity
            $user_activity_log->user_id = $userId;
            $user_activity_log->activity_on = 'Image';
            $user_activity_log->activity = 'deleted';

            // Correctly fetch the current user's ID
            $currentUser = getAdminId();
            $user_activity_log->created_by = $currentUser->created_by;

            $user_activity_log->description = "<b>Image deleted:</b><br><b>File Name:</b> " . $fileName . "<br>";

            // Save the activity log entry
            $user_activity_log->save();
        } else {
            $deleted = false; // Set $deleted to false if no record was found
        }

        // Check the deletion result and redirect accordingly
        if ($deleted) {
            return redirect()->back()->with('success', 'File deleted successfully');
        } else {
            return redirect()->back()->with('error', 'File not found');
        }
    }
}