<?php

namespace App\Http\Controllers;

use App\Models\Events;
use App\Models\Lists;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class EventController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }
    
    public function index(Request $request)
    {
        $query = Events::query();

        if ($request->filled('city')) {
            $query->whereHas('list', function ($q) use ($request) {
                $q->where('city', $request->city);
            });
        }

        if ($request->filled('list_id')) {
            $query->where('lists_id', $request->list_id);
        }

        if ($request->filled('search')) {
            $search = $request->search;
            $query->where(function ($q) use ($search) {
                $q->where('description', 'like', "%{$search}%")
                    ->orWhereHas('list', function ($q) use ($search) {
                        $q->where('title', 'like', "%{$search}%")
                            ->orWhere('short_title', 'like', "%{$search}%");
                    })
                    ->orWhere('short_title', 'like', "%{$search}%")
                    ->orWhere('price', 'like', "%{$search}%");
            });
        }

        $events = $query->get();
        $cities = Lists::select('city')->distinct()->pluck('city');
        $lists = Lists::all();

        return view('events.index', compact('events', 'cities', 'lists'));
    }


    public function index1(Request $request)
    {
        $query = Events::with('list'); // Eager load the list relationship

        if ($request->has('city') && $request->city != '') {
            $listIds = Lists::where('city', $request->city)->pluck('id');
            $query->whereIn('lists_id', $listIds);
        }

        if ($request->has('list_id') && $request->list_id != '') {
            $query->where('lists_id', $request->list_id);
        }

        if ($request->has('search') && $request->search != '') {
            $query->where(function ($q) use ($request) {
                $q->whereHas('list', function ($q2) use ($request) {
                    $q2->where('title', 'like', '%' . $request->search . '%')
                       ->orWhere('short_title', 'like', '%' . $request->search . '%');
                })
                ->orWhere('description', 'like', '%' . $request->search . '%')
                ->orWhere('short_title', 'like', '%' . $request->search . '%')
                ->orWhere('price', 'like', '%' . $request->search . '%');
            });
        }

        $events = $query->get();
        $cities = Lists::distinct()->pluck('city');

        return view('events.index', compact('events', 'cities'));
    }

    
    public function filterByList($list_id)
    {
        $events = Events::where('lists_id', decrypt($list_id))->get();

        $cities = Lists::select('city')->distinct()->pluck('city');
        $lists = Lists::all();
        
        return view('events.index', compact('events', 'cities', 'lists'));
    }

    public function getEvents()
    {
        // $events = Events::all();
        $events = Events::with('list')->whereHas('list')->get();
        return view('events.index', compact('events'));
        
    }

    public function getListsByCity($city)
    {
        $lists = Lists::where('city', decrypt($city))->get();
        return response()->json($lists);
    }

    public function getListsByCityRequest(Request $request)
    {
        $lists = Lists::where('city', $request->city)->pluck('title', 'id');
        return response()->json($lists);
    }


    public function getEventsByList($list_id)
    {
        $events = Events::where('lists_id', $list_id)->get();
        return response()->json($events);
    }



    public function createEvent()
    {
        // $lists = Lists::all();
        $cities = Lists::select('city')->distinct()->get();
        return view('events.create', compact('cities'));
    }

    public function saveEvent(Request $request)
    {
        $request->validate([
            'lists_id' => 'required|exists:lists,id',
            'description' => 'required|string',
            'short_title' => 'required|string|max:255',
            'price' => 'required|string|max:255',
            'imageURL' => 'nullable|file|image|max:10240' // 10MB Max
        ]);

        $data = $request->except('imageURL');

        if ($request->hasFile('imageURL')) {
            $path = $request->file('imageURL')->store('events', 's3');
            $url = Storage::disk('s3')->url($path);
            $data['imageURL'] = $url;
        }

        Events::create($data);
        return redirect()->route('events')->with('success', 'Event created successfully.');
    }

    public function viewEvent($event_id)
    {
        $event = Events::findOrFail(decrypt($event_id));
        return view('events.view', compact('event'));
    }

    public function editEvent($event_id)
    {
        $event = Events::findOrFail(decrypt($event_id));
        $lists = Lists::all();
        return view('events.edit', compact('event', 'lists'));
    }

    public function updateEvent(Request $request, $event_id)
    {
        $request->validate([
            'lists_id' => 'required|exists:lists,id',
            'description' => 'required|string',
            'short_title' => 'required|string|max:255',
            'price' => 'required|string|max:255',
            'imageURL' => 'nullable|file|image|max:10240' // 10MB Max
        ]);

        $event = Events::findOrFail(decrypt($event_id));
        $data = $request->except('imageURL');

        if ($request->hasFile('imageURL')) {
            // Delete the old image if it exists
            if ($event->imageURL) {
                Storage::disk('s3')->delete(parse_url($event->imageURL, PHP_URL_PATH));
            }

            $path = $request->file('imageURL')->store('events', 's3');
            $url = Storage::disk('s3')->url($path);
            $data['imageURL'] = $url;
        }

        $event->update($data);
        
        return redirect()->route('events')->with('success', 'Event updated successfully.');
    }

    public function deleteEvent($event_id)
    {
        $event = Events::findOrFail(decrypt($event_id));
        $event->delete();

        return redirect()->route('events')->with('success', 'Event deleted successfully.');
    }
}
