<?php

namespace App\Http\Controllers;
use App\Models\Appointment;
use App\Models\FollowUp;
use App\Models\Lead;
use App\Models\Contact;
use App\Models\User;
use App\Models\Showroom;
use App\Models\Brand;
use App\Models\ActivityLog;
use Illuminate\Http\Request;

class LeadController extends Controller
{
    public function index(Request $request)
    {
        $query = Lead::with(['contact', 'assignedTo']);

        if ($request->status && $request->status !== 'all') {
            $query->where('status', $request->status);
        }
        if ($request->search) {
            $query->where(function ($q) use ($request) {
                $q->where('lead_number', 'like', '%'.$request->search.'%')
                  ->orWhereHas('contact', fn($c) => $c->where('first_name', 'like', '%'.$request->search.'%')
                    ->orWhere('last_name', 'like', '%'.$request->search.'%')
                    ->orWhere('email', 'like', '%'.$request->search.'%'));
            });
        }

        $allowedSorts = ['lead_number', 'enquiry_date', 'created_at'];
        $sortBy  = in_array($request->sort_by, $allowedSorts, true) ? $request->sort_by : 'created_at';
        $sortDir = $request->sort_dir === 'asc' ? 'asc' : 'desc';
        $leads = $query->orderBy($sortBy, $sortDir)->paginate(20)->withQueryString();

        $stats = [
            'all' => Lead::count(),
            'new' => Lead::where('status', 'new')->count(),
            'consult_booked' => Lead::where('status', 'consult_booked')->count(),
            'on_hold' => Lead::where('status', 'on_hold')->count(),
            'lost' => Lead::where('status', 'lost')->count(),
            'sold' => Lead::where('status', 'sold')->count(),
            'converted' => Lead::where('status', 'converted')->count(),
        ];

        $selectedLead = null;
        if ($request->selected) {
            $selectedLead = Lead::with(['contact', 'assignedTo'])->find($request->selected);
        }

        return view('leads.index', compact('leads', 'stats', 'selectedLead'));
    }

    public function create()
    {
        $designers = \App\Models\User::where('role_id', '12')
                        ->orderBy('name')->get();   
        $contacts  = Contact::orderBy('first_name')->get();
        $users     = User::where('is_active', true)->get();
        $showrooms = Showroom::where('is_active', true)->orderBy('name')->get();
        $brands    = Brand::where('is_active', true)->orderBy('name')->get();
        return view('leads.create', compact('contacts', 'users', 'showrooms', 'brands', 'designers'));
    }

    public function store(Request $request)
    {
        $data = $request->validate([
            'source'            => 'nullable|string',
            'showroom_id'       => 'nullable|exists:showrooms,id',
            'brand_id'          => 'nullable|exists:brands,id',
            'status'            => 'required|string',
            'priority'          => 'required|string',
            'enquiry_date'      => 'nullable|date',
            'preferred_contact' => 'nullable|string',
            'notes'             => 'nullable|string',
            'title'             => 'nullable|string',
            'first_name'        => 'required|string',
            'last_name'         => 'required|string',
            'email'             => 'nullable|email',
            'phone'             => 'nullable|string',
            'company'           => 'nullable|string',
            'site_address'      => 'nullable|string',
            'site_suburb'       => 'nullable|string',
            'site_state'        => 'nullable|string',
            'site_postcode'     => 'nullable|string',
            'project_type'      => 'nullable|string',
            'budget_range'      => 'nullable|string',
            'expected_start'    => 'nullable|date',
            'description'       => 'nullable|string',
            'designer_id'  => 'nullable|exists:users,id',
            'booking_date' => 'nullable|date',
        ]);

        // Create or find contact
        $contact = Contact::create([
            'title' => $data['title'] ?? null,
            'first_name' => $data['first_name'],
            'last_name' => $data['last_name'],
            'email' => $data['email'] ?? null,
            'phone' => $data['phone'] ?? null,
            'company' => $data['company'] ?? null,
            'type' => 'client',
        ]);

        $lead = Lead::create([
            'lead_number'       => 'L-' . str_pad((Lead::withTrashed()->max('id') ?? 0) + 1, 4, '0', STR_PAD_LEFT),
            'contact_id'        => $contact->id,
            'source'            => $data['source'] ?? null,
            'showroom_id'       => $data['showroom_id'] ?? null,
            'brand_id'          => $data['brand_id'] ?? null,
            'status'            => $data['status'],
            'priority'          => $data['priority'],
            'enquiry_date'      => $data['enquiry_date'] ?? null,
            'preferred_contact' => $data['preferred_contact'] ?? null,
            'notes'             => $data['notes'] ?? null,
            'site_address'      => $data['site_address'] ?? null,
            'site_suburb'       => $data['site_suburb'] ?? null,
            'site_state'        => $data['site_state'] ?? null,
            'site_postcode'     => $data['site_postcode'] ?? null,
            'project_type'      => $data['project_type'] ?? null,
            'budget_range'      => $data['budget_range'] ?? null,
            'expected_start'    => $data['expected_start'] ?? null,
            'description'       => $data['description'] ?? null,
            'designer_id'       => $data['designer_id'] ?? null,
            'booking_date'      => $data['booking_date'] ?? null,
        ]);

        return redirect()->route('leads.index')->with('success', 'Lead created successfully.');
    }

    public function show(Lead $lead)
    {
        $lead->load(['contact', 'assignedTo']);
        return view('leads.show', compact('lead'));
    }

    public function edit(\App\Models\Lead $lead)
    {
        $lead->load(['appointments.designer', 'followUps', 'designer']);

        $designers = \App\Models\User::where('role_id', 12)
                        ->orderBy('name')->get();
        $contacts  = Contact::orderBy('first_name')->get();
        $users     = User::where('is_active', true)->get();
        $showrooms = Showroom::where('is_active', true)->orderBy('name')->get();
        $brands    = Brand::where('is_active', true)->orderBy('name')->get();
        return view('leads.edit', compact('lead', 'contacts', 'users', 'showrooms', 'brands', 'designers'));
    }

    public function update(Request $request, Lead $lead)
    {
        $request->validate([
            'showroom_id' => 'nullable|exists:showrooms,id',
            'brand_id'    => 'nullable|exists:brands,id',
            
            'designer_id'  => 'nullable|exists:users,id',
            'booking_date' => 'nullable|date',
        ]);
        $lead->update($request->only([
            'status', 'priority', 'source', 'showroom_id', 'brand_id',
            'notes', 'internal_notes',
            'project_type', 'budget_range', 'expected_start', 'description',
            'designer_id', 'booking_date',

        ]));
        return redirect()->route('leads.index')->with('success', 'Lead updated.');
    }

    public function destroy(Lead $lead)
    {
        $lead->delete();
        return redirect()->route('leads.index')->with('success', 'Lead deleted.');
    }

    public function convertToJob(Lead $lead)
    {
        if ($lead->status === 'converted') {
            return back()->with('error', 'Lead has already been converted.');
        }

        // Safely extract a numeric budget from a text range like "$20k - $35k"
        $budget = null;
        if ($lead->budget_range) {
            preg_match('/[\d,]+/', str_replace(['$', 'k', 'K'], ['', '000', '000'], $lead->budget_range), $m);
            $budget = isset($m[0]) ? (float) str_replace(',', '', $m[0]) : null;
        }

        $job = \App\Models\Job::create([
            'job_number'    => 'J-' . str_pad((\App\Models\Job::withTrashed()->max('id') ?? 0) + 1, 4, '0', STR_PAD_LEFT),
            'contact_id'    => $lead->contact_id,
            'consultant_id' => $lead->assigned_to,
            'lead_id'       => $lead->id,
            'stage'         => 'consult',
            'status'        => 'active',
            'priority'      => $lead->priority ?? 'medium',
            'project_type'  => $lead->project_type,
            'description'   => $lead->description,
            'notes'         => $lead->notes,
            'budget'        => $budget,
        ]);

        $lead->update(['status' => 'converted']);

        ActivityLog::create([
            'user_id'       => auth()->id(),
            'loggable_type' => 'Lead',
            'loggable_id'   => $lead->id,
            'action'        => 'Converted to Job',
            'description'   => "Lead converted to job {$job->job_number}",
        ]);

        return redirect()->route('jobs.show', $job)->with('success', "Lead converted to job {$job->job_number}.");
    }

    public function storeAppointment(\Illuminate\Http\Request $request, \App\Models\Lead $lead)
    {
        $validated = $request->validate([
            'appointment_with'     => 'nullable|string|max:255',
            'both_available'       => 'required|in:Yes,No',
            'appointment_date'     => 'nullable|date',
            'appointment_time'     => 'nullable|date_format:H:i',
            'designer_id'          => 'nullable|exists:users,id',
            'appointment_fee'      => 'nullable|numeric|min:0',
            'appointment_location' => 'nullable|string|max:255',
            'note'                 => 'nullable|string',
        ]);

        $lead->appointments()->create($validated);

        return redirect()->route('leads.edit', $lead)
            ->with('success', 'Appointment added successfully.');
    }

     public function destroyAppointment(\App\Models\Lead $lead, \App\Models\Appointment $appointment)
    {
        abort_if($appointment->lead_id !== $lead->id, 403);
        $appointment->delete();

        return redirect()->route('leads.edit', $lead)
            ->with('success', 'Appointment deleted.');
    }

     public function storeFollowUp(\Illuminate\Http\Request $request, \App\Models\Lead $lead)
    {
        $validated = $request->validate([
            'follow_up_type' => 'required|in:Online Meeting,Offline Meeting,On Call Meeting',
            'follow_up_date' => 'nullable|date',
            'follow_up_time' => 'nullable|date_format:H:i',
            'feedback'       => 'nullable|string',
        ]);

        $lead->followUps()->create($validated);

        return redirect()->route('leads.edit', $lead)
            ->with('success', 'Follow-up added successfully.');
    }

    public function destroyFollowUp(\App\Models\Lead $lead, \App\Models\FollowUp $followUp)
    {
        abort_if($followUp->lead_id !== $lead->id, 403);
        $followUp->delete();

        return redirect()->route('leads.edit', $lead)
            ->with('success', 'Follow-up deleted.');
    }
}
