/home2/mshostin/carnival.ms-hostingladz.com/app/Http/Controllers/EventsCountryTabController.php
<?php

namespace App\Http\Controllers;

use App\Models\EventsCountryTab;
use App\Models\Event;
use App\Models\Country;
use App\Models\City;
use App\Models\Carnival;
use Exception;
use Illuminate\Http\Request;

class EventsCountryTabController extends Controller
{
    public function index()
    {
        $eventsCountryTabs = EventsCountryTab::with('carnival', 'country', 'city')->orderBy('carnival_id')->get();
        return view('dashboard.admin.events_country_tabs.index', compact('eventsCountryTabs'));
    }

    public function create()
    {
        $carnivals = Carnival::all();
        $countries = Country::all();
        return view('dashboard.admin.events_country_tabs.create', compact('carnivals', 'countries'));
    }

    public function store(Request $request)
    {

        // Get all existing placements for the selected carnival
        $existingPlacements = EventsCountryTab::where('carnival_id', $request->carnival_id);
        if ($request->has('placement') && $request->placement != null) {
            if ($request->placeWhere == "Place Before") {
                $existingPlacements = $existingPlacements->where('placement', '>=', $request->placement)->get();
                $placement = $request->placement;
                foreach ($existingPlacements as $row) {
                    $row->placement = (int)$row->placement + 1;
                    $row->save();
                }
            } else {
                $placement = (int)$request->placement + 1;
                $existingPlacements = $existingPlacements->where('placement', '>', $request->placement)->get();
                foreach ($existingPlacements as $row) {
                    $row->placement = (int)$row->placement + 1;
                    $row->save();
                }
            }
            $request->merge(['placement' => $placement]);
        }
        else
        {
            $placement = 0;
            $request->merge(['placement' => $placement]);

        }

        if($existingPlacements != null)
        {
            $request->validate([
                'placement' => 'required',
            ]);
        }
        $request->validate([
            'carnival_id' => 'required|exists:carnivals,id',
            'country_id' => 'required|exists:country,id',
            'city_id' => 'required|exists:city,id',
            'tab' => 'required|string|max:255',
            'file.*' => 'nullable|file|mimes:jpeg,png,jpg,gif,mp4,mov,avi',
            'content' => 'nullable|string',
            'status' => 'required|boolean',

            // 'placement' => 'required|integer|unique:events_country_tabs,placement',
        ]);

        try {
            $data = $request->except('file');
            $eventCountryTab = EventsCountryTab::create($data);

            if ($request->hasFile('file')) {
                foreach ($request->file('file') as $file) {
                    $fileName = time() . '-' . uniqid() . '.' . $file->extension();
                    $file->move(public_path('file'), $fileName);

                    $fileType = str_starts_with($file->getClientMimeType(), 'image/') ? 'image' : 'video';

                    $eventCountryTab->images()->create([
                        'file' => $fileName,
                        'file_type' => $fileType,
                    ]);
                }
            }

            return redirect()->route('events_country_tabs.index')
                ->with('success', 'Event Country Tab created successfully.');
        } catch (Exception $ex) {
            return redirect()->back()->with('error', $ex->getMessage());
        }
    }

    public function show(EventsCountryTab $eventsCountryTab)
    {
        return view('dashboard.admin.events_country_tabs.show', compact('eventsCountryTab'));
    }

    public function edit(EventsCountryTab $eventsCountryTab)
    {
        $carnivals = Carnival::all();
        $countries = Country::all();
        $cities = City::where('country_id', $eventsCountryTab->country_id)->get();
        $placements = EventsCountryTab::where('carnival_id', $eventsCountryTab->carnival_id)->get();
        return view('dashboard.admin.events_country_tabs.edit', compact('eventsCountryTab', 'carnivals', 'countries', 'cities', 'placements'));
    }

    public function update(Request $request, EventsCountryTab $eventsCountryTab)
    {


        $request->validate([
            'carnival_id' => 'required|exists:carnivals,id',
            'country_id' => 'required|exists:country,id',
            'city_id' => 'required|exists:city,id',
            'tab' => 'required|string|max:255',
            'file.*' => 'nullable|file|mimes:jpeg,png,jpg,gif,mp4,mov,avi',
            'content' => 'nullable|string',
            'status' => 'required|boolean',
            'placement' => 'required',
        ]);

        try {
            if ($eventsCountryTab->placement != $request->placement) {
                $existingPlacements = EventsCountryTab::where('carnival_id', $request->carnival_id);
                if ($request->placeWhere == "Place Before") {
                    $existingPlacements = $existingPlacements->where('placement', '>=', $request->placement)->get();
                    $placement = $request->placement;
                    foreach ($existingPlacements as $row) {
                        $row->placement = (int)$row->placement + 1;
                        $row->save();
                    }
                } else {
                    $placement = (int)$request->placement + 1;
                    $existingPlacements = $existingPlacements->where('placement', '>', $request->placement)->get();
                    foreach ($existingPlacements as $row) {
                        $row->placement = (int)$row->placement + 1;
                        $row->save();
                    }
                }
                $request->merge(['placement' => $placement]); // Update request with unique placement
            }

            $data = $request->except('file');
            $eventsCountryTab->update($data);

            if ($request->hasFile('file')) {
                // Delete existing images
                foreach ($eventsCountryTab->images as $image) {
                    $imagePath = public_path('file/' . $image->file);
                    if (file_exists($imagePath)) {
                        unlink($imagePath);
                    }
                    $image->delete();
                }

                // Store the new images
                foreach ($request->file('file') as $file) {
                    $fileName = time() . '-' . uniqid() . '.' . $file->extension();
                    $file->move(public_path('file'), $fileName);

                    $fileType = str_starts_with($file->getClientMimeType(), 'image/') ? 'image' : 'video';

                    $eventsCountryTab->images()->create([
                        'file' => $fileName,
                        'file_type' => $fileType,
                    ]);
                }
            }

            return redirect()->route('events_country_tabs.index')
                ->with('success', 'Event Country Tab updated successfully.');
        } catch (Exception $ex) {
            return redirect()->back()->with('error', $ex->getMessage());
        }
    }

    // public function update(Request $request, EventsCountryTab $eventsCountryTab)
    // {
    //     $request->validate([
    //         'carnival_id' => 'required|exists:carnivals,id',
    //         'country_id' => 'required|exists:country,id',
    //         'city_id' => 'required|exists:city,id',
    //         'tab' => 'required|string|max:255',
    //         'file.*' => 'nullable|file|mimes:jpeg,png,jpg,gif,mp4,mov,avi',
    //         'content' => 'nullable|string',
    //         'status' => 'required|boolean',
    //         'placement' => 'required|integer|unique:events_country_tabs,placement,' . $eventsCountryTab->id,
    //     ]);

    //     try {
    //         $data = $request->except('file');

    //         $eventsCountryTab->update($data);

    //         if ($request->hasFile('file')) {
    //             // Delete existing images
    //             foreach ($eventsCountryTab->images as $image) {
    //                 // Delete the file from the filesystem
    //                 $imagePath = public_path('file/' . $image->file);
    //                 if (file_exists($imagePath)) {
    //                     unlink($imagePath);
    //                 }

    //                 // Delete the image record from the database
    //                 $image->delete();
    //             }

    //             // Now store the new images
    //             foreach ($request->file('file') as $file) {
    //                 $fileName = time() . '-' . uniqid() . '.' . $file->extension();
    //                 $file->move(public_path('file'), $fileName);

    //                 $fileType = str_starts_with($file->getClientMimeType(), 'image/') ? 'image' : 'video';

    //                 // Create new image record
    //                 $eventsCountryTab->images()->create([
    //                     'file' => $fileName,
    //                     'file_type' => $fileType,
    //                 ]);
    //             }
    //         }

    //         return redirect()->route('events_country_tabs.index')
    //             ->with('success', 'Event Country Tab updated successfully.');
    //     } catch (Exception $ex) {
    //         return redirect()->back()->with('error', $ex->getMessage());
    //     }
    // }

    public function destroy(EventsCountryTab $eventsCountryTab)
    {
        $eventsCountryTab->delete();

        return redirect()->route('events_country_tabs.index')
            ->with('success', 'Event Country Tab deleted successfully.');
    }
    public function getCitiesByCountry($country_id)
    {
        $cities = City::where('country_id', $country_id)->get();
        return response()->json($cities);
    }
    public function getPlacementByCarnival($carnival_id)
    {
        $tabs = EventsCountryTab::where('carnival_id', $carnival_id)->get();
        return response()->json($tabs);
    }
}