<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\LeadCreateFormRequest;
use App\Http\Requests\LeadUpdateFormRequest;
use App\Models\Lead;
use App\Models\User;
use App\Models\Countries;
use App\Models\Followup;
use Illuminate\Validation\ValidationException;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;


class LeadController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        abort_if(!userCan('lead.view'), 403);

        $sourceOptions = Lead::distinct()->pluck('source');
        $query = Lead::query();

        // $query = Lead::query()->groupBy('email', 'phone', 'source')->havingRaw('COUNT(*) > 1');

        $name = $request->input('name');
        $email = $request->input('email');
        $source = $request->input('source');
        $phone = $request->input('phone');
        // $date = $request->input('date');
        $country = $request->input('country');
        $dateRange = $request->input('daterange');

        if ($name) {
            $query->where('name', 'LIKE', '%' . $name . '%');
        }

        if ($email) {
            $query->where('email', 'LIKE', '%' . $email . '%');
        }

        if ($source) {
            $query->where('source', 'LIKE', '%' . $source . '%');
        }

        if ($phone) {
            $query->where('phone', 'LIKE', '%' . $phone . '%');
        }
        if ($dateRange) {
            $dates = explode(' - ', $dateRange);
            $startDate = Carbon::createFromFormat('m/d/Y', $dates[0])->startOfDay();
            $endDate = Carbon::createFromFormat('m/d/Y', $dates[1])->endOfDay();
            $query->whereBetween('created_at', [$startDate, $endDate]);
        }

        if ($country) {
            $query->where('country_id', 'LIKE', '%' . $country . '%');
        }
        // $query->groupBy('email','name','source','phone');
        $leadsCount = $query->count();
        $perPage = 10;
        // $leads = $query->paginate($perPage);
        $leads = $query->orderBy('created_at', 'desc')->paginate($perPage);
        $leads->appends($request->query());


    //     $leads = Lead::selectRaw('*, COUNT(*) as id')
    //     ->groupBy('email')
    //     ->get();

    // dd($leads);
        
  
        

        return view('admin.leads.index', compact('leads', 'leadsCount', 'sourceOptions'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        abort_if(!userCan('lead.create'), 403);
        $countries = Countries::all();
        $candidates = User::select(['id', 'name'])->where('role','candidate')->get();
        return view('admin.leads.create', compact('countries','candidates'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(LeadCreateFormRequest $request)
    {
        abort_if(!userCan('lead.create'), 403);
        try {

            Lead::create([
                'name' => $request->name,
                'email' => $request->email,
                'country_id' => $request->country_id,
                'phone' =>  $request->phone,
                'source' => $request->source,
                'user_id' => $request->user_id,
                'url' => "/admin/lead/create",

            ]);
            flashSuccess(__('lead_created_successfully'));
            return redirect()->route('lead.index');
        } catch (\Throwable $th) {
            return redirect()->back()->with('error', config('app.debug') ? $th->getMessage() : 'Something went wrong');
        }
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        dd("show");
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */

    public function edit($id)
    {
        abort_if(!userCan('lead.update'), 403);
        $followups = Followup::latest()->where('lead_id', $id)->get();
        $leads = Lead::where('id', $id)->first();
        $candidates = User::select(['id', 'name'])->where('role','candidate')->get();
        if (!empty($leads->country_id)) {
            $country_array = explode("@#$?", $leads->country_id);
            $country_name = reset($country_array);
            $country_code = end($country_array);
        } else {
            $country_name = NULL;
            $country_code = NULL;
        }

        $countries = Countries::all();
        return view('admin.leads.edit', compact('leads', 'countries', 'country_name', 'country_code', 'followups','candidates'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(LeadUpdateFormRequest $request, $id)
    {
        abort_if(!userCan('lead.update'), 403);
        try {
            $leads = Lead::where('id', $id)->first();
            $leads->update([
                'name' => $request->name,
                'email' => $request->email,
                'country_id' => $request->country_id,
                // 'description' => $request->description,
                'phone' =>  $request->phone,
                'source' => $request->source,
                'url' => $leads->url
            ]);
            flashSuccess(__('lead_created_successfully'));
            return redirect()->route('lead.index');
        } catch (\Throwable $th) {
            return redirect()->back()->with('error', config('app.debug') ? $th->getMessage() : 'Something went wrong');
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        abort_if(!userCan('lead.delete'), 403);
        $leads = Lead::where('id', $id)->first();
        $leads->delete();

        flashSuccess(__('lead_deleted_successfully'));
        return back();
    }

    public function storeFollowup(Request $request, $id)
    {
        // dd($request->all());
        // Validate the form data
        $validatedData = $request->validate([
            'comment' => 'required',
            'type' => 'required',
            'followup_up' => 'required',
            'datetime' => $request->input('followup_up') == 'yes' ? 'required' : ''
        ]);

        // Create a new Followup model instance
        // $followup = new Followup();
        // $followup->lead_id = 5;
        // $followup->comment = "rrrrr";
        // $followup->type = "rrrrr";
        // $followup->followup_up = "rrrrr";
        // $followup->save();
        // die;
        $followup = new Followup();
        $followup->lead_id = $id;
        // $followup->comment = $request->comment;
        // $followup->type = $request->type;
        // $followup->followup_up = $request->followup_up;
        // $followup->datetime = $request->datetime;
        $followup->comment = $validatedData['comment'];
        $followup->type = $validatedData['type'];
        $followup->followup_up = $validatedData['followup_up'];

        // If followup_up is 'yes', set the datetime
        if ($validatedData['followup_up'] == 'yes') {
            $followup->datetime = $request->input('datetime');
        }

        // Save the followup
        $followup->save();

        flashSuccess(__('lead_created_successfully'));
        return back();
        // Return a response indicating success
        return response()->json(['message' => 'Followup saved successfully']);
    }
}
