<?php

namespace App\Http\Controllers\API\v1\RestaurantOwner;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\API\BaseController as BaseController;
use App\Http\Controllers\API\DefaultController as DefaultController;
use App\Models\User;
use App\Models\UserProfile;
use App\Models\UserDeviceToken;
use App\Models\RoleUser;
use App\Models\Role;
use App\Models\CharitableOrganization;
use App\Models\TempCampaign;
use App\Models\Restaurant;
use App\Models\Badge;
use App\Models\MenuCategory;
use App\Models\Menu;
use App\Models\MenuAddOnCategory;
use App\Models\MenuAddOn;
use App\Models\AssociateEventRestaurant;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\OrderPayment;
use App\Models\Invoice;
use Validator;
use DB, Hash, Mail;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use Illuminate\Support\Str;
use App\Services\UserService;
use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManagerStatic as Image;
use App\Services\Api\AuthTokenService;
use App\Services\DefaultServices;
use App\Services\RestaurantServices;
use App\Services\OrderServices;
use Exception;
use App\Mail\Api\Auth\ApiUserEmailVerification;

class OrderController extends Controller
{
    protected $baseController;
    protected $defaultController;
    protected $request;
    protected $userService;
    protected $authTokenService;
    protected $defaultServices;
    protected $providerService;
    protected $restaurantServices;
    protected $orderServices;

    public function __construct(BaseController $baseController, UserService $userService, AuthTokenService $authTokenService, DefaultServices $defaultServices, DefaultController $defaultController, RestaurantServices $restaurantServices, OrderServices $orderServices)
    {
        $this->baseController = $baseController;         
        $this->defaultController = $defaultController;
        $this->userService    = $userService;
        $this->authTokenService = $authTokenService;
        $this->defaultServices  = $defaultServices;
        $this->restaurantServices = $restaurantServices; 
        $this->orderServices = $orderServices;
        $this->middleware('apiTokenVal');
    }

    public function getPastOrderList($flag, Request $request)
    {
        $status_code = 0;
        $success = [];                    
        $inputs = $request->all();
        $inputs = $this->defaultServices->getTrimmedValue($inputs);
        $messageArr['input'] = $inputs;
        $userType = 'restaurant-owner';

        try 
        {
            $tokenDetails = Auth::user()->token();
            $additionalArr['user_id'] = $user_id = $tokenDetails->user_id;

            $messages = [                
                'current_timestamp.required' => 'Please provide current timestamp',
                'page_size.required' => 'Please enter limit',
                'page_count.required' => 'Please enter offset',               
            ];

            $validator = Validator::make($inputs,[                
                "current_timestamp" => 'required',
                "page_size" => 'required',
                "page_count" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $additionalArr);
                exit(0);
            }

            $userDetails = $this->restaurantServices->getRestaurantByUserId($tokenDetails->user_id);

            if(empty(objectToArray($userDetails))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'User doesn\'t exist', 200, $messageArr, $additionalArr);
                exit(0);
            }

            if(!isset($userDetails->userAssociateRestaurant->associateRestaurant->id)) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'You do not have associated with any restaurant', 200, $messageArr, $additionalArr);
                exit(0);
            }

            $restaurant_id = $userDetails->userAssociateRestaurant->associateRestaurant->id;
            $additionalArr['restaurant_id'] = $restaurant_id;

            $filters['is_confirm'] = 1;
            $orderList = $this->orderServices->orderListByRestaurant($restaurant_id, $inputs['current_timestamp'], "past");

            $success['total_count'] = $orderList->count();
            $success['order_history_List'] = [];

            $limit  = ($inputs['page_size'] <= 0) ? 10 : $inputs['page_size'];
            $offset = ($inputs['page_count'] <= 0) ? 1 : $inputs['page_count'];
            $offset = ($limit * $offset) - $limit;

            $allOrders = $orderList->offset($offset)->limit($limit)->get();
            $status_code = 1;

            if(empty(objectToArray($allOrders))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, "No order has been found.", 200, $messageArr, $additionalArr);
                exit(0);
            }            

            foreach ($allOrders as $key => $order) {

                $order_items['order_items'] = [];

                $orderArr['order_id'] = $order->id??'';
                $orderArr['order_subtotalPrice'] = $order->getPayment->total_price??"0.00";
                $orderArr['order_subtotalPrice'] = number_format($orderArr['order_subtotalPrice'], 2, '.', '');
                $orderArr['order_taxPrice'] = $order->getPayment->total_tax_price??"0.00";
                $orderArr['order_taxPrice'] = number_format($orderArr['order_taxPrice'], 2, '.', '');

                $admin_pre_preparation_time = get_setting('pre-preparation-order-time')??0;
                $admin_pre_preparation_time = date('H:i', mktime(0, $admin_pre_preparation_time));
                $order_preparationTime = $order->avg_food_prep_time??0;

                $total_pre_preparation_time = strtotime($admin_pre_preparation_time) + strtotime($order_preparationTime);
                $total_pre_preparation_time = date("H:i", $total_pre_preparation_time);

                $time = explode(":", $total_pre_preparation_time);
                $minutes = intval($time[0])*60 + intval($time[1]);

                $orderArr['order_preparationTime'] = strval($minutes)?:0;
                $orderArr['order_placed_dateWithTime'] = strtotime($order->order_date_time)?:0;
                $orderArr['order_schedule_pickup_dateWithTime'] = strtotime($order->pickup_date_time)?:0;
                $orderArr['order_actual_pickup_dateWithTime'] = strtotime($order->actual_pickup_date_time)?:0;

                $orderArr['school_id'] = $order->getEvent->eventAssociateCharitableOrganization->getCharitableOrganization->id??'';
                $orderArr['note'] = $order->user_note??'';
                $orderArr['customer_name'] = $order->getFamilyMember->name??'';
                $orderArr['order_eventId'] = $order->event_id??'';
                $orderArr['order_revenue'] = number_format(0, 2, '.', '');
                $orderArr['order_charityAmount'] = number_format(0, 2, '.', '');
                $orderArr['order_invoicePdf'] = url('/restaurantOwner/restaurant/'.encript_decript_data($restaurant_id, 'encript', 2).'/invoice/order/'.encript_decript_data($order->id, 'encript', 2));

                $orderArr['order_items'] = $list = [];
                $orderMenuItems = $order->getOrderMenuItems;

                if(empty(objectToArray($orderMenuItems))) {
                    continue;
                }

                $orderMenuItems = $orderMenuItems->values();

                foreach ($orderMenuItems as $key => $orderMenuItem) {
                    $menuDetails = $orderMenuItem->getMenuItemDetails;

                    $list = [];
                    $list['order_item_id'] = $menuDetails->id??'';
                    $list['order_item_name'] = $menuDetails->name??'';
                    $list['order_item_count'] = $orderMenuItem->quantity??0;
                    $list['order_item_price'] = $orderMenuItem->total_price??0.00;
                    $list['order_addonCategory'] = [];

                    $menuAddOncatListArr = [];

                    if($orderMenuItem->has_add_on == 1) {
                        $menuAddOnItems = $orderMenuItem->getOrderMenuAddOnItems;
                        
                        if(objectToArray($menuAddOnItems)) {
                            foreach ($menuAddOnItems as $key => $menuAddOnItem) {
                                $list['order_item_price'] += $menuAddOnItem->total_price??0;
                                $list['order_item_price'] = number_format($list['order_item_price'], 2, '.', '');

                                $menuAddOncatDetails = $menuAddOnItem->getMenuAddOnCatDetails;

                                $menuAddOncatArr = [];
                                $menuAddOncatArr['addon_categoryName'] = $menuAddOncatDetails->add_on_cat_name??'';
                                $menuAddOncatArr['addon_categoryId'] = $menuAddOncatDetails->id??'';

                                $menuAddOnDetails = $menuAddOnItem->getMenuAddOnItemDetails;
                                $menuAddOncatArr['addon_items'][] = $menuAddOnDetails->name; //."=".$menuAddOnDetails->id??'';

                                if(isset($menuAddOncatListArr[$menuAddOncatDetails->id])) 
                                {                                    
                                    $menuAddOncatListArr[$menuAddOncatDetails->id]['addon_items'][] = $menuAddOnDetails->name; //."=".$menuAddOnDetails->id??'';
                                }
                                else {                                    
                                    $menuAddOncatListArr[$menuAddOncatDetails->id] = $menuAddOncatArr;
                                }                    
                            }

                            $menuAddOncatListArr = array_values($menuAddOncatListArr);
                        }
                    }

                    if(isset($orderArr['order_items'][$menuDetails->id])) {
                        $orderArr['order_items'][$menuDetails->id]['order_item_count'] += $list['order_item_count'];
                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] += $list['order_item_price'];

                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] = number_format($orderArr['order_items'][$menuDetails->id]['order_item_price'], 2, '.', '');
                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] = strval($orderArr['order_items'][$menuDetails->id]['order_item_price']);
                        $orderArr['order_items'][$menuDetails->id]['order_addonCategory'][] = $menuAddOncatListArr;
                    }
                    else {
                        array_push($list['order_addonCategory'], $menuAddOncatListArr);
                        $orderArr['order_items'][$menuDetails->id] = $list;
                    }
                }

                $orderArr['order_items'] = array_values($orderArr['order_items']);

                array_push($success['order_history_List'], $orderArr);                             
            }

            return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'success', 200, $messageArr, $additionalArr);

        } catch (Exception $e) {
            return $this->baseController->sendRestaurantOwnerResponse(0, [], $e->getMessage(), 200, $messageArr);
        }
    }

    public function getUpcomingOrderList($flag, Request $request)
    {
        $status_code = 0;
        $success = [];                    
        $inputs = $request->all();
        $inputs = $this->defaultServices->getTrimmedValue($inputs);
        $messageArr['input'] = $inputs;
        $userType = 'restaurant-owner';

        try 
        {
            $tokenDetails = Auth::user()->token();
            $additionalArr['user_id'] = $user_id = $tokenDetails->user_id;

            $messages = [                
                'current_timestamp.required' => 'Please provide current timestamp',
                'page_size.required' => 'Please enter limit',
                'page_count.required' => 'Please enter offset',               
            ];

            $validator = Validator::make($inputs,[                
                "current_timestamp" => 'required',
                "page_size" => 'required',
                "page_count" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $additionalArr);
                exit(0);
            }

            $userDetails = $this->restaurantServices->getRestaurantByUserId($tokenDetails->user_id);

            if(empty(objectToArray($userDetails))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'User doesn\'t exist', 200, $messageArr, $additionalArr);
                exit(0);
            }

            if(!isset($userDetails->userAssociateRestaurant->associateRestaurant->id)) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'You do not have associated with any restaurant', 200, $messageArr, $additionalArr);
                exit(0);
            }

            $restaurant_id = $userDetails->userAssociateRestaurant->associateRestaurant->id;
            $additionalArr['restaurant_id'] = $restaurant_id;

            $orderList = $this->orderServices->orderListByRestaurant($restaurant_id, $inputs['current_timestamp'], "upcoming");

            $success['total_count'] = $orderList->count();
            $success['upcoming_order_List'] = [];

            $limit  = ($inputs['page_size'] <= 0) ? 10 : $inputs['page_size'];
            $offset = ($inputs['page_count'] <= 0) ? 1 : $inputs['page_count'];
            $offset = ($limit * $offset) - $limit;

            $allOrders = $orderList->offset($offset)->limit($limit)->get();
            $status_code = 1;

            if(empty(objectToArray($allOrders))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, "No order has been found.", 200, $messageArr, $additionalArr);
                exit(0);
            }

            foreach ($allOrders as $key => $order) {

                $orderArr['order_id'] = $order->id??'';
                $orderArr['order_eventId'] = $order->event_id??'';
                $orderArr['order_subtotalPrice'] = $order->getPayment->total_price??"0.00";
                $orderArr['order_subtotalPrice'] = number_format($orderArr['order_subtotalPrice'], 2, '.', '');
                $orderArr['order_taxPrice'] = $order->getPayment->total_tax_price??"0.00";
                $orderArr['order_taxPrice'] = number_format($orderArr['order_taxPrice'], 2, '.', '');

                $admin_pre_preparation_time = get_setting('pre-preparation-order-time')??0;
                $admin_pre_preparation_time = date('H:i', mktime(0, $admin_pre_preparation_time));
                $order_preparationTime = $order->avg_food_prep_time??0;

                $total_pre_preparation_time = strtotime($admin_pre_preparation_time) + strtotime($order_preparationTime);
                $total_pre_preparation_time = date("H:i", $total_pre_preparation_time);

                $time = explode(":", $total_pre_preparation_time);
                $minutes = intval($time[0])*60 + intval($time[1]);

                $orderArr['order_preparationTime'] = strval($minutes)?:0;
                $orderArr['order_placed_dateWithTime'] = strtotime($order->order_date_time)?:0;
                $orderArr['order_schedule_pickup_dateWithTime'] = strtotime($order->pickup_date_time)?:0;
                //$orderArr['order_actual_pickup_dateWithTime'] = strtotime($order->actual_pickup_date_time)?:0;

                $orderArr['school_id'] = $order->getEvent->eventAssociateCharitableOrganization->getCharitableOrganization->id??'';
                $orderArr['note'] = $order->user_note??'';
                $orderArr['customer_name'] = $order->getFamilyMember->name??'';
                $orderArr['is_confirm'] = $order->is_confirm;
                $orderArr['order_invoicePdf'] = url('/restaurantOwner/restaurant/'.encript_decript_data($restaurant_id, 'encript', 2).'/invoice/order/'.encript_decript_data($order->id, 'encript', 2));
                
                //$orderArr['order_revenue'] = number_format(0, 2, '.', '');
                //$orderArr['order_charityAmount'] = number_format(0, 2, '.', '');

                $orderArr['order_items'] = $list = [];
                $orderMenuItems = $order->getOrderMenuItems;

                if(empty(objectToArray($orderMenuItems))) {
                    continue;
                }

                $orderMenuItems = $orderMenuItems->values();

                foreach ($orderMenuItems as $key => $orderMenuItem) {
                    $menuDetails = $orderMenuItem->getMenuItemDetails;

                    $list = [];
                    $list['order_item_id'] = $menuDetails->id??'';
                    $list['order_item_name'] = $menuDetails->name??'';
                    $list['order_item_count'] = $orderMenuItem->quantity??0;
                    $list['order_item_price'] = $orderMenuItem->total_price??0.00;
                    $list['order_addonCategory'] = [];

                    $menuAddOncatListArr = [];

                    if($orderMenuItem->has_add_on == 1) {
                        $menuAddOnItems = $orderMenuItem->getOrderMenuAddOnItems;
                        
                        if(objectToArray($menuAddOnItems)) {
                            foreach ($menuAddOnItems as $key => $menuAddOnItem) {
                                $list['order_item_price'] += $menuAddOnItem->total_price??0;
                                $list['order_item_price'] = number_format($list['order_item_price'], 2, '.', '');

                                $menuAddOncatDetails = $menuAddOnItem->getMenuAddOnCatDetails;

                                $menuAddOncatArr = [];
                                $menuAddOncatArr['addon_categoryName'] = $menuAddOncatDetails->add_on_cat_name??'';
                                $menuAddOncatArr['addon_categoryId'] = $menuAddOncatDetails->id??'';

                                $menuAddOnDetails = $menuAddOnItem->getMenuAddOnItemDetails;
                                $menuAddOncatArr['addon_items'][] = $menuAddOnDetails->name; //."=".$menuAddOnDetails->id??'';

                                if(isset($menuAddOncatListArr[$menuAddOncatDetails->id])) 
                                {                                    
                                    $menuAddOncatListArr[$menuAddOncatDetails->id]['addon_items'][] = $menuAddOnDetails->name; //."=".$menuAddOnDetails->id??'';
                                }
                                else {                                    
                                    $menuAddOncatListArr[$menuAddOncatDetails->id] = $menuAddOncatArr;
                                }                    
                            }

                            $menuAddOncatListArr = array_values($menuAddOncatListArr);
                        }
                    }

                    if(isset($orderArr['order_items'][$menuDetails->id])) {
                        $orderArr['order_items'][$menuDetails->id]['order_item_count'] += $list['order_item_count'];
                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] += $list['order_item_price'];

                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] = number_format($orderArr['order_items'][$menuDetails->id]['order_item_price'], 2, '.', '');
                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] = strval($orderArr['order_items'][$menuDetails->id]['order_item_price']);
                        $orderArr['order_items'][$menuDetails->id]['order_addonCategory'][] = $menuAddOncatListArr;
                    }
                    else {
                        array_push($list['order_addonCategory'], $menuAddOncatListArr);
                        $orderArr['order_items'][$menuDetails->id] = $list;
                    }
                }

                $orderArr['order_items'] = array_values($orderArr['order_items']);

                array_push($success['upcoming_order_List'], $orderArr);
            }

            return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'success', 200, $messageArr, $additionalArr);

        } catch (Exception $e) {
            return $this->baseController->sendRestaurantOwnerResponse(0, [], $e->getMessage(), 200, $messageArr);
        }
    }

    public function getOngoingOrderList($flag, Request $request)
    {
        $status_code = 0;
        $success = [];                    
        $inputs = $request->all();
        $inputs = $this->defaultServices->getTrimmedValue($inputs);
        $messageArr['input'] = $inputs;
        $userType = 'restaurant-owner';

        try 
        {
            $tokenDetails = Auth::user()->token();
            $additionalArr['user_id'] = $user_id = $tokenDetails->user_id;

            $messages = [                
                'current_timestamp.required' => 'Please provide current timestamp',
                'page_size.required' => 'Please enter limit',
                'page_count.required' => 'Please enter offset',               
            ];

            $validator = Validator::make($inputs,[                
                "current_timestamp" => 'required',
                "page_size" => 'required',
                "page_count" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $additionalArr);
                exit(0);
            }

            $userDetails = $this->restaurantServices->getRestaurantByUserId($tokenDetails->user_id);

            if(empty(objectToArray($userDetails))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'User doesn\'t exist', 200, $messageArr, $additionalArr);
                exit(0);
            }

            if(!isset($userDetails->userAssociateRestaurant->associateRestaurant->id)) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'You do not have associated with any restaurant', 200, $messageArr, $additionalArr);
                exit(0);
            }

            $restaurant_id = $userDetails->userAssociateRestaurant->associateRestaurant->id;
            $additionalArr['restaurant_id'] = $restaurant_id;

            $filters['is_ongoing'] = 1;
            $filters['is_confirm'] = 1;            

            $orderList = $this->orderServices->orderListByRestaurant($restaurant_id, $inputs['current_timestamp'], "ongoing", $filters);

            $success['total_count'] = $orderList->count();
            $success['ongoing_order_List'] = [];

            $limit  = ($inputs['page_size'] <= 0) ? 10 : $inputs['page_size'];
            $offset = ($inputs['page_count'] <= 0) ? 1 : $inputs['page_count'];
            $offset = ($limit * $offset) - $limit;

            $allOrders = $orderList->offset($offset)->limit($limit)->get();
            $status_code = 1;

            if(empty(objectToArray($allOrders))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, "No order has been found.", 200, $messageArr, $additionalArr);
                exit(0);
            }

            foreach ($allOrders as $key => $order) {

                $orderArr['order_id'] = $order->id??'';
                $orderArr['order_eventId'] = $order->event_id??'';
                $orderArr['order_subtotalPrice'] = $order->getPayment->total_price??"0.00";
                $orderArr['order_subtotalPrice'] = number_format($orderArr['order_subtotalPrice'], 2, '.', '');
                $orderArr['order_taxPrice'] = $order->getPayment->total_tax_price??"0.00";
                $orderArr['order_taxPrice'] = number_format($orderArr['order_taxPrice'], 2, '.', '');

                $admin_pre_preparation_time = get_setting('pre-preparation-order-time')??0;
                $admin_pre_preparation_time = date('H:i', mktime(0, $admin_pre_preparation_time));
                $order_preparationTime = $order->avg_food_prep_time??0;

                $total_pre_preparation_time = strtotime($admin_pre_preparation_time) + strtotime($order_preparationTime);
                $total_pre_preparation_time = date("H:i", $total_pre_preparation_time);

                $time = explode(":", $total_pre_preparation_time);
                $minutes = intval($time[0])*60 + intval($time[1]);

                $orderArr['order_preparationTime'] = strval($minutes)?:0;
                $orderArr['order_placed_dateWithTime'] = strtotime($order->order_date_time)?:0;
                $orderArr['order_schedule_pickup_dateWithTime'] = strtotime($order->pickup_date_time)?:0;
                //$orderArr['order_actual_pickup_dateWithTime'] = strtotime($order->actual_pickup_date_time)?:0;

                $orderArr['school_id'] = $order->getEvent->eventAssociateCharitableOrganization->getCharitableOrganization->id??'';
                $orderArr['note'] = $order->user_note??'';
                $orderArr['customer_name'] = $order->getFamilyMember->name??'';
                $orderArr['order_status'] = $order->order_status_by_restaurant??'';
                $orderArr['order_invoicePdf'] = url('/restaurantOwner/restaurant/'.encript_decript_data($restaurant_id, 'encript', 2).'/invoice/order/'.encript_decript_data($order->id, 'encript', 2));
                //$orderArr['is_confirm'] = $order->is_confirm;
                
                //$orderArr['order_revenue'] = number_format(0, 2, '.', '');
                //$orderArr['order_charityAmount'] = number_format(0, 2, '.', '');

               $orderArr['order_items'] = $list = [];
                $orderMenuItems = $order->getOrderMenuItems;

                if(empty(objectToArray($orderMenuItems))) {
                    continue;
                }

                $orderMenuItems = $orderMenuItems->values();

                foreach ($orderMenuItems as $key => $orderMenuItem) {
                    $menuDetails = $orderMenuItem->getMenuItemDetails;

                    $list = [];
                    $list['order_item_id'] = $menuDetails->id??'';
                    $list['order_item_name'] = $menuDetails->name??'';
                    $list['order_item_count'] = $orderMenuItem->quantity??0;
                    $list['order_item_price'] = $orderMenuItem->total_price??0.00;
                    $list['order_addonCategory'] = [];

                    $menuAddOncatListArr = [];

                    if($orderMenuItem->has_add_on == 1) {
                        $menuAddOnItems = $orderMenuItem->getOrderMenuAddOnItems;
                        
                        if(objectToArray($menuAddOnItems)) {
                            foreach ($menuAddOnItems as $key => $menuAddOnItem) {
                                $list['order_item_price'] += $menuAddOnItem->total_price??0;
                                $list['order_item_price'] = number_format($list['order_item_price'], 2, '.', '');

                                $menuAddOncatDetails = $menuAddOnItem->getMenuAddOnCatDetails;

                                $menuAddOncatArr = [];
                                $menuAddOncatArr['addon_categoryName'] = $menuAddOncatDetails->add_on_cat_name??'';
                                $menuAddOncatArr['addon_categoryId'] = $menuAddOncatDetails->id??'';

                                $menuAddOnDetails = $menuAddOnItem->getMenuAddOnItemDetails;
                                $menuAddOncatArr['addon_items'][] = $menuAddOnDetails->name; //."=".$menuAddOnDetails->id??'';

                                if(isset($menuAddOncatListArr[$menuAddOncatDetails->id])) 
                                {                                    
                                    $menuAddOncatListArr[$menuAddOncatDetails->id]['addon_items'][] = $menuAddOnDetails->name; //."=".$menuAddOnDetails->id??'';
                                }
                                else {                                    
                                    $menuAddOncatListArr[$menuAddOncatDetails->id] = $menuAddOncatArr;
                                }                    
                            }

                            $menuAddOncatListArr = array_values($menuAddOncatListArr);
                        }
                    }

                    if(isset($orderArr['order_items'][$menuDetails->id])) {
                        $orderArr['order_items'][$menuDetails->id]['order_item_count'] += $list['order_item_count'];
                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] += $list['order_item_price'];

                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] = number_format($orderArr['order_items'][$menuDetails->id]['order_item_price'], 2, '.', '');
                        $orderArr['order_items'][$menuDetails->id]['order_item_price'] = strval($orderArr['order_items'][$menuDetails->id]['order_item_price']);
                        $orderArr['order_items'][$menuDetails->id]['order_addonCategory'][] = $menuAddOncatListArr;
                    }
                    else {
                        array_push($list['order_addonCategory'], $menuAddOncatListArr);
                        $orderArr['order_items'][$menuDetails->id] = $list;
                    }
                }

                $orderArr['order_items'] = array_values($orderArr['order_items']);

                array_push($success['ongoing_order_List'], $orderArr);
            }

            return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'success', 200, $messageArr, $additionalArr);

        } catch (Exception $e) {
            return $this->baseController->sendRestaurantOwnerResponse(0, [], $e->getMessage(), 200, $messageArr);
        }
    }

    public function changeOrderStatus($flag, Request $request)
    {
        $status_code = 0;
        $success = [];                    
        $inputs = $request->all();
        $inputs = $this->defaultServices->getTrimmedValue($inputs);
        $messageArr['input'] = $inputs;
        $userType = 'restaurant-owner';

        try 
        {
            $tokenDetails = Auth::user()->token();
            $additionalArr['user_id'] = $user_id = $tokenDetails->user_id;

            $messages = [
                'order_id.required' => 'Please select order',
                'order_status.required' => 'Please select order status',
                'current_timestamp.required' => 'Please provide current timestamp',
            ];

            $validator = Validator::make($inputs,[
                "order_id" => 'required',
                "order_status" => 'required|min:0',
                "current_timestamp" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $additionalArr);
                exit(0);
            }

            $userDetails = $this->restaurantServices->getRestaurantByUserId($tokenDetails->user_id);

            if(empty(objectToArray($userDetails))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'User doesn\'t exist', 200, $messageArr, $additionalArr);
                exit(0);
            }

            if(!isset($userDetails->userAssociateRestaurant->associateRestaurant->id)) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'You do not have associated with any restaurant', 200, $messageArr, $additionalArr);
                exit(0);
            }

            $restaurant_id = $userDetails->userAssociateRestaurant->associateRestaurant->id;
            $additionalArr['restaurant_id'] = $restaurant_id;

            $orderDetails = Order::with(["getRestaurant"])
                            ->where('restaurant_id', $restaurant_id)
                            ->where("is_active", 1)
                            ->where("id", $inputs['order_id'])->first();

            if(empty(objectToArray($orderDetails))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'No order found', 200, $messageArr, $additionalArr);
                exit(0);
            }

            if($orderDetails->is_confirm == 0) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'Please confirm the order first', 200, $messageArr, $additionalArr);
                exit(0);
            }

            $orderDetails->order_status_by_restaurant = $inputs['order_status'];

            if($orderDetails->order_status_by_restaurant == 2) {
                $orderDetails->actual_pickup_date_time = date("Y-m-d H:i:s", $inputs['current_timestamp']);
                $orderDetails->is_ongoing = 0;
            }
            $orderDetails->save();

            $msg = '';
            if($inputs['order_status'] == 0) {
                $msg = "Order is preparing.";
            }
            else if($inputs['order_status'] == 1) {
                $msg = "Order has been marked as ready for pickup.";
            }
            else if($inputs['order_status'] == 2) {
                $msg = "Order has been picked up.";
            }

            $status_code = 1;

            return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, $msg, 200, $messageArr, $additionalArr);

        } catch (Exception $e) {
            return $this->baseController->sendRestaurantOwnerResponse(0, [], $e->getMessage(), 200, $messageArr);
        }
    }

    public function confirmOrder($flag, Request $request)
    {
        $status_code = 0;
        $success = [];                    
        $inputs = $request->all();
        $inputs = $this->defaultServices->getTrimmedValue($inputs);
        $messageArr['input'] = $inputs;
        $userType = 'restaurant-owner';

        try 
        {
            $tokenDetails = Auth::user()->token();
            $additionalArr['user_id'] = $user_id = $tokenDetails->user_id;

            $messages = [
                'order_id.required' => 'Please select order',                
            ];

            $validator = Validator::make($inputs,[
                "order_id" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $additionalArr);
                exit(0);
            }

            $userDetails = $this->restaurantServices->getRestaurantByUserId($tokenDetails->user_id);

            if(empty(objectToArray($userDetails))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'User doesn\'t exist', 200, $messageArr, $additionalArr);
                exit(0);
            }

            if(!isset($userDetails->userAssociateRestaurant->associateRestaurant->id)) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'You do not have associated with any restaurant', 200, $messageArr, $additionalArr);
                exit(0);
            }

            $restaurant_id = $userDetails->userAssociateRestaurant->associateRestaurant->id;
            $additionalArr['restaurant_id'] = $restaurant_id;

            $orderDetails = Order::with(["getRestaurant"])
                            ->where('restaurant_id', $restaurant_id)
                            ->where("is_active", 1)
                            ->where("id", $inputs['order_id'])->first();

            if(empty(objectToArray($orderDetails))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'No order found', 200, $messageArr, $additionalArr);
                exit(0);
            }

            $orderDetails->is_confirm = 1;
            $orderDetails->save();

            $status_code = 1;

            return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, "You have successfully confirmed the order.", 200, $messageArr, $additionalArr);

        } catch (Exception $e) {
            return $this->baseController->sendRestaurantOwnerResponse(0, [], $e->getMessage(), 200, $messageArr);
        }
    }

    public function getTransactionDetails($flag, Request $request)
    {
        $status_code = 0;
        $success = [];                    
        $inputs = $request->all();
        $inputs = $this->defaultServices->getTrimmedValue($inputs);
        $messageArr['input'] = $inputs;
        $userType = 'restaurant-owner';

        try 
        {
            $tokenDetails = Auth::user()->token();
            $additionalArr['user_id'] = $user_id = $tokenDetails->user_id;

            $messages = [
                'from_timestamp.required' => 'Please select start date',
                'to_timestamp.required' => 'Please select end date',
                'page_count.required' => 'Please provide page count',
                'page_size.required' => 'Please provide page size',
            ];

            $validator = Validator::make($inputs,[
                "from_timestamp" => 'required',
                "to_timestamp" => 'required',
                "page_count" => 'required',
                "page_size" => 'required',
            ], $messages);

            if($validator->fails()) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, $validator->errors()->first(), 200, $messageArr, $additionalArr);
                exit(0);
            }

            $userDetails = $this->restaurantServices->getRestaurantByUserId($tokenDetails->user_id);

            if(empty(objectToArray($userDetails))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'User doesn\'t exist', 200, $messageArr, $additionalArr);
                exit(0);
            }

            if(!isset($userDetails->userAssociateRestaurant->associateRestaurant->id)) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, 'You do not have associated with any restaurant', 200, $messageArr, $additionalArr);
                exit(0);
            }

            $restaurant_id = $userDetails->userAssociateRestaurant->associateRestaurant->id;
            $additionalArr['restaurant_id'] = $restaurant_id;

            $whereFiltersArr = $otherFiltersArr = [];
            $whereFiltersArr['is_confirm'] = 1;
            $whereFiltersArr['order_status_by_restaurant'] = 2; // pickued up / delivered

            $otherFiltersArr['from_pickup_date'] = date("Y-m-d", $inputs['from_timestamp']);
            $otherFiltersArr['to_pickup_date'] = date("Y-m-d", $inputs['to_timestamp']);

            $orderList = $this->orderServices->orderTransactionListByRestaurant($restaurant_id, $whereFiltersArr, $otherFiltersArr);

            $success['total_count'] = $orderList->count();

            $final_price = $orderList->get()->sum(function ($order) {
                return $order->getPayment->final_price;
            });

            $success['total_earning'] = floatval(number_format($final_price, 2, '.', ''))?:0;
            $success['transaction_List'] = [];

            $limit  = ($inputs['page_size'] <= 0) ? 10 : $inputs['page_size'];
            $offset = ($inputs['page_count'] <= 0) ? 1 : $inputs['page_count'];
            $offset = ($limit * $offset) - $limit;

            $allOrders = $orderList->offset($offset)->limit($limit)->get();
            $status_code = 1;

            if(empty(objectToArray($allOrders))) {
                return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, "No order has been found.", 200, $messageArr, $additionalArr);
                exit(0);
            }

            foreach ($allOrders as $key => $order) {

                $orderArr['order_id'] = $order->id??'';
                $orderArr['order_ID'] = $order->order_ID??'';
                $orderArr['customer_name'] = $order->getFamilyMember->name??'';
                $orderArr['order_date'] = strtotime($order->order_date_time)?:0;
                $orderArr['order_schedule_pickup_dateWithTime'] = strtotime($order->pickup_date_time)?:0;
                $orderArr['order_actual_pickup_dateWithTime'] = strtotime($order->actual_pickup_date_time)?:0;
                $orderArr['order_amount'] = floatval($order->getPayment->final_price)?:0;
                $orderArr['order_status'] = $order->getPayment->payment_status == 1?"P":"U";

                array_push($success['transaction_List'], $orderArr);                             
            }

            return $this->baseController->sendRestaurantOwnerResponse($status_code, $success, "success", 200, $messageArr, $additionalArr);

        } catch (Exception $e) {
            return $this->baseController->sendRestaurantOwnerResponse(0, [], $e->getMessage(), 200, $messageArr);
        }
    }


}
