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

namespace App\Http\Controllers;

use App\Models\Carnival;
use App\Models\Region;
use App\Models\User;
use App\Models\Vendor;
use App\Models\CarnivalMembers;
use App\Models\Country;
use App\Models\CarnivalImages;
use App\Models\CarnivalBannerImages;
use App\Models\City;
use App\Models\Package;
use App\Models\SubVendor;
use App\Models\CarnivalFlyerImages;
use App\Models\Event;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Str;

class CarnivalController extends Controller
{
    public function validation(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'region_id' => 'required|exists:regions,id',
            'country_id' => 'required|exists:country,id',
            'start_date' => 'required|date|after_or_equal:today',
            'end_date' => 'required|date|after_or_equal:start_date',
        ]);
    }
    public function index()
    {
        $carnivals = Carnival::with(['user', 'regions'])->get();
        $region = Region::all();
        $countries = Country::all();
        $cities = City::all();
        $events = Event::select('id', 'name', 'start_date')->get();
        $mascamps = Vendor::with('user')->get();
        $packages = Package::all();

        $vendorsByPackage = [];

        foreach ($packages as $package) {
            $key = str_replace([' ', '-'], '', $package->title); // Clean key
            $vendorsByPackage[$key] = Vendor::whereHas('package', function ($query) use ($package) {
                $query->where('title', $package->title);
            })->with('user')->get();
        }

        return view('dashboard.admin.carnivals.index', compact(
            'region',
            'carnivals',
            'mascamps',
            'countries',
            'cities',
            'packages',
            'vendorsByPackage',
            'events'
        ));
    }

    // public function index()
    // {
    //     // $carnivals = Carnival::with('mascamps.user', 'user', 'regions')->find(53);
    //     // dd($carnivals->toArray());
    //     $carnivals = Carnival::with('mascamps.user', 'user', 'regions')->get();
    //     $mascamps = Vendor::with('user')->get();
    //     $region = Region::all();
    //     $countries = Country::all();
    //     $cities = City::all();
    //     $packages = Package::all();
    //     $Models = Vendor::whereHas('package', function ($query) {
    //         $query->where('title', 'Models');
    //     })->with('user')->get();

    //     $DJs = Vendor::whereHas('package', function ($query) {
    //         $query->where('title', 'DJs');
    //     })->with('user')->get();

    //     $Artistes = Vendor::whereHas('package', function ($query) {
    //         $query->where('title', 'Artistes');
    //     })->with('user')->get();

    //     $Events = Vendor::whereHas('package', function ($query) {
    //         $query->where('title', 'Events');
    //     })->with('user')->get();

    //     $Blogger = Vendor::whereHas('package', function ($query) {
    //         $query->where('title', 'Blogger');
    //     })->with('user')->get();

    //     $CarnivalCommittees = Vendor::whereHas('package', function ($query) {
    //         $query->where('title', 'Carnival Committees');
    //     })->with('user')->get();

    //     $EventPromoters = Vendor::whereHas('package', function ($query) {
    //         $query->where('title', 'Event Promoters');
    //     })->with('user')->get();

    //     $MasBandsLeader = Vendor::whereHas('package', function ($query) {
    //         $query->where('title', 'MasBands - Leader');
    //     })->with('user')->get();

    //     return view('dashboard.admin.carnivals.index', compact(
    //         'region',
    //         'carnivals',
    //         'mascamps',
    //         'countries',
    //         'cities',
    //         'packages',
    //         'Models',
    //         'DJs',
    //         'Artistes',
    //         'Events',
    //         'Blogger',
    //         'CarnivalCommittees',
    //         'EventPromoters',
    //         'MasBandsLeader',
    //     ));
    // }

    public function create()
    {
        return view('carnivals.create');
    }

    public function store(Request $request)
    {
        $this->validation($request);
        try {
            $uniqueId = $this->generateUniqueId();

            $slug = $request->name . '-' . $uniqueId;

            $carnivals = Carnival::create([
                'unique_id' => $uniqueId,
                'head' => $request->head ?? 0,
                'name' => $request->name,
                'start_date' => $request->start_date,
                'slug' => $slug,
                'end_date' => $request->end_date,
                'region_id' => $request->region_id,
                'country_id' => $request->country_id,
                'city_id' => $request->city_id,
                'description' => $request->description,
                'link' => 'https://carnival.ms-hostingladz.com/register/new/user/' . $uniqueId,
            ]);

            if ($request->hasFile('images')) {
                foreach ($request->file('images') as $image) {
                    $imageName = time() . '.' . $image->extension();
                    $image->move(public_path('images/carnivalImages'), $imageName);
                    CarnivalImages::create([
                        'carnival_id' => $carnivals->id,
                        'image' => $imageName
                    ]);
                }
            }

            if ($request->hasFile('banner_image')) {
                foreach ($request->file('banner_image') as $index => $image) {
                    $imagePath = url('public/uploads/' . time() . '_' . $image->getClientOriginalName());
                    $image->move('public/uploads', basename($imagePath));

                    $posterPath = null;
                    $flyerNewPath = null;
                    if ($request->hasFile('flyer_image') && isset($request->file('flyer_image')[$index])) {
                        $poster = $request->file('flyer_image')[$index];
                        $posterPath = url('public/uploads/' . time() . '_' . $poster->getClientOriginalName());
                        $poster->move('public/uploads', basename($posterPath));
                    }
                    if ($request->hasFile('flyerNew') && isset($request->file('flyerNew')[$index])) {
                        $flyerNew = $request->file('flyerNew')[$index];
                        $flyerNewPath = url('public/uploads/' . time() . '_' . $flyerNew->getClientOriginalName());
                        $flyerNew->move('public/uploads', basename($flyerNewPath));
                    }

                    CarnivalBannerImages::create([
                        'carnival_id' => $carnivals->id,
                        'image' => $imagePath,
                        'poster' => $posterPath,
                        'flyerNew' => $flyerNewPath,
                        'btn_text' => $request->btn_text[$index] ?? null,
                        'btn_url' => $request->btn_url[$index] ?? null,
                    ]);
                }
            }

            // if ($request->hasFile('banner_images')) {
            //     foreach ($request->file('banner_images') as $image) {
            //         $imageName = time() . '.' . $image->extension();
            //         $image->move(public_path('images/carnivalBannerImages'), $imageName);
            //         CarnivalBannerImages::create([
            //             'carnival_id' => $carnivals->id,
            //             'image' => $imageName
            //         ]);
            //     }
            // }

            // if ($request->hasFile('flyer_images')) {
            //     foreach ($request->file('flyer_images') as $image) {
            //         $imageName = time() . '.' . $image->extension();
            //         $image->move(public_path('images/carnivalFlyerImages'), $imageName);
            //         CarnivalFlyerImages::create([
            //             'carnival_id' => $carnivals->id,
            //             'image' => $imageName
            //         ]);
            //     }
            // }
            if ($carnivals) {
                $carnivals = Carnival::all();
                $view = view('dashboard.admin.carnivals.table', compact('carnivals'))->render();

                return response()->json(['message' => 'Carnival created successfully', 'table_html' => $view], 200);
            }
        } catch (Exception $exception) {
            return response()->json(['error' => $exception->getMessage()], 500);
        }
    }

    public function show(Carnival $carnival)
    {
        return view('carnivals.show', compact('carnival'));
    }

    public function edit(Carnival $carnival)
    {
        $carnival = Carnival::with('images', 'banners', 'flyers')->find($carnival->id);
        return response()->json(['carnival' => $carnival]);
    }

    public function update(Request $request, Carnival $carnival)
    {
        $this->validation($request);

        try {
            $uniqueId = $this->generateUniqueId();

            $updated = $carnival->update([
                'unique_id' => $uniqueId,
                'name' => $request->name,
                'start_date' => $request->start_date,
                'end_date' => $request->end_date,
                'region_id' => $request->region_id,
                'country_id' => $request->country_id,
                'city_id' => $request->city_id,
                'description' => $request->description,
                'link' => 'https://carnival.ms-hostingladz.com/register/new/user/' . $uniqueId,
            ]);

            if ($updated) {
                // Process Carnival Images
                if ($request->hasFile('images')) {
                    $images = [];
                    foreach ($request->file('images') as $image) {
                        $imageName = uniqid() . '.' . $image->extension();
                        $image->move(public_path('images/carnivalImages'), $imageName);
                        $images[] = [
                            'carnival_id' => $carnival->id,
                            'image' => $imageName,
                            'created_at' => now(),
                            'updated_at' => now(),
                        ];
                    }
                    CarnivalImages::insert($images); // Batch insert for efficiency
                }

                // Process Banner Images
                if ($request->hasFile('banner_image')) {
                    $bannerImages = [];
                    $hasFlyerImage = $request->hasFile('flyer_image');
                    $hasFlyerNew = $request->hasFile('flyerNew');

                    foreach ($request->file('banner_image') as $index => $image) {
                        $imagePath = 'public/uploads/' . uniqid() . '_' . $image->getClientOriginalName();
                        $image->move(public_path('uploads'), basename($imagePath));

                        $posterPath = null;
                        if ($hasFlyerImage && isset($request->file('flyer_image')[$index])) {
                            $poster = $request->file('flyer_image')[$index];
                            $posterPath = 'public/uploads/' . uniqid() . '_' . $poster->getClientOriginalName();
                            $poster->move(public_path('uploads'), basename($posterPath));
                        }

                        $flyerNewPath = null;
                        if ($hasFlyerNew && isset($request->file('flyerNew')[$index])) {
                            $flyerNew = $request->file('flyerNew')[$index];
                            $flyerNewPath = 'public/uploads/' . uniqid() . '_' . $flyerNew->getClientOriginalName();
                            $flyerNew->move(public_path('uploads'), basename($flyerNewPath));
                        }

                        $bannerImages[] = [
                            'carnival_id' => $carnival->id,
                            'image' => url($imagePath),
                            'poster' => $posterPath ? url($posterPath) : null,
                            'flyerNew' => $flyerNewPath ? url($flyerNewPath) : null,
                            'btn_text' => $request->btn_text[$index] ?? null,
                            'btn_url' => $request->btn_url[$index] ?? null,
                            'created_at' => now(),
                            'updated_at' => now(),
                        ];
                    }

                    CarnivalBannerImages::insert($bannerImages); // Batch insert
                }

                // Fetch only the updated carnival
                $updatedCarnival = Carnival::find($carnival->id);
                $carnivals = Carnival::all();
                $view = view('dashboard.admin.carnivals.table', compact('carnivals'))->render();

                return response()->json([
                    'carnival' => $updatedCarnival,
                    'message' => 'Carnival updated successfully',
                    'table_html' => $view
                ], 200);
            }
        } catch (\Exception $exception) {
            return response()->json(['error' => $exception->getMessage()], 500);
        }
    }

    // public function update(Request $request, Carnival $carnival)
    // {
    //     $this->validation($request);
    //     try {
    //         $uniqueId = $this->generateUniqueId();

    //         $carnivals = $carnival->update([
    //             'unique_id' => $uniqueId,
    //             'name' => $request->name,
    //             'start_date' => $request->start_date,
    //             'end_date' => $request->end_date,
    //             'region_id' => $request->region_id,
    //             'country_id' => $request->country_id,
    //             'city_id' => $request->city_id,
    //             'description' => $request->description,
    //             'link' => 'https://carnival.ms-hostingladz.com/register/new/user/' . $uniqueId,
    //         ]);

    //         if ($carnivals) {
    //             if ($request->hasFile('images')) {
    //                 foreach ($request->file('images') as $image) {
    //                     $imageName = time() . '.' . $image->extension();
    //                     $image->move(public_path('images/carnivalImages'), $imageName);
    //                     CarnivalImages::create([
    //                         'carnival_id' => $carnival->id,
    //                         'image' => $imageName
    //                     ]);
    //                 }
    //             }
    //             if ($request->hasFile('banner_image')) {
    //                 foreach ($request->file('banner_image') as $index => $image) {
    //                     $imagePath = url('public/uploads/' . time() . '_' . $image->getClientOriginalName());
    //                     $image->move('public/uploads', basename($imagePath));

    //                     $posterPath = null;
    //                     $flyerNewPath = null;
    //                     if ($request->hasFile('flyer_image') && isset($request->file('flyer_image')[$index])) {
    //                         $poster = $request->file('flyer_image')[$index];
    //                         $posterPath = url('public/uploads/' . time() . '_' . $poster->getClientOriginalName());
    //                         $poster->move('public/uploads', basename($posterPath));
    //                     }
    //                     if ($request->hasFile('flyerNew') && isset($request->file('flyerNew')[$index])) {
    //                         $flyerNew = $request->file('flyerNew')[$index];
    //                         $flyerNewPath = url('public/uploads/' . time() . '_' . $flyerNew->getClientOriginalName());
    //                         $flyerNew->move('public/uploads', basename($flyerNewPath));
    //                     }

    //                     CarnivalBannerImages::create([
    //                         'carnival_id' => $carnival->id,
    //                         'image' => $imagePath,
    //                         'poster' => $posterPath,
    //                         'flyerNew' => $flyerNewPath,
    //                         'btn_text' => $request->btn_text[$index] ?? null,
    //                         'btn_url' => $request->btn_url[$index] ?? null,
    //                     ]);
    //                 }
    //             }
    //             $carnivals = Carnival::all();
    //             $view = view('dashboard.admin.carnivals.table', compact('carnivals'))->render();
    //             return response()->json(['carnival' => $carnival, 'message' => 'Carnival updated successfully', 'table_html' => $view], 200);
    //         }
    //     } catch (Exception $exception) {
    //         return response()->json(['error' => $exception->getMessage()], 500);
    //     }
    // }
    public function deleteImage(Carnival $carnival, $imageId)
    {
        try {
            // Find the image
            $image = CarnivalImages::findOrFail($imageId);

            // Check if image belongs to this carnival
            if ($image->carnival_id !== $carnival->id) {
                return response()->json(['error' => 'Image does not belong to this carnival'], 403);
            }

            // Delete the file from storage
            if (Storage::exists($image->image)) {
                Storage::delete($image->image);
            }

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

            return response()->json(['message' => 'Image deleted successfully']);
        } catch (Exception $e) {
            return response()->json(['error' => 'Failed to delete image: ' . $e->getMessage()], 500);
        }
    }
    public function deleteBanner(Carnival $carnival, $imageId)
    {
        try {
            // Find the image
            $image = CarnivalBannerImages::findOrFail($imageId);

            // Check if image belongs to this carnival
            if ($image->carnival_id !== $carnival->id) {
                return response()->json(['error' => 'Image does not belong to this carnival'], 403);
            }

            // Delete the file from storage
            if (Storage::exists($image->image)) {
                Storage::delete($image->image);
            }

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

            return response()->json(['message' => 'Image deleted successfully']);
        } catch (Exception $e) {
            return response()->json(['error' => 'Failed to delete image: ' . $e->getMessage()], 500);
        }
    }
    public function deleteFlyer(Carnival $carnival, $imageId)
    {
        try {
            // Find the image
            $image = CarnivalFlyerImages::findOrFail($imageId);

            // Check if image belongs to this carnival
            if ($image->carnival_id !== $carnival->id) {
                return response()->json(['error' => 'Image does not belong to this carnival'], 403);
            }

            // Delete the file from storage
            if (Storage::exists($image->image)) {
                Storage::delete($image->image);
            }

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

            return response()->json(['message' => 'Image deleted successfully']);
        } catch (Exception $e) {
            return response()->json(['error' => 'Failed to delete image: ' . $e->getMessage()], 500);
        }
    }
    public function destroy(Carnival $carnival)
    {
        $carnival->delete();
        return response()->json(['message' => 'Carnival deleted successfully'], 200);
    }

    private function generateUniqueId()
    {
        return Str::random(16);
    }

    // public function head_team($id)
    // {
    //     $vendors = Vendor::where('package_id', 6)
    //         ->pluck('user_id')->toArray();
    //     $subvendors = SubVendor::whereHas('vendor', function ($query) {
    //         $query->where('package_id', 6);
    //     })->pluck('user_id')->toArray();

    //     $userIds = array_unique(array_merge($vendors, $subvendors));

    //     $head_team = User::where('carnival_id', 0)
    //         ->doesntHave('isCustomer')
    //         ->whereIn('id', $userIds)
    //         ->get();

    //     // dd($head_team->toArray());

    //     return response()->json(['head_team' => $head_team]);
    // }

    public function head_team($id)
    {
        // $vendors = Vendor::where('package_id', 6)->pluck('user_id')->toArray();
        // $vendors1 = Vendor::whereRelation('package', 'slug', 'carnival')->get()->toArray();
        $vendors = Vendor::whereRelation('package', 'slug', 'carnival')->pluck('user_id')->toArray();

        // $subvendors = SubVendor::whereHas('vendor', function ($query) {
        //     $query->where('package_id', 6);
        // })->pluck('user_id')->toArray();

        // $userIds = array_unique(array_merge($vendors, $subvendors));

        $head_team = User::whereIn('id', $vendors)
            ->where('carnival_id', 0)
            ->doesntHave('isCustomer')
            ->get();

        // dd($vendors1, $head_team->toArray());

        return response()->json(['head_team' => $head_team]);
    }

    public function carnivalHead(Request $request)
    {
        $head = Carnival::find($request->carnival_id);
        $head->head = $request->head_team_id;
        $head->save();

        $full_name = $head->user->first_name . ' ' . $head->user->last_name;

        return response()->json(['full_name' => $full_name]);
    }

    public function assignCarnivalMember(Request $request)
    {
        $validatedData = $request->validate([
            'carnival_id' => 'required|exists:carnivals,id',
            'first_name' => 'required|string|max:255',
            'last_name' => 'required|string|max:255',
            'email' => 'required|email|unique:carnival_members,email,' . $request->member_id,
            'phone' => 'nullable|string|max:20',
            'address' => 'nullable|string',
            'city' => 'nullable|string|max:255',
            'state' => 'nullable|string|max:255',
            'country' => 'nullable|string|max:255',
            'designation' => 'nullable|string|max:255',
            'bio_description' => 'nullable',
            'insta' => 'nullable',
            'facebook' => 'nullable',
            'youtube' => 'nullable',
            'twitter' => 'nullable',
            'tiktok' => 'nullable',
            'wa_business_page' => 'nullable',
            'linkedin' => 'nullable',
            'image' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
        ]);

        if ($request->hasFile('image')) {
            $imageName = time() . '.' . $request->image->getClientOriginalExtension();

            $request->image->move(public_path('uploads/carnival_members'), $imageName);

            $validatedData['image'] = 'uploads/carnival_members/' . $imageName;
        }

        try {
            if ($request->member_id == 0) {
                $carnivalMember = CarnivalMembers::create($validatedData);
            } else {
                $carnivalMember = CarnivalMembers::find($request->member_id);
                if (!$carnivalMember) {
                    return response()->json(['message' => 'Member not found.'], 404);
                }
                $carnivalMember->update($validatedData);
            }

            return response()->json([
                'message' => 'Carnival member successfully assigned.',
                'member' => $carnivalMember->fresh(), // Ensure updated data is returned
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'message' => 'An error occurred while processing your request.',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function assignModels(Request $request)
    {

        $carnival = Carnival::findOrFail($request->carnival_id);
        if ($request->has('is_model')) {
            $mascampsWithData = [];
            foreach ($request->mascamps as $mascampId) {
                $mascampsWithData[$mascampId] = ['is_model' => 1];
            }
            $carnival->mascamps()->sync($mascampsWithData);
            // dd($request->toArray(), $carnival->mascamps->toArray());
            return response()->json(['success' => 'Mascamp(s) assigned successfully', 'message' => 'Mascamps updated successfully.']);
        }
        $carnival->mascamps()->sync($request->mascamps); // Sync mascamps
        return response()->json(['success' => 'Mascamp(s) assigned successfully', 'message' => 'Mascamps updated successfully.']);
    }

    public function getAssignedMascamps(Request $request, $id)
    {
        $carnivalId = $id;
        $vendors = Vendor::with('carnivals', 'user')
            ->whereDoesntHave('carnivals', function ($query) use ($carnivalId) {
                $query->where('carnival_id', $carnivalId);
            });
        if ($request->has('yes')) {
            $vendors = $vendors->where('package_id', 1);
        }
        $vendors = $vendors->get();
        // $carnival = Carnival::with('mascamps')->findOrFail($id);
        // $selectedMascamps = $carnival->mascamps->pluck('id'); // IDs of assigned mascamps
        return response()->json(['vendors' => $vendors]);
    }

    public function getCarnivalsMembers(Request $request, $id)
    {
        $members = CarnivalMembers::where('carnival_id', $id)->get();
        return response()->json(['members' => $members]);
    }

    public function getCountriesByRegion(Request $request)
    {
        $regionId = $request->region_id;
        $countries = Country::where('region_id', $regionId)->get();
        return response()->json(['countries' => $countries]);
    }

    public function getCitiesByCountry(Request $request)
    {
        $countryId = $request->country_id;
        $cities = City::where('country_id', $countryId)->get();
        return response()->json(['cities' => $cities]);
    }

    public function getEvents(Carnival $carnival)
    {
        $events = $carnival->carnivalEvents()->pluck('event_id')->toArray();
        return response()->json(['events' => $events]);
    }

    public function updateEvents(Request $request, Carnival $carnival)
    {
        $request->validate([
            'events' => 'array',
            'events.*' => 'exists:events,id'
        ]);

        $carnival->carnivalEvents()->sync($request->events);

        return response()->json(['message' => 'Events updated successfully']);
    }
}