/home2/mshostin/carnival.ms-hostingladz.com/app/Services/EventService.php
<?php

namespace App\Services;

use App\Models\Event;
use App\Models\EventTicket;
use App\Models\EventImage;
use Illuminate\Support\Facades\Auth;
use App\Traits\ImageTrait;
use App\Traits\MultipleImageTrait;
use Illuminate\Support\Str;

class EventService
{
    use ImageTrait, MultipleImageTrait;

    public function createEvent(array $data)
    {

        $eventData = $this->prepareEventData($data);

        if (isset($data['banner'])) {
            $banner = $this->uploadImage($data['banner'], 'eventBanner');
            $eventData['banner'] = $banner;
        }

        if (isset($data['promotional_image'])) {
            // dd($data['promotional_image']);
            $promotional_image = $this->uploadImage($data['promotional_image'], 'eventpromotional_image');
            $eventData['promotional_image'] = $promotional_image;
        }

        $event = Event::create($eventData);

        if (isset($data['additional_images'])) {
            $this->handleAdditionalImages($event, $data['additional_images']);
        }

        if (isset($data['ticket_id'])) {
            $this->saveEventTickets($event, $data['ticket_id'], $data['price'], $data['quantity']);
        }

        return $event;
    }

    public function updateEvent(Event $event, array $data)
    {
        $eventData = $this->prepareEventData($data);

        if (isset($data['banner'])) {
            $banner = $this->uploadImage($data['banner'], 'eventBanner');
            $eventData['banner'] = $banner;
        }

        $event->update($eventData);

        if (isset($data['additional_images'])) {
            $this->handleAdditionalImages($event, $data['additional_images']);
        }

        if (isset($data['ticket_id'])) {
            $this->updateEventTickets($event, $data['ticket_id'], $data['price'], $data['quantity']);
        }

        return $event;
    }

    protected function prepareEventData(array $data)
    {
        $eventData = [
            'name' => $data['name'],
            'package_id' => $data['package_id'],
            'category_id' => $data['category_id'],
            'user_id' => $data['user_id'],
            'total_no_of_tickets' => $data['total_no_of_tickets'],
            'venue' => $data['venue'],
            'address' => $data['address'],
            'description' => $data['description'] ?? null,
            'eventType' => $data['eventType'],
            'start_date' => $data['start_date'] ?? null,
            'start_time' => $data['start_time'] ?? null,
            'slug' => $this->generateUniqueSlug($data['name']),
            'end_date' => $data['end_date'] ?? null,
            'end_time' => $data['end_time'] ?? null,
            'all_day' => $data['all_day'] ?? null,
            'status' => $data['status'],

            'booking_start_time_btn' => $data['booking_start_time_btn'] ?? 0,
            'booking_starts_on_date' => $data['booking_starts_on_date'] ?? null,
            'booking_starts_on_time' => $data['booking_starts_on_time'] ?? null,

            'booking_end_time_btn' => $data['booking_end_time_btn'] ?? 0,
            'booking_ends_on_date' => $data['booking_ends_on_date'] ?? null,
            'booking_ends_on_time' => $data['booking_ends_on_time'] ?? null,

            'passing_service_charge_btn' => $data['passing_service_charge_btn'] ?? 0,

            'refund_policies_btn' => $data['refund_policies_btn'] ?? 0,
            'refund_policy_id' => $data['refund_policy_id'] ?? null,
            'cancel_before' => $data['cancel_before'] ?? null,
            'refund_amount' => $data['refund_amount'] ?? null,

            'ticket_instructions_btn' => $data['ticket_instructions_btn'] ?? 0,
            'special_instructions' => $data['special_instructions'] ?? null,

            'tags_btn' => $data['tags_btn'] ?? 0,
            // 'dress_code' => isset($data['dress_code']) ? implode(',', $data['dress_code']) : null,
        ];

        if (isset($data['dress_code'])) {
            $eventData['dress_code'] = implode(',', $data['dress_code']);
        }

        return $eventData;
    }

    protected function handleAdditionalImages(Event $event, $images)
    {
        $additionalImagePaths = $this->uploadMultipleImages($images, 'additional_images');
        foreach ($additionalImagePaths as $additionalImage) {
            EventImage::create([
                'event_id' => $event->id,
                'image_url' => $additionalImage['path'],
                'image_name' => $additionalImage['original_name'],
            ]);
        }
    }

    protected function saveEventTickets(Event $event, $ticketIds, $prices, $quantities)
    {
        foreach ($ticketIds as $key => $ticketId) {
            $eventTicketData = [
                'ticket_id' => $ticketId,
                'event_id' => $event->id,
                'price' => $prices[$key],
                'quantity' => $quantities[$key],
                'status' => 1,
            ];
            EventTicket::create($eventTicketData);
        }
    }

    protected function updateEventTickets(Event $event, $ticketIds, $prices, $quantities)
    {
        foreach ($ticketIds as $key => $ticketId) {
            $eventTicket = $event->tickets()->where('ticket_id', $ticketId)->first();
            if ($eventTicket) {
                $eventTicket->update([
                    'price' => $prices[$key],
                    'quantity' => $quantities[$key],
                ]);
            }
        }
    }

    protected function generateUniqueSlug($name)
    {
        $slug = Str::slug($name);
        $uniqueSlug = $slug;
        $counter = 1;
        while (Event::where('slug', $uniqueSlug)->exists()) {
            $uniqueSlug = $slug . '-' . $counter++;
        }
        return $uniqueSlug;
    }
}