<?php

namespace App\Http\Controllers;

use App\Models\Lead;
use App\Models\Contact;
use App\Models\User;
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()
    {
        $contacts = Contact::orderBy('first_name')->get();
        $users = User::where('is_active', true)->get();
        return view('leads.create', compact('contacts', 'users'));
    }

    public function store(Request $request)
    {
        $data = $request->validate([
            'source' => 'nullable|string',
            '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',
        ]);

        // 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,
            '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,
        ]);

        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(Lead $lead)
    {
        $contacts = Contact::orderBy('first_name')->get();
        $users = User::where('is_active', true)->get();
        return view('leads.edit', compact('lead', 'contacts', 'users'));
    }

    public function update(Request $request, Lead $lead)
    {
        $lead->update($request->only([
            'status', 'priority', 'source', 'notes', 'internal_notes',
            'project_type', 'budget_range', 'expected_start', 'description',
        ]));
        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}.");
    }
}
