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/LeadController.php
<?php

namespace App\Http\Controllers;

use App\Models\City;
use App\Models\Country;
use App\Models\Customer;
use App\Models\Lead;
use App\Models\leadActivityLog;
use App\Models\LeadNote;
use App\Models\LeadSource;
use App\Models\Reminder;
use App\Models\States;
use App\Models\Task;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use PhpParser\Node\Expr\Assign;
use Random\RandomError;
use Validator;
use Yajra\DataTables\Facades\DataTables;

class LeadController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    // public function index()
    // {
    //     // dd(123);
    //     // $leads = Lead::all();
    //     // $leads = Lead::whereIn('status', ['new-lead', 'hot-lead', 'converted-lead', 'cold-lead'])
    //     // ->orderBy('id', 'desc')
    //     // ->take(1)->get();
    //     // $leads = Lead::with('city', 'state', 'country')->get();
    //     $new_leads = Lead::where('type', 'lead')->where('status', 'new-lead')->take(1)->get();
    //     $hot_leads = Lead::where('type', 'lead')->where('status', 'hot-lead')->take(1)->get();
    //     $converted_leads = Lead::where('type', 'lead')->where('status', 'converted-lead')->take(1)->get();
    //     $cold_leads = Lead::where('type', 'lead')->where('status', 'cold-lead')->take(1)->get();
    //     // dd($leads);
    //     return view('users.leads.index', compact('new_leads','hot_leads','cold_leads', 'converted_leads'));
    // }

    public function index(Request $request)
    {
 
        $assigned = $request->has('assigned') ??  0;
        $user = Auth::user(); // Get the logged-in user
        $new_leads = Lead::query()
            ->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
            ->where('leads.status', Lead::NewLead)
            ->where('type', 'preSales')

            ->where(function ($query) use ($user, $assigned) {
                $query->where('leads.user_id', $user->id) // Leads of logged-in user
                    ->orWhere('u.parent_id', $user->id); // Leads of user's children

                // Only add this condition if parent_id is not null
                if (!is_null($user->parent_id)) {
                    $query->orWhere('u.id', $user->parent_id); // Leads of user's parent

                    $query->orWhere(function ($query) use ($user) {
                        $query->where('u.parent_id', $user->parent_id) // Leads of siblings
                            ->where('u.id', '!=', $user->id); // Exclude the logged-in user
                    });
                }

                // return result based on current user
                if($assigned){
                    $query->where('leads.assigned_to', $user->id);
                }
            })
            ->select('leads.*') // Only select fields from leads
            ->orderBy('id', 'desc')
            ->take(1)
            ->get();



            $hot_leads = Lead::query()
                ->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
                ->where('leads.status', Lead::HotLead)
                
                ->where('type', 'preSales')

                ->where(function ($query) use ($user, $assigned) {
                    $query->where('leads.user_id', $user->id) // Leads of logged-in user
                        ->orWhere('u.parent_id', $user->id); // Leads of user's children

                    // Only add this condition if parent_id is not null
                    if (!is_null($user->parent_id)) {
                        $query->orWhere('u.id', $user->parent_id); // Leads of user's parent

                        $query->orWhere(function ($query) use ($user) {
                            $query->where('u.parent_id', $user->parent_id) // Leads of siblings
                                ->where('u.id', '!=', $user->id); // Exclude the logged-in user
                        });
                    }

                    // return result based on current user
                    if($assigned){
                        $query->where('leads.assigned_to', $user->id);
                    }
                })
                ->select('leads.*') // Only select fields from leads
                    ->orderBy('id', 'desc')
                    ->take(1)
                    ->get();

                $converted_leads = Lead::query()
                    ->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
                    ->where('leads.status', Lead::Documentation)
                    ->where(function ($query) use ($user, $assigned) {
                        $query->where('leads.user_id', $user->id) // Leads of logged-in user
                            ->orWhere('u.parent_id', $user->id); // Leads of user's children
            
                        // Only add this condition if parent_id is not null
                        if (!is_null($user->parent_id)) {
                            $query->orWhere('u.id', $user->parent_id); // Leads of user's parent
            
                            $query->orWhere(function ($query) use ($user) {
                                $query->where('u.parent_id', $user->parent_id) // Leads of siblings
                                    ->where('u.id', '!=', $user->id); // Exclude the logged-in user
                            });

                            // return result based on current user
                            if($assigned){
                                $query->where('leads.assigned_to', $user->id);
                            }
                        }
                    })
                    ->select('leads.*') // Only select fields from leads
                        ->orderBy('id', 'desc')
                        ->take(1)
                        ->get();
           
           

                $cold_leads = Lead::query()
                    ->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
                    ->where('leads.status', Lead::ColdLead)
                    ->where('type', 'preSales')

                    ->where(function ($query) use ($user, $assigned) {
                        $query->where('leads.user_id', $user->id) // Leads of logged-in user
                            ->orWhere('u.parent_id', $user->id); // Leads of user's children
            
                        // Only add this condition if parent_id is not null
                        if (!is_null($user->parent_id)) {
                            $query->orWhere('u.id', $user->parent_id); // Leads of user's parent
            
                            $query->orWhere(function ($query) use ($user) {
                                $query->where('u.parent_id', $user->parent_id) // Leads of siblings
                                    ->where('u.id', '!=', $user->id); // Exclude the logged-in user
                            });

                            // return result based on current user
                            if($assigned){
                                $query->where('leads.assigned_to', $user->id);
                            }
                        }
                    })
                    ->select('leads.*') // Only select fields from leads
                        ->orderBy('id', 'desc')
                        ->take(1)
                        ->get();
        

        return view('users.leads.index', compact('new_leads', 'hot_leads', 'cold_leads', 'converted_leads'));
    }
    

    /**
     * Show the form for creating a new resource.
     */
    public function create()
{
    $countries = Country::all();  // Fetch all countries
    $lead_sources = LeadSource::where('status',LeadSource::Active)->get();  // Fetch all lead sources
    $currentUser = Auth::user();  // Get the currently logged-in user
    $userId = $currentUser->id;
    
    // Query to fetch users based on parent-child-sibling relationships
    $users = User::query()
    ->where('status', User::ACTIVE) // Only active users

    ->where(function ($query) use ($currentUser) {
        // Include the current user
        $query->where('id', $currentUser->id);

        // Include the parent (admin/manager of the current user)
        if (!is_null($currentUser->parent_id)) {
            $query->orWhere('id', $currentUser->parent_id);
        }

        // Include siblings (users with the same parent)
        if (!is_null($currentUser->parent_id)) {
            $query->orWhere(function ($query) use ($currentUser) {
                $query->where('parent_id', $currentUser->parent_id)
                      ->where('id', '!=', $currentUser->id); // Exclude the current user
            });
        }

        // Include children (users where the current user is their parent)
        $query->orWhere('parent_id', $currentUser->id);
    })
    ->get();


 // Fetch all matching users

    return view('users.leads.create', compact('countries', 'lead_sources', 'users', 'currentUser'));
}

    public function getStates(Request $request, $id)
    {
        // dd(123);
        $states = States::where('country_id', $id)->pluck('name', 'id');
        return response()->json($states);
    }

    public function getCities(Request $request, $id)
    {
        $cities = City::where('state_id', $id)->pluck('name', 'id');
        return response()->json($cities);
    }
    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        // dd($request->all());
        $request->validate(['minBudget' => ['required', 'numeric', function ($attribute, $value, $fail) use ($request) {if ($value >= $request->input('maxBudget')) {$fail('The minimum budget must be less than the maximum budget.');}}], 'maxBudget' => 'required|numeric']);
     
       

        $lead = new Lead();
        if (isset($lead)) {
            $lead->title = $request->title;
            $lead->source = $request->lead_source;
            $lead->assigned_to = $request->assign_to;
            $lead->customer_id = $request->customer_id;
            $lead->salutation = $request->salutation;
            $lead->first_name = $request->first_name;
            $lead->last_name = $request->last_name;
            $lead->gender = $request->gender;
            $lead->property_interest_type = $request->property_interest_type;
            $lead->is_organization = $request->is_organization;
            $lead->organization_name = $request->organization_name;
            $lead->tags = $request->input;
            $lead->designation = $request->designation;
            $lead->budget = $request->budget;
            $lead->email_address = $request->email;
            $lead->website = $request->website;
            $lead->phone = $request->phone_number;
            $lead->mobile_number = $request->mobile_number;
            $lead->description = $request->description;
            $lead->last_contacted = $request->last_contacted;
            $lead->next_followup = $request->next_follow_up;
            $lead->address_line_1 = $request->address_line_1;
            $lead->address_line_2 = $request->address_line_2;
            $lead->country = $request->country;
            $lead->state = $request->state;
            $lead->city = $request->city;
            $lead->postal_code = $request->postal_code;
            $lead->status = $request->lead_status;
            $lead->type = $request->type;

            $lead->user_id = Auth::id();

            $lead->save();
            return redirect()->route('leads.index')->with('success', 'Lead Add Successfully');
        } else {
            return back()->with('error', 'Lead does not exist');
        }
    }

    /**
     * Display the specified resource.
     */
    public function show($id)
{
    try {
        $currentUser = auth()->user(); // Get the current logged-in user
        $lead = Lead::findOrFail($id); // Get the lead, throw an exception if not found
        $lead_notes = LeadNote::where('lead_id', $id)->get(); // Get notes related to the lead
        $customers = Customer::all(); // Fetch all customers

        // Query to fetch appropriate users for adding reminders
        $users = User::query()
          ->where('status', User::ACTIVE)
            ->where(function ($query) use ($currentUser) {
                // Include current user
                $query->where('id', $currentUser->id);
                
                // Include parent user if exists
                if (!is_null($currentUser->parent_id)) {
                    $query->orWhere('id', $currentUser->parent_id);

                    // Include siblings (users with the same parent_id, excluding current user)
                    $query->orWhere('parent_id', $currentUser->parent_id)
                          ->where('id', '!=', $currentUser->id);
                }

                // Include child users (users for whom the current user is the parent)
                $query->orWhere('parent_id', $currentUser->id);
            })
            ->get();

        // Fetch activity logs related to the lead
        $lead_activity_logs = LeadActivityLog::where('lead_id', $id)
            ->with(['lead', 'user'])
            ->get();

        // Return the view with the data
        return view('users.leads.show', compact('lead', 'lead_notes', 'customers', 'users', 'lead_activity_logs'));

    } catch (\Exception $e) {
        // Redirect back if any exception occurs, with an error message
        return redirect()->back()->with('error', 'Leads not found.');
    }
}


    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        $lead = Lead::with('city', 'state', 'country', 'user')->findOrFail($id);
        $lead_sources = LeadSource::where('status',LeadSource::Active)->get();
        $users = User::all();
        $countries = Country::all();
        $states = States::all();
        $cities = City::all();
        $currentUser = Auth::check() ? Auth::user() : '';
        return view('users.leads.edit', compact('lead', 'lead_sources', 'users', 'countries', 'states', 'cities', 'currentUser'));
    }

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

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

        $lead = Lead::find($id);
        if (isset($lead)) {
            $lead->title = $request->title;
            $lead->source = $request->lead_source;
            $lead->assigned_to = $request->assign_to;
            $lead->customer_id = $request->customer_id;
            $lead->salutation = $request->salutation;
            $lead->first_name = $request->first_name;
            $lead->last_name = $request->last_name;
            $lead->gender = $request->gender;
            $lead->property_interest_type = $request->property_interest_type;

            if ($request->has('is_organization') == '1') {
                $request->validate([
                    'organization_name' => 'required|string|max:255',
                ]);
                $lead->organization_name = $request->organization_name;
            } else {
                $lead->organization_name = null;
            }

            $lead->is_organization = $request->is_organization;
            $lead->organization_name = $request->organization_name;
            $lead->tags = $request->input;
            $lead->designation = $request->designation;
            $lead->budget = $request->budget;
            $lead->email_address = $request->email;
            $lead->website = $request->website;
            $lead->phone = $request->phone_number;
            $lead->mobile_number = $request->mobile_number;
            $lead->description = $request->description;
            $lead->last_contacted = $request->last_contacted;
            $lead->next_followup = $request->next_follow_up;
            $lead->address_line_1 = $request->address_line_1;
            $lead->address_line_2 = $request->address_line_2;
            $lead->country = $request->country;
            $lead->state = $request->state;
            $lead->city = $request->city;
            $lead->postal_code = $request->postal_code;
            $lead->status = $request->lead_status;
            if($request->lead_status == lead::Documentation) {
                $lead->type = 'postSales';
              }
            $lead->save();

            return redirect()->route('leads.index')->with('success', 'Lead has been updated successfully');
        } else {
            return back()->with('error', 'Lead does not exist');
        }
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {

        $lead = Lead::find($id);
        if (isset($lead)) {
            $lead->delete();

            LeadNote::where('lead_id', $id)->delete();

            return redirect()->route('leads.index')->with('success', 'Lead Deleted Successfully');
        } else {
            return back()->with('error', 'Lead does not exist');
        }
    }

    public function convert_to_customer(Request $request, $lead_id)
    {

        $lead = Lead::find($lead_id);
        $customer = new Customer();
        if (isset($customer)) {
            $currentUserId = getAdminId();
            $customer->created_by = $currentUserId->created_by;
            $customer->salutation = $lead->salutation;
            $customer->first_name = $lead->first_name;
            $customer->last_name = $lead->last_name;
            $customer->gender = $lead->gender;
            $customer->company = $lead->organization_name;
            $customer->position = $lead->designation;
            $customer->email_address = $lead->email_address;
            $customer->website = $lead->website;
            $customer->phone = $lead->phone;
            $customer->mobile_number = $lead->mobile_number;
            $customer->description = $lead->description;
            $customer->address_line_1 = $lead->address_line_1;
            $customer->address_line_2 = $lead->address_line_2;
            $customer->country = $lead->country;
            $customer->state = $lead->state;
            $customer->city = $lead->city;
            $customer->postal_code = $lead->postal_code;
            $customer->status = $lead->status;
            $customer->save();

            $lead = Lead::find($lead_id);
            $lead->customer_id = $customer->id;
            $lead->save();

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $lead_id;
                $lead_activity_log->activity_on = 'Convert To Customer';
                $lead_activity_log->activity = 'added';
                $lead_activity_log->created_by = $currentUserId->created_by;
                $lead_activity_log->description = $customer->first_name . $customer->last_name;
                $lead_activity_log->save();
            }

            return back()->with('success', 'Convert To Customer Successfully');
        } else {
            return back()->with('error', 'Customer does not exist');
        }
    }

    public function merge_with_customer(Request $request, $lead_id)
    {

        $customerId = $request->input('customer_id');
        $lead = Lead::find($lead_id);
        if (isset($lead_id)) {
            $lead->customer_id = $customerId;
            $lead->save();

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $lead_id;
                $lead_activity_log->activity_on = 'Add To Existing Customer';
                $lead_activity_log->activity = 'added';
                $currentUserId = getAdminId();
                $lead_activity_log->created_by = $currentUserId->created_by;
                $lead_activity_log->description = $lead->get_customer->first_name . $lead->get_customer->last_name;
                $lead_activity_log->save();
            }

            return back()->with('success', 'Add To Existing Customer Successfully');
        } else {
            return back()->with('error', 'Customer does not exist');
        }
    }

    public function addleadNotes(Request $request, $lead_id)
    {

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

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

        $lead_note = new LeadNote();
        if (isset($lead_note)) {
            $lead_note->lead_id = $lead_id;

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

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $lead_id;
                $lead_activity_log->activity_on = 'Note';
                $lead_activity_log->activity = 'added';
                $lead_activity_log->created_by = $currentUserId->created_by;

                $lead_activity_log->description = $lead_note->notes;

                $lead_activity_log->save();
            }

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

    public function leadNotes_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 = LeadNote::query();
            $query = $main_query->where('lead_id', $request->lead_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');
                })

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

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

    public function leadNotes_edit(Request $request, $lead_notes)
    {

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

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

        $lead_notes = LeadNote::find($lead_notes);
        if (isset($lead_notes)) {

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

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

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $lead_notes->lead_id;
                $lead_activity_log->activity_on = 'Note';
                $lead_activity_log->activity = 'updated';
                $lead_activity_log->created_by = $currentUserId->created_by;

                $oldValues = [];
                $newValues = [];
                $descriptionParts = []; // Initialize descriptionParts array
                $originalNote = $originalNotes; // Assuming $originalNotes is a string representing the note

                $newNote = $lead_notes->notes; // Assuming $lead_notes->notes is also a string representing the new note

                $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)) {
                    $lead_activity_log->description = implode("<br>", $descriptionParts);
                    $lead_activity_log->save();
                }
            }

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

    public function leadNotes_delete(string $id)
    {
        $lead_note = LeadNote::find($id);
        if (isset($lead_note)) {
            $leadId = $lead_note->lead_id;
            $lead_note->delete();

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $leadId;
                $lead_activity_log->activity_on = 'Notes';
                $lead_activity_log->activity = 'deleted';
                $currentUserId = getAdminId();
                $lead_activity_log->created_by = $currentUserId->created_by;
                $lead_activity_log->description = $lead_note->notes;
                $lead_activity_log->save();
            }
            return redirect()->back()->with('success-leadnote', 'Lead Notes has been deleted successfully.');
        } else {
            return back()->with('error-leadnote', 'Lead Notes does not exist');
        }
    }

    // public function updateleadNotesStatus(Request $request, $id)
    // {
    //     if ($request->has('new_status')) {
    //         $lead_notes = LeadNote::find($id);

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

    // public function uploadFile(Request $request, Lead $lead)
    // {
    //     // Validate the request
    //     $request->validate([
    //         'file' => 'required|file|mimes:jpg,png,pdf,docx|max:2048', // Adjust mime types and size limit as needed
    //         'title' => 'required|string|max:255',
    //     ]);

    //     // Check if file is uploaded
    //     if ($request->hasFile('file')) {
    //         // Get the uploaded file
    //         $file = $request->file('file');

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

    //         // Set custom property 'title'
    //         $media->setCustomProperty('title', $request->title);
    //         $media->save();

    //         // Return a response with file details
    //         return response()->json([
    //             'status' => 'success',
    //             'file' => [
    //                 'url' => $media->getUrl(),
    //                 'name' => $media->file_name,
    //                 'title' => $media->getCustomProperty('title')
    //             ]
    //         ]);
    //     }

    //     // Return an error response if no file is uploaded
    //     return response()->json(['status' => 'error', 'message' => 'No file uploaded.'], 400);
    // }

    public function upload(Request $request, Lead $lead)
    {

        $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 lead's media collection
                $media = $lead->addMedia($file)
                    ->usingFileName(time() . '_' . $file->getClientOriginalName()) // Optionally rename the file
                    ->toMediaCollection('leads');

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

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

                $lead_activity_log = new LeadActivityLog();
                if (isset($lead_activity_log)) {
                    $lead_activity_log->lead_id = $lead->id;
                    $lead_activity_log->activity_on = 'Image';
                    $lead_activity_log->activity = 'added';

                    // Ensure getAdminId() returns the correct object or value
                    $currentUser = getAdminId();
                    $lead_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>";

                    $lead_activity_log->description = $description;

                    $lead_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)
    {
        $mediaRecord = DB::table('media')->where('id', $id)->first();
        $lead_activity_log = new LeadActivityLog();

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

            // Log the deletion activity
            $lead_activity_log->lead_id = $leadId;
            $lead_activity_log->activity_on = 'Image';
            $lead_activity_log->activity = 'deleted';

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

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

            // Save the activity log entry
            $lead_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');
        }
    }

    public function addReminder(Request $request, $lead_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 = 'lead';
            $reminder->entity_id = $lead_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();

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $lead_id;
                $lead_activity_log->activity_on = 'Reminder';
                $lead_activity_log->activity = 'added';
                $lead_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>";

                $lead_activity_log->description = $description;

                $lead_activity_log->save();
            }

            return redirect()->back()->with('success-reminder', 'Lead Reminder has been Added successfully.');
        } else {
            return back()->with('error-reminder', 'Lead Reminder does not exist');
        }
    }

    public function leadReminder_index(Request $request)
    {

        if ($request->ajax()) {

            $request_data = $request->all();

            $main_query = Reminder::query();

            $query = $main_query->where('entity_type', 'lead')->where('entity_id', $request->lead_id);

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

                ->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('description', function ($row) {
            //     return $row->description;
            // })
                ->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.leads.partially.leadreminder-delete', compact('row', 'reminder', 'users'));
                    }
                })
                ->rawColumns(['action'])
                ->with([
                    "recordsTotal" => $count_total,
                    "recordsFiltered" => $count_filter,
                ])
                ->make(true);
        }

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

    public function updateReminder(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();

            $lead_activity_log = new leadActivityLog();
            if ($lead_activity_log) {
                $lead_activity_log->lead_id = $reminder->entity_id;
                $lead_activity_log->activity_on = 'Reminder';
                $lead_activity_log->activity = 'updated';
                $currentUserId = getAdminId();
                $lead_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)) {
                    $lead_activity_log->description = implode("<br> ", $descriptionParts);
                    $lead_activity_log->save();
                }
            }

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

            return back()->with('error-reminder', 'Lead Reminder does not exist.');
        }
    }

    public function leadReminder_delete(string $id)
    {

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

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $reminderId;
                $lead_activity_log->activity_on = 'Reminder';
                $lead_activity_log->activity = 'deleted';
                $currentUserId = getAdminId();
                $lead_activity_log->created_by = $currentUserId->created_by;
                $lead_activity_log->description = $lead_reminder->description;
                $lead_activity_log->save();
            }
            return redirect()->back()->with('success-datatables', 'Lead Reminder has been deleted successfully.');
        } else {
            return back()->with('error-datatables', 'Lead Reminder does not exist');
        }
    }

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

            $request_data = $request->all();

            $main_query = Task::query();

            // $query = $main_query->where('entity_type', 'lead');
            $query = $main_query->where('entity_type', 'lead')->where('entity_id', $request->lead_id);
            $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.leads.partially.leadtask-delete', compact('row', 'task', 'users'));
                    }
                })
                ->rawColumns(['action'])
                ->with([
                    "recordsTotal" => $count_total,
                    "recordsFiltered" => $count_filter,
                ])
                ->make(true);
        }

        return view('users.leads.show');
    }
    public function addleadTask(Request $request, $lead_id)
    {

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

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

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

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

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

            $task->entity_type = 'lead';
            $task->entity_id = $lead_id;
            $task->description = $request->description;
            $task->state = $request->state;
            $task->status = 1;
            $task->save();

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $lead_id;
                $lead_activity_log->activity_on = 'Task';
                $lead_activity_log->activity = 'added';
                $lead_activity_log->created_by = $currentUserId->created_by;

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

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

            return redirect()->back()->with('success-leadtask', 'Lead Task added successfully');
        } else {
            return redirect()->back()->with('error-leadtask', 'Lead Task does not exist');
        }
    }

    public function updateleadTask(Request $request, $lead_id)
    {

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

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

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

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

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

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

            $task->save();

            $lead_activity_log = new leadActivityLog();
            if ($lead_activity_log) {
                $lead_activity_log->lead_id = $task->entity_id;
                $lead_activity_log->activity_on = 'Task';
                $lead_activity_log->activity = 'updated';
                $currentUserId = getAdminId();
                $lead_activity_log->created_by = $currentUserId->created_by;

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

                // Check and log changes for Subject

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

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

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

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

                if ($originalTask['assigned_to'] !== $task->assigned_to) {
                    $originalAssignedToUser = User::find($originalTask['assigned_to']);
                    $newAssignedToUser = User::find($task->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'] !== $task->state) {
                    $oldValues['<b>State</b>'] = $originalTask['state'];
                    $newValues['<b>State</b>'] = $task->state;
                }

                if ($originalTask['description'] !== $task->description) {
                    $oldValues['<b>Description</b>'] = $originalTask['description'];
                    $newValues['<b>Description</b>'] = $task->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)) {
                    $lead_activity_log->description = implode("<br> ", $descriptionParts);
                    $lead_activity_log->save();
                }

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

    public function leadTask_delete(string $id)
    {

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

            $lead_activity_log = new leadActivityLog();
            if (isset($lead_activity_log)) {
                $lead_activity_log->lead_id = $leadId;
                $lead_activity_log->activity_on = 'Task';
                $lead_activity_log->activity = 'deleted';
                $currentUserId = getAdminId();
                $lead_activity_log->created_by = $currentUserId->created_by;
                $lead_activity_log->description = $task->subject;
                $lead_activity_log->save();
            }
            return redirect()->back()->with('success-leadtask', 'Lead Task has been deleted successfully.');
        } else {
            return back()->with('error-leadtask', 'Lead Task does not exist');
        }
    }
    public function allLeads(Request $request)
{
    $status = "all";
    if ($request->status) {
        $status = $request->status;
    }

    if ($request->ajax()) {
        $user = Auth::user();
        $authUserId = $user->id;
        $sevenDaysAgo = now()->subDays(7);

        // Custom query for each status
        if (in_array($status, [Lead::HotLead, Lead::ColdLead, Lead::NewLead, Lead::Documentation])) {
        // if (in_array($status, ['hot-lead', 'cold-lead', 'new-lead', 'documentation'])) {
            $new_leads = Lead::where('status', $status)
                ->where('created_at', '>=', $sevenDaysAgo)
                ->where(function ($query) use ($authUserId) {
                    $query->where('user_id', $authUserId)
                          ->orWhere('assigned_to', $authUserId);
                })
                ->orderBy('id', 'desc');
        } else {
            // Default query (all leads based on hierarchy)
            $new_leads = Lead::query()
                ->join('users as u', 'leads.user_id', '=', 'u.id')
                ->where('type', 'preSales')
                ->where(function ($query) use ($user) {
                    $query->where('leads.user_id', $user->id)
                          ->orWhere('u.parent_id', $user->id);

                    if (!is_null($user->parent_id)) {
                        $query->orWhere('u.id', $user->parent_id);
                        $query->orWhere(function ($query) use ($user) {
                            $query->where('u.parent_id', $user->parent_id)
                                  ->where('u.id', '!=', $user->id);
                        });
                    }
                });

            // Apply status_filter only in default case
            if ($request->status_filter) {
                $new_leads->where('leads.status', $request->status_filter);
            }

            $new_leads->select('leads.*')->orderBy('id', 'desc');
        }

        return DataTables::of($new_leads)
            ->addColumn('name', function ($row) {
                return $row->first_name . ' ' . $row->last_name;
            })
            ->addColumn('action', function ($row) {
                return  '<a href="'.route('leads.show', $row->id) .'" class="btn btn-sm btn-dark" title="show"><i class="fa fa-eye"></i></a>
                         <a href="'. route('leads.edit', $row->id) .'" class="btn btn-sm btn-dark" title="Edit"><i class="fa fa-pencil-alt"></i></a>';
            })
            ->rawColumns(['action'])
            ->make(true);
    }

    return view('users.leads.leads_all', compact('status'));
}
//     public function allLeads(Request $request)
//     {
//         $status = "all";
//         if ($request->status) {
//             $status = $request->status;
//         }
//         if ($request->ajax()) {
//             $user = Auth::user();
//             $new_leads = Lead::query()
//             ->join('users as u', 'leads.user_id', '=', 'u.id') // Join users table
//             ->where('type', 'preSales')

//             ->where(function ($query) use ($user) {
//                 $query->where('leads.user_id', $user->id) // Leads of logged-in user
//                     ->orWhere('u.parent_id', $user->id); // Leads of user's children

//                 // Only add this condition if parent_id is not null
//                 if (!is_null($user->parent_id)) {
//                     $query->orWhere('u.id', $user->parent_id); // Leads of user's parent

//                     $query->orWhere(function ($query) use ($user) {
//                         $query->where('u.parent_id', $user->parent_id) // Leads of siblings
//                             ->where('u.id', '!=', $user->id); // Exclude the logged-in user
//                     });
//                 }

//             });
//             if ($request->status_filter) {
//                 $new_leads->where('leads.status', $request->status_filter);
//             }

//             $new_leads->select('leads.*') // Only select fields from leads
//             ->orderBy('id', 'desc');

//             return DataTables::of($new_leads)

//                 ->addColumn('name', function ($row) {
//                     return $row->first_name.' '.$row->last_name;
//                 })

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

//                     return  '<a href="'.route('leads.show', $row->id) .'" class="btn btn-sm btn-dark" title="show"><i class="fa fa-eye"></i></a>
//                     <a href="'. route('leads.edit', $row->id) .'" class="btn btn-sm btn-dark" title="Edit"><i
//         class="fa fa-pencil-alt"></i></a>';
//                     // return view('users.leads.partially.delete', compact('row'));
//                 })
//                 ->rawColumns(['action'])
                
//                 ->make(true);
//         }

//         return view('users.leads.leads_all', compact('status'));
//     }
// }
}