HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-10-0-8-47 6.8.0-1021-aws #23~22.04.1-Ubuntu SMP Tue Dec 10 16:31:58 UTC 2024 aarch64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.22
Disabled: NONE
Upload Files
File: /var/www/javago-portal-updates/app/Http/Controllers/API/CafeMenuController.php
<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use App\Models\AddonSizeCafeItem;
use Illuminate\Http\Request;
use App\Models\Cafe;
use App\Models\CafeTiming;
use App\Models\Addon;
use App\Models\AddonSize;
use App\Models\CafeMenu;
use App\Models\Size;
use App\Models\PreDefinedItemImage;
use App\Models\CafeMenuItem;
use App\Models\CafeMenuItemSize;
use App\Models\SuggestedItem;
use App\Models\MenuCategoryOrder;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Hash;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\Excel as ExcelFormat;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;


class CafeMenuController extends Controller
{
    //get Menu options
    public function getMenuOptions(Request $request)
    {
        try {
            $cafe = Cafe::find($request->user->id);
            // Prepare data for the response
            $data = [];
            $data['maxSizePrice'] = 3;
            $data['sizeNA'] = Size::where('size_name', 'N/A')->select('id')->first();
            $data['preDefinedItem'] = PreDefinedItemImage::select('id', 'item_name', 'item_image')->get();
            $data['itemCategory'] = CafeMenu::where('cafe_id', $cafe->id)->pluck('menu_name', 'id');
            $data['itemType'] = config('constants.item_type');
            $items = CafeMenuItem::where('cafe_id', $cafe->id)->pluck('item_name', 'id');
            $data['itemSize'] = Size::pluck('size_name', 'id');
            $data['options'] = Addon::where('cafe_id', $cafe->id)->where('addon_deleted_at', 0)->pluck('addon_name', 'id');
            $data['optionSizes'] = AddonSize::where('cafe_id', $cafe->id)->where('addon_size_deleted_at', 0)->select('addon_size_name', 'id', 'addon_id')->get();
            $itemIds = [];
            foreach ($items as $itemslist => $value) {
                $itemIds[] = $itemslist;
            }
            // Get addon items for the specific cafe menu item (assumed logic)
            $addons = CafeMenuItemSize::join('sizes', 'sizes.id', '=', 'cafe_menu_item_sizes.size_id')
                ->whereIn('item_id', $itemIds) // Assuming item_id is passed in the request
                //->select('size_name', 'item_size_price')
                ->orderBy('cafe_menu_item_sizes.size_id')
                ->get()->toArray();


            if (!$addons) {
                $addons = null;
            }
            $data['addons'] = $addons;
            $data['items'] = $items->isEmpty() ? null : $items;

            // Return the response with data
            return response()->json([
                'status' => 'success',
                'message' => 'Menu Options Found!',
                'data' => $data,
            ], 200);

        } catch (ValidationException $validationException) {
            // Handle validation exception and return custom response
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            // Handle other exceptions
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while getting menu options!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    //AddItem
    public function addItem(Request $request)
    {
        try {
            // Validate the incoming request
            $validator = Validator::make($request->all(), [
                'item_name' => 'required',
                'item_category_id' => 'required',
                // 'item_image_id' => 'required',
                'item_description' => 'required',
                'item_type_id' => 'required',
            ]);

            // Handle validation errors
            if ($validator->fails()) {
                // Throw a ValidationException if validation fails
                throw new ValidationException($validator);
            }
            DB::beginTransaction();

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }

            // Create new cafe menu item
            $create = [
                'item_name' => $request->item_name,
                'cafe_id' => $cafe->id,
                'cafe_menu_id' => $request->item_category_id,
                // 'item_image_id' => $request->item_image_id,
                'item_image_id' => 1,
                'item_description' => $request->item_description,
                'item_price' => isset($request->item[0]['item_price']) ? $request->item[0]['item_price'] : 0,
                'status' => 1,
                'item_type' => $request->item_type_id,
                'created_at' => Carbon::now()->timestamp,
                'updated_at' => Carbon::now()->timestamp,
            ];
            $itemId = CafeMenuItem::insertGetId($create);

            // Insert item prices based on size
            if (!empty($request->item)) {
                $itemPrices = [];
                foreach ($request->item as $item) {
                    if (!empty($item['item_size_id']) && !empty($item['item_price'])) {
                        $itemPrices[] = [
                            'item_id' => $itemId,
                            'size_id' => $item['item_size_id'],
                            'item_size_price' => $item['item_price'],
                            'created_at' => Carbon::now()->timestamp,
                            'updated_at' => Carbon::now()->timestamp,
                        ];
                    }
                }
                if (!empty($itemPrices)) {
                    CafeMenuItemSize::insert($itemPrices);
                }
            }

            // Insert item options (addon items)
            if (!empty($request->item_option) && !empty($request->item_price)) {
                $itemOptions = [];
                $minCount = min(count($request->item_option), count($request->item_price));

                for ($i = 0; $i < $minCount; $i++) {
                    $option = $request->item_option[$i];
                    $price = $request->item_price[$i];

                    if (!empty($option)) {
                        $itemOptions[] = [
                            'item_id' => $itemId,
                            'addon_size_id' => $option,
                            'addon_size_price' => !empty($price) ? $price : 0.00,
                            'created_at' => Carbon::now()->timestamp,
                            'updated_at' => Carbon::now()->timestamp,
                        ];
                    }
                }

                if (!empty($itemOptions)) {
                    AddonSizeCafeItem::insert($itemOptions);
                }
            }

            // Insert addon items (suggested items)
            if (!empty($request->addon_item)) {
                $addonItems = [];
                foreach ($request->addon_item as $item) {
                    if (!empty($item['addon_item_id'])) {
                        $addonItems[] = [
                            'item_id' => $itemId,
                            'suggested_item_id' => $item['addon_item_id'],
                            'created_at' => Carbon::now()->timestamp,
                            'updated_at' => Carbon::now()->timestamp,
                        ];
                    }
                }
                if (!empty($addonItems)) {
                    SuggestedItem::insert($addonItems);
                }
            }

            // Update menu completion status for the cafe
            $cafe->update(['menu_completed' => 1]);

            DB::commit();

            return response()->json([
                'status' => 'success',
                'message' => 'Menu item added successfully!',
            ], 200);

        } catch (ValidationException $validationException) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while adding the menu item!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function updateItem(Request $request, $itemId)
    {
        try {
            // Validate the incoming request
            $validator = Validator::make($request->all(), [
                'item_name' => 'required',
                'cafe_menu_id' => 'required',
                // 'item_image_id' => 'required',
                'item_description' => 'required',
                'item_type' => 'required',
            ]);

            // Handle validation errors
            if ($validator->fails()) {
                // Throw a ValidationException if validation fails
                throw new ValidationException($validator);
            }
            DB::beginTransaction();

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }

            $item = CafeMenuItem::find($itemId);
            if (!$item) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Menu item not found.',
                ], 404);
            }

            // Update the menu item
            $item->update([
                'item_name' => $request->item_name,
                'cafe_menu_id' => $request->item_category_id,
                // 'item_image_id' => $request->item_image_id,
                'item_image_id' => 1,
                'item_description' => $request->item_description,
                'item_price' => isset($request->item[0]['item_price']) ? $request->item[0]['item_price'] : 0,
                'item_type' => $request->item_type_id,
                'updated_at' => Carbon::now()->timestamp,
            ]);

            // Update item prices based on size
            CafeMenuItemSize::where('item_id', $itemId)->delete();
            if (!empty($request->item)) {
                $itemPrices = [];
                foreach ($request->item as $itemData) {
                    if (!empty($itemData['item_size_id']) && !empty($itemData['item_price'])) {
                        $itemPrices[] = [
                            'item_id' => $itemId,
                            'size_id' => $itemData['item_size_id'],
                            'item_size_price' => $itemData['item_price'],
                            'created_at' => Carbon::now()->timestamp,
                            'updated_at' => Carbon::now()->timestamp,
                        ];
                    }
                }
                if (!empty($itemPrices)) {
                    CafeMenuItemSize::insert($itemPrices);
                }
            }

            // Update item options (addon items)
            AddonSizeCafeItem::where('item_id', $itemId)->delete();
            if (!empty($request->item_option) && !empty($request->item_price)) {
                $itemOptions = [];
                $minCount = min(count($request->item_option), count($request->item_price));
                for ($i = 0; $i < $minCount; $i++) {
                    $option = $request->item_option[$i];
                    $price = $request->item_price[$i];

                    if (!empty($option)) {
                        $itemOptions[] = [
                            'item_id' => $itemId,
                            'addon_size_id' => $option,
                            'addon_size_price' => !empty($price) ? $price : 0.00,
                            'created_at' => Carbon::now()->timestamp,
                            'updated_at' => Carbon::now()->timestamp,
                        ];
                    }
                }
                if (!empty($itemOptions)) {
                    AddonSizeCafeItem::insert($itemOptions);
                }
            }

            // Update addon items (suggested items)
            SuggestedItem::where('item_id', $itemId)->delete();
            if (!empty($request->addon_item)) {
                $addonItems = [];
                foreach ($request->addon_item as $addon) {
                    if (!empty($addon['addon_item_id'])) {
                        $addonItems[] = [
                            'item_id' => $itemId,
                            'suggested_item_id' => $addon['addon_item_id'],
                            'created_at' => Carbon::now()->timestamp,
                            'updated_at' => Carbon::now()->timestamp,
                        ];
                    }
                }
                if (!empty($addonItems)) {
                    SuggestedItem::insert($addonItems);
                }
            }

            DB::commit();

            return response()->json([
                'status' => 'success',
                'message' => 'Menu item updated successfully!',
            ], 200);
        } catch (ValidationException $validationException) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while updating the menu item!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }


    public function updateItemStatus(Request $request, $itemId)
    {
        try {
            // Validate the incoming request
            $validator = Validator::make($request->all(), [
                'status' => 'required|in:0,1',
            ]);

            // Handle validation errors
            if ($validator->fails()) {
                // Throw a ValidationException if validation fails
                throw new ValidationException($validator);
            }
            DB::beginTransaction();

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }

            $item = CafeMenuItem::find($itemId);
            if (!$item) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Menu item not found.',
                ], 404);
            }

            // Update the menu item
            $item->update([
                'status' => $request->status,
            ]);

            DB::commit();

            return response()->json([
                'status' => 'success',
                'message' => 'Menu item status updated successfully!',
            ], 200);
        } catch (ValidationException $validationException) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while updating the menu item status!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function updateAddonStatus(Request $request, $itemId)
    {
        try {
            // Validate the incoming request
            $validator = Validator::make($request->all(), [
                'status' => 'required|in:0,1',
            ]);

            // Handle validation errors
            if ($validator->fails()) {
                // Throw a ValidationException if validation fails
                throw new ValidationException($validator);
            }
            DB::beginTransaction();

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }

            $item = AddonSize::find($itemId);
            if (!$item) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Addon item not found.',
                ], 404);
            }

            // Update the menu item
            $item->update([
                'status' => $request->status,
            ]);

            DB::commit();

            return response()->json([
                'status' => 'success',
                'message' => 'Addon item status updated successfully!',
            ], 200);
        } catch (ValidationException $validationException) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while updating the addon item status!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function getAllMenuItems(Request $request)
    {
        try {
            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }

            $veg = $request->veg ? decrypt($request->veg) : '';
            $nonVeg = $request->nonVeg ? decrypt($request->nonVeg) : '';
            $vegan = $request->vegan ? decrypt($request->vegan) : '';
            $where = array_filter([$veg, $nonVeg, $vegan]);
            $search = $request->search;

            $menuItems = DB::table('cafe_menu_items')
                ->join('pre_defined_item_images', 'pre_defined_item_images.id', '=', 'cafe_menu_items.item_image_id')
                ->join('cafe_menus', 'cafe_menus.id', '=', 'cafe_menu_items.cafe_menu_id')
                ->leftJoin('cafe_menu_item_sizes', 'cafe_menu_item_sizes.item_id', '=', 'cafe_menu_items.id')
                ->leftJoin('addon_size_cafe_items', 'addon_size_cafe_items.item_id', '=', 'cafe_menu_items.id')
                ->leftJoin('suggested_items', 'suggested_items.item_id', '=', 'cafe_menu_items.id')
                ->where('cafe_menu_items.cafe_id', $cafe->id)
                ->where('cafe_menu_items.item_deleted_at', 0)
                ->when(!empty($where), function ($query) use ($where) {
                    $query->whereIn('cafe_menu_items.item_type', $where);
                })
                ->when($search, function ($query) use ($search) {
                    $query->where('cafe_menu_items.item_name', 'LIKE', "%$search%");
                })
                ->select(
                    'cafe_menu_items.*',
                    // 'pre_defined_item_images.item_image as item_image',
                    'cafe_menus.menu_name as item_category',
                    DB::raw('GROUP_CONCAT(DISTINCT cafe_menu_item_sizes.item_size_price) as item_sizes'),
                    DB::raw('GROUP_CONCAT(DISTINCT addon_size_cafe_items.addon_size_id) as addon_options'),
                    DB::raw('GROUP_CONCAT(DISTINCT suggested_items.suggested_item_id) as suggested_items')
                )
                ->groupBy('cafe_menu_items.id')
                ->paginate(10);

            return response()->json([
                'status' => 'success',
                'message' => 'Menu Items List Found!',
                'data' => $menuItems,
            ], 200);
        } catch (\Exception $e) {
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while fetching menu items!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }
    public function getItemDetail(Request $request, $itemId)
    {
        try {
            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }
            $model = DB::table('cafe_menu_items')
                ->join('pre_defined_item_images', 'pre_defined_item_images.id', '=', 'cafe_menu_items.item_image_id')
                ->join('cafe_menus', 'cafe_menus.id', '=', 'cafe_menu_items.cafe_menu_id')
                ->where('cafe_menu_items.id', $itemId)
                ->where('cafe_menu_items.item_deleted_at', 0)
                ->select('cafe_menu_items.*', 'pre_defined_item_images.item_image', 'cafe_menus.menu_name as item_category')
                ->first();
            // Size, Addon Options, and Suggested Items
            $optionSizeCafeItems = DB::table('addon_size_cafe_items')
                ->join('addon_sizes', 'addon_sizes.id', '=', 'addon_size_cafe_items.addon_size_id')
                ->where('item_id', $model->id)
                ->get(['addon_size_cafe_items.addon_size_id', 'addon_size_cafe_items.addon_size_price', 'addon_sizes.addon_size_name', 'addon_sizes.status'])
                ->map(function ($item) {
                    return [
                        'addon_size_id' => $item->addon_size_id,
                        'addon_size_name' => $item->addon_size_name,
                        'addon_size_price' => $item->addon_size_price,
                        'status' => $item->status,
                    ];
                })->toArray();


            // Addon Items (Suggested Items)
            $addonItems = DB::table('suggested_items')
                ->where('item_id', $model->id)
                ->pluck('suggested_item_id');

            // Item Prices (Sizes)
            $itemPriceSize = DB::table('cafe_menu_item_sizes')
                ->where('item_id', $model->id)
                ->get();

            // Preparing the data for the view
            $data = [];
            $data['item_image_id'] = $model->item_image_id;
            $data['item_name'] = $model->item_name;
            $data['item_category'] = $model->cafe_menu_id;
            $data['item_type'] = $model->item_type;
            $data['item_description'] = $model->item_description;
            $data['item_price'] = $model->item_price;
            $data['cafe_menu_id'] = $model->cafe_menu_id;
            $data['item_size_prices'] = $itemPriceSize;
            $data['optionSizeCafeItems'] = $optionSizeCafeItems;
            $data['addon_items'] = $addonItems;


            return response()->json([
                'status' => 'success',
                'message' => 'Item Detail fetched Successfully!',
                'data' => $data,
            ], 200);

        } catch (ValidationException $validationException) {
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while getting the item detail!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    //Delete Item
    public function deleteItem(Request $request, $itemId)
    {
        try {
            DB::beginTransaction();

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }

            $item = CafeMenuItem::find($itemId);
            if (!$item) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Menu item not found.',
                ], 404);
            }

            // Update the menu item
            $item->update([
                'item_deleted_at' => Carbon::now()->timestamp,
            ]);

            DB::commit();

            return response()->json([
                'status' => 'success',
                'message' => 'Menu item deleted successfully!',
            ], 200);
        } catch (ValidationException $validationException) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while deleting the menu item!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    //get Menu Order
    public function getMenuOrder(Request $request)
    {
        try {

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }

            $menuOrders = DB::table('menu_category_order as mco')
                ->join('cafe_menus as cm', function ($join) {
                    $join->on('mco.name', '=', 'cm.menu_name')
                        ->on('mco.cafe_id', '=', 'cm.cafe_id');
                })
                ->leftJoin('cafe_menu_items as cmi', 'cmi.cafe_menu_id', '=', 'cm.id')
                ->select(
                    'cm.id',
                    'cm.menu_name',
                    'mco.order_number',
                    DB::raw("COUNT(CASE WHEN cmi.item_deleted_at = 0 THEN 1 END) as item_count")
                )
                ->where('mco.cafe_id', $cafe->id)
                ->groupBy('cm.id', 'cm.menu_name', 'mco.order_number')
                ->orderBy('mco.order_number')
                ->get();

            if ($menuOrders->isEmpty()) {
                $menuOrders = DB::table('cafe_menus as cm')
                    ->leftJoin('cafe_menu_items as cmi', 'cmi.cafe_menu_id', '=', 'cm.id')
                    ->select(
                        'cm.id',
                        'cm.menu_name',
                        DB::raw('NULL as order_number'),
                        DB::raw("COUNT(CASE WHEN cmi.item_deleted_at = 0 THEN 1 END) as item_count")
                    )
                    ->where('cm.cafe_id', $cafe->id)
                    ->groupBy('cm.id', 'cm.menu_name')
                    ->get();
            }


            return response()->json([
                'status' => 'success',
                'message' => 'Menu item Order Found successfully!',
                'menuOrders' => $menuOrders,
            ], 200);
        } catch (ValidationException $validationException) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while getting Menu Order!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    //Add or update menu Ordder
    public function updateMenuOrder(Request $request)
    {
        try {
            // Validate the incoming request
            $validator = Validator::make($request->all(), [
                'order_number' => 'required|array',
            ]);

            // Handle validation errors
            if ($validator->fails()) {
                // Throw a ValidationException if validation fails
                throw new ValidationException($validator);
            }

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json([
                    'status' => 'error',
                    'message' => 'Cafe not found.',
                ], 404);
            }

            $newNames = collect($request->order_number)->values()->all();
            // Delete categories that are not in the new request
            MenuCategoryOrder::where('cafe_id', $cafe->id)->whereNotIn('name', $newNames)->delete();

            foreach ($request->order_number as $order_number => $name) {
                MenuCategoryOrder::updateOrCreate(
                    ['cafe_id' => $cafe->id, 'name' => $name],
                    ['order_number' => $order_number]
                );
            }
            return response()->json([
                'status' => 'success',
                'message' => 'Menu item Order Updated successfully!',
            ], 200);
        } catch (ValidationException $validationException) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'Validation failed.',
                'errors' => $validationException->errors(),
            ], 422);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while updating the menu item status!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function downloadSampleItemFile(Request $request)
    {
        try {
            // Fetch menu options
            $menuOptionsResponse = $this->getMenuOptions($request);
            $menuOptions = $menuOptionsResponse->getData()->data;

            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
            $sheet->setTitle('Menu Items');

            // Add hidden sheet for dropdown data
            $hiddenSheet = new Worksheet($spreadsheet, 'DropdownData');
            $spreadsheet->addSheet($hiddenSheet);
            $spreadsheet->setActiveSheetIndex(0);

            // Define columns (Removed Icon)
            $columns = [
                'A' => 'Item Name',
                'B' => 'Description',
                'C' => 'Type',
                'D' => 'Category',
                'E' => 'Small Price',
                'F' => 'Medium Price',
                'G' => 'Large Price',
                'H' => 'Addon Option IDs',
                'I' => 'Addon Prices',
            ];

            foreach ($columns as $col => $name) {
                $sheet->setCellValue($col . '1', $name);
            }

            // Fill hidden sheet
            $row = 1;
            $types = $menuOptions->itemType ?? [];
            foreach ($types as $key => $value) {
                $hiddenSheet->setCellValue("A{$row}", "{$key}: {$value}");
                $row++;
            }
            $typeRange = '$A$1:$A$' . ($row - 1);

            $row = 1;
            $categories = $menuOptions->itemCategory ?? [];
            foreach ($categories as $key => $value) {
                $hiddenSheet->setCellValue("B{$row}", "{$key}: {$value}");
                $row++;
            }
            $categoryRange = '$B$1:$B$' . ($row - 1);

            $row = 1;
            $addons = $menuOptions->optionSizes ?? [];
            foreach ($addons as $addon) {
                $hiddenSheet->setCellValue("C{$row}", "{$addon->id}: {$addon->addon_size_name}");
                $row++;
            }
            $addonRange = '$C$1:$C$' . ($row - 1);

            // Create validations (removed Icon validation)
            $validationType = $this->createDropdownValidation("DropdownData!{$typeRange}");
            $validationCategory = $this->createDropdownValidation("DropdownData!{$categoryRange}");
            $validationAddon = $this->createDropdownValidation("DropdownData!{$addonRange}");

            // Apply validations to rows 2–100
            for ($r = 2; $r <= 100; $r++) {
                $sheet->getCell("C$r")->setDataValidation(clone $validationType);
                $sheet->getCell("D$r")->setDataValidation(clone $validationCategory);
                $sheet->getCell("H$r")->setDataValidation(clone $validationAddon);
            }

            $hiddenSheet->setSheetState(Worksheet::SHEETSTATE_HIDDEN);

            // Sample row values (updated columns)
            $sheet->setCellValue('A2', 'Sample Coffee');
            $sheet->setCellValue('B2', 'Delicious hot coffee');
            $sheet->setCellValue('E2', '5.5'); // Small Price
            $sheet->setCellValue('F2', '6.0'); // Medium Price
            $sheet->setCellValue('G2', '6.5'); // Large Price
            $sheet->setCellValue('I2', '1.5'); // Addon Prices

            // Save file
            $publicDir = public_path('demo_item_samples');
            if (!file_exists($publicDir)) {
                mkdir($publicDir, 0777, true);
            }

            $cafeId = $request->cafe_id ?? 'unknown';
            $timestamp = now()->format('Ymd_His');
            $fileName = "items_{$cafeId}_{$timestamp}.xlsx";
            $filePath = $publicDir . '/' . $fileName;

            $writer = new Xlsx($spreadsheet);
            $writer->save($filePath);

            $fileUrl = url("demo_item_samples/{$fileName}");

            return response()->json([
                'status' => true,
                'message' => 'Sample item file generated successfully',
                'file_url' => $fileUrl,
            ]);
        } catch (\Exception $e) {
            \Log::error("Error generating sample item file: " . $e->getMessage());
            return response()->json([
                'status' => false,
                'message' => 'An error occurred while generating the sample item file!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }


    public function olddownloadSampleItemFile(Request $request)
    {
        try {
            // Fetch menu options
            $menuOptionsResponse = $this->getMenuOptions($request);
            $menuOptions = $menuOptionsResponse->getData()->data;

            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
            $sheet->setTitle('Menu Items');

            // Add hidden sheet for dropdown data
            $hiddenSheet = new Worksheet($spreadsheet, 'DropdownData');
            $spreadsheet->addSheet($hiddenSheet);
            $spreadsheet->setActiveSheetIndex(0);

            // Define columns
            $columns = [
                'A' => 'Item Name',
                'B' => 'Description',
                'C' => 'Type',
                'D' => 'Category',
                'E' => 'Icon',
                'F' => 'Small Price',
                'G' => 'Medium Price',
                'H' => 'Large Price',
                'I' => 'Addon Option IDs',
                'J' => 'Addon Prices',
            ];

            foreach ($columns as $col => $name) {
                $sheet->setCellValue($col . '1', $name);
            }

            // Fill hidden sheet
            $row = 1;
            $types = $menuOptions->itemType ?? [];
            foreach ($types as $key => $value) {
                $hiddenSheet->setCellValue("A{$row}", "{$key}: {$value}");
                $row++;
            }
            $typeRange = '$A$1:$A$' . ($row - 1);

            $row = 1;
            $categories = $menuOptions->itemCategory ?? [];
            foreach ($categories as $key => $value) {
                $hiddenSheet->setCellValue("B{$row}", "{$key}: {$value}");
                $row++;
            }
            $categoryRange = '$B$1:$B$' . ($row - 1);

            $row = 1;
            $icons = $menuOptions->preDefinedItem ?? [];
            foreach ($icons as $icon) {
                $hiddenSheet->setCellValue("C{$row}", "{$icon->id}: {$icon->item_name}");
                $row++;
            }
            $iconRange = '$C$1:$C$' . ($row - 1);

            $row = 1;
            $addons = $menuOptions->optionSizes ?? [];
            foreach ($addons as $addon) {
                $hiddenSheet->setCellValue("D{$row}", "{$addon->id}: {$addon->addon_size_name}");
                $row++;
            }
            $addonRange = '$D$1:$D$' . ($row - 1);

            // Create validations
            $validationType = $this->createDropdownValidation("DropdownData!{$typeRange}");
            $validationCategory = $this->createDropdownValidation("DropdownData!{$categoryRange}");
            $validationIcon = $this->createDropdownValidation("DropdownData!{$iconRange}");
            $validationAddon = $this->createDropdownValidation("DropdownData!{$addonRange}");

            // Apply validations to rows 2–100
            for ($r = 2; $r <= 100; $r++) {
                $sheet->getCell("C$r")->setDataValidation(clone $validationType);
                $sheet->getCell("D$r")->setDataValidation(clone $validationCategory);
                $sheet->getCell("E$r")->setDataValidation(clone $validationIcon);
                $sheet->getCell("I$r")->setDataValidation(clone $validationAddon);
            }

            $hiddenSheet->setSheetState(Worksheet::SHEETSTATE_HIDDEN);

            // Sample row values
            $sheet->setCellValue('A2', 'Sample Coffee');
            $sheet->setCellValue('B2', 'Delicious hot coffee');
            $sheet->setCellValue('F2', '5.5');
            $sheet->setCellValue('G2', '6.0');
            $sheet->setCellValue('H2', '6.5');
            $sheet->setCellValue('J2', '1.5');

            // Save file
            $publicDir = public_path('demo_item_samples');
            if (!file_exists($publicDir)) {
                mkdir($publicDir, 0777, true);
            }

            $cafeId = $request->cafe_id ?? 'unknown';
            $timestamp = now()->format('Ymd_His');
            $fileName = "items_{$cafeId}_{$timestamp}.xlsx";
            $filePath = $publicDir . '/' . $fileName;

            $writer = new Xlsx($spreadsheet);
            $writer->save($filePath);

            $fileUrl = url("demo_item_samples/{$fileName}");

            return response()->json([
                'status' => true,
                'message' => 'Sample item file generated successfully',
                'file_url' => $fileUrl,
            ]);
        } catch (\Exception $e) {
            \Log::error("Error generating sample item file: " . $e->getMessage());
            return response()->json([
                'status' => false,
                'message' => 'An error occurred while generating the sample item file!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    private function createDropdownValidation($formula)
    {
        $validation = new DataValidation();
        $validation->setType(DataValidation::TYPE_LIST);
        $validation->setErrorStyle(DataValidation::STYLE_STOP);
        $validation->setAllowBlank(true);
        $validation->setShowInputMessage(true);
        $validation->setShowErrorMessage(true);
        $validation->setShowDropDown(true);
        $validation->setFormula1($formula);
        return $validation;
    }

    public function uploadItemFile(Request $request)
    {
        try {
            if (!$request->hasFile('file')) {
                return response()->json(['status' => 'error', 'message' => 'File not found.'], 400);
            }

            $file = $request->file('file');
            $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file->getPathname());
            $sheet = $spreadsheet->getActiveSheet();
            $highestRow = $sheet->getHighestDataRow();

            DB::beginTransaction();

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json(['status' => 'error', 'message' => 'Cafe not found.'], 404);
            }

            for ($row = 2; $row <= $highestRow; $row++) {
                $itemName = trim($sheet->getCell("A$row")->getValue());
                $description = trim($sheet->getCell("B$row")->getValue());
                $type = trim($sheet->getCell("C$row")->getValue());
                $category = trim($sheet->getCell("D$row")->getValue());
                // $icon = trim($sheet->getCell("E$row")->getValue());
                $smallPrice = trim($sheet->getCell("E$row")->getValue());
                $mediumPrice = trim($sheet->getCell("F$row")->getValue());
                $largePrice = trim($sheet->getCell("G$row")->getValue());
                $addonId = trim($sheet->getCell("H$row")->getValue());
                $addonPrice = trim($sheet->getCell("I$row")->getValue());

                if (empty($itemName)) {
                    continue; // skip empty rows
                }

                // Check if item exists
                $existingItem = CafeMenuItem::where('item_name', $itemName)
                    ->where('cafe_menu_id', $category)
                    ->where('item_deleted_at', 0)
                    ->first();

                $itemData = [
                    'item_name' => $itemName,
                    'cafe_id' => $cafe->id,
                    'cafe_menu_id' => $category,
                    'item_image_id' => 1,
                    'item_description' => $description,
                    'item_price' => $smallPrice ?: $mediumPrice ?: $largePrice ?: 0,
                    'status' => 1,
                    'item_type' => $type,
                    'updated_at' => Carbon::now()->timestamp,
                ];

                if ($existingItem) {
                    // Update item
                    $existingItem->update($itemData);
                    $itemId = $existingItem->id;

                    // Delete old sizes and addons
                    CafeMenuItemSize::where('item_id', $itemId)->delete();
                    AddonSizeCafeItem::where('item_id', $itemId)->delete();
                    // Optionally: SuggestedItem::where('item_id', $itemId)->delete();
                } else {
                    // Create new item
                    $itemData['created_at'] = Carbon::now()->timestamp;
                    $itemId = CafeMenuItem::insertGetId($itemData);
                }

                // Insert sizes
                $itemPrices = [];
                if (!empty($smallPrice)) {
                    $itemPrices[] = [
                        'item_id' => $itemId,
                        'size_id' => 3, // Small
                        'item_size_price' => $smallPrice,
                        'created_at' => Carbon::now()->timestamp,
                        'updated_at' => Carbon::now()->timestamp,
                    ];
                }
                if (!empty($mediumPrice)) {
                    $itemPrices[] = [
                        'item_id' => $itemId,
                        'size_id' => 2, // Medium
                        'item_size_price' => $mediumPrice,
                        'created_at' => Carbon::now()->timestamp,
                        'updated_at' => Carbon::now()->timestamp,
                    ];
                }
                if (!empty($largePrice)) {
                    $itemPrices[] = [
                        'item_id' => $itemId,
                        'size_id' => 1, // Large
                        'item_size_price' => $largePrice,
                        'created_at' => Carbon::now()->timestamp,
                        'updated_at' => Carbon::now()->timestamp,
                    ];
                }

                if (!empty($itemPrices)) {
                    CafeMenuItemSize::insert($itemPrices);
                }

                // Insert addon if present
                if (!empty($addonId)) {
                    AddonSizeCafeItem::create([
                        'item_id' => $itemId,
                        'addon_size_id' => $addonId,
                        'addon_size_price' => !empty($addonPrice) ? $addonPrice : 0.00,
                        'created_at' => Carbon::now()->timestamp,
                        'updated_at' => Carbon::now()->timestamp,
                    ]);
                }
            }

            $cafe->update(['menu_completed' => 1]);

            DB::commit();

            return response()->json(['status' => 'success', 'message' => 'Items uploaded (created or updated) successfully!']);
        } catch (\Exception $e) {
            DB::rollBack();
            \Log::error("Error uploading items: " . $e->getMessage());
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while uploading items!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function olduploadItemFile(Request $request)
    {
        try {
            if (!$request->hasFile('file')) {
                return response()->json(['status' => 'error', 'message' => 'File not found.'], 400);
            }

            $file = $request->file('file');
            $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file->getPathname());
            $sheet = $spreadsheet->getActiveSheet();
            $highestRow = $sheet->getHighestDataRow();

            DB::beginTransaction();

            $cafe = Cafe::find($request->user->id);
            if (!$cafe) {
                return response()->json(['status' => 'error', 'message' => 'Cafe not found.'], 404);
            }

            for ($row = 2; $row <= $highestRow; $row++) {
                $itemName = trim($sheet->getCell("A$row")->getValue());
                $description = trim($sheet->getCell("B$row")->getValue());
                $type = trim($sheet->getCell("C$row")->getValue());
                $category = trim($sheet->getCell("D$row")->getValue());
                $icon = trim($sheet->getCell("E$row")->getValue());
                $smallPrice = trim($sheet->getCell("F$row")->getValue());
                $mediumPrice = trim($sheet->getCell("G$row")->getValue());
                $largePrice = trim($sheet->getCell("H$row")->getValue());
                $addonId = trim($sheet->getCell("I$row")->getValue());
                $addonPrice = trim($sheet->getCell("J$row")->getValue());

                if (empty($itemName)) {
                    continue; // skip empty rows
                }

                $create = [
                    'item_name' => $itemName,
                    'cafe_id' => $cafe->id,
                    'cafe_menu_id' => $category,
                    // 'item_image_id' => $icon,
                    'item_description' => $description,
                    'item_price' => $smallPrice ?: $mediumPrice ?: $largePrice ?: 0,
                    'status' => 1,
                    'item_type' => $type,
                    'created_at' => Carbon::now()->timestamp,
                    'updated_at' => Carbon::now()->timestamp,
                ];

                $itemId = CafeMenuItem::insertGetId($create);

                $itemPrices = [];
                if (!empty($smallPrice)) {
                    $itemPrices[] = [
                        'item_id' => $itemId,
                        'size_id' => 3, // Assuming 1 = Small
                        'item_size_price' => $smallPrice,
                        'created_at' => Carbon::now()->timestamp,
                        'updated_at' => Carbon::now()->timestamp,
                    ];
                }
                if (!empty($mediumPrice)) {
                    $itemPrices[] = [
                        'item_id' => $itemId,
                        'size_id' => 2, // Assuming 2 = Medium
                        'item_size_price' => $mediumPrice,
                        'created_at' => Carbon::now()->timestamp,
                        'updated_at' => Carbon::now()->timestamp,
                    ];
                }
                if (!empty($largePrice)) {
                    $itemPrices[] = [
                        'item_id' => $itemId,
                        'size_id' => 1, // Assuming 3 = Large
                        'item_size_price' => $largePrice,
                        'created_at' => Carbon::now()->timestamp,
                        'updated_at' => Carbon::now()->timestamp,
                    ];
                }

                if (!empty($itemPrices)) {
                    CafeMenuItemSize::insert($itemPrices);
                }

                // Insert addon if present
                if (!empty($addonId)) {
                    AddonSizeCafeItem::create([
                        'item_id' => $itemId,
                        'addon_size_id' => $addonId,
                        'addon_size_price' => !empty($addonPrice) ? $addonPrice : 0.00,
                        'created_at' => Carbon::now()->timestamp,
                        'updated_at' => Carbon::now()->timestamp,
                    ]);
                }

                // Suggested items (column not shown in your sheet — add logic if needed)
                // if (!empty($suggestedItemIds)) { ... }
            }

            $cafe->update(['menu_completed' => 1]);

            DB::commit();

            return response()->json(['status' => 'success', 'message' => 'Items uploaded successfully!']);
        } catch (\Exception $e) {
            DB::rollBack();
            \Log::error("Error uploading items: " . $e->getMessage());
            return response()->json([
                'status' => 'error',
                'message' => 'An error occurred while uploading items!',
                'error' => $e->getMessage(),
            ], 500);
        }
    }

}