<?php

use App\Mail\Outofstock;

if (! function_exists('getUserId')) {
    function getLoggedInUserId() {
        return Auth::user()->id;
    }
}

if (! function_exists('getBookingApi')) {
    function getBookingApi($user_id, $city) {

        $getAllApis = App\ApiUser::where('user_id', $user_id)->get();
        $apiId = null;

        foreach($getAllApis as $api){
            if(in_array(trim(strtoupper($city)), json_decode($api->cities, true))){
                $apiId = $api->api_id;
            }
        }

        if(!is_null($apiId)){
            return $apiId;
        }

        $checkCity = App\MagentoCity::where('city', strtoupper($city))->first();

        if(is_null($checkCity)){
            dd('Destination city '.strtoupper($city).' not found');
        }

        return false;
    }
}

if (! function_exists('getCityNameOrCode')) {
    function getCityNameOrCode($city, $apiId) {
        $get = App\ShippingCity::where([['city', strtolower($city)], ['api_id', $apiId]])->first();

        if(!is_null($get)){
            return $get->code;
        }

        return false;
    }
}

if (! function_exists('computePackageDetails')) {
    function computePackageDetails($request, $postArray) {
        $orderId = $request->order_id;
        $requestBodies = [];
$totalItemsOrderedQty = DB::table('order_items')->where('parent_id', $request->id)->count();
        $shipping_amount = $request->order_shipping_amount/$totalItemsOrderedQty;

	// $discount_amount = $request->order_discount_amount/$totalItemsOrderedQty;


      //  add new code price count

        $discount_amount = $request->order_discount_amount;

        if($discount_amount != '0.0000'){
        for($i=0; $i<max($request->package); $i++){

            $pieces = 0;


            for($x=0; $x<sizeof($request->package); $x++){
                if($request->package[$x] == $i+1){

                    $pieces = $pieces + $request->quantity_confirmed[$x];

                    $disc =   substr($pieces, -1, 1);

                  //  $discount_amount =  $discount_amount/$disc;
		$discount_amount =  $discount_amount;

              }}

            }
        }

        //
	 
 
//	print_r($discount_amount);
//		die;
	

        for($i=0; $i<max($request->package); $i++){
            $weight = 0;
            $pieces = 0;
            $product_details = '';
            $total_amount = 0;

            for($x=0; $x<sizeof($request->package); $x++){
                if($request->package[$x] == $i+1){
                    $oldConfirmedQty =  DB::table('order_items')->where('order_product_id', $request->order_product_id[$x])->first();

                    $oldQty = 0;

                    if(!is_null($oldConfirmedQty)){
                        $oldQty = $oldConfirmedQty->qty_confirmed;
                    }
                    $weight = $weight + $request->item_weight[$x];
                    $pieces = $pieces + $request->quantity_confirmed[$x];

                    $product_details .= ' / '.$request->sku[$x].' ('.($request->quantity_confirmed[$x] - $oldQty).')';

                    $priceOfIndvItem = ((($request->item_row_total[$x]/$request->quantity_ordered[$x]) * ($request->quantity_confirmed[$x] - $oldQty)) + (($request->item_tax[$x]/$request->quantity_ordered[$x]) * ($request->quantity_confirmed[$x] - $oldQty)) * ($request->quantity_confirmed[$x] - $oldQty));


                    // $priceOfIndvItem = ($request->item_row_total[$x]) * ($request->quantity_confirmed[$x] - $oldQty);

                    if($priceOfIndvItem == 0){
                        $getRulesIds =  DB::table('order_items')->where('order_product_id', $request->order_product_id[$x])->first();

                        if(!is_null($getRulesIds)){
    $orderItems =  DB::table('order_items')->where([['parent_id', $request->id], ['applied_rule_ids', $getRulesIds->applied_rule_ids], ['order_product_id', '<>', $request->order_product_id[$x]]])->get();

                            if(!empty($orderItems)){
                                foreach($orderItems as $orderItem){
                                    $indexOfItemConfirmedStatus = array_search($orderItem->item_id, $request->item_id);

                                    $final_row_total = $request->item_row_total[$indexOfItemConfirmedStatus] - $request->item_discount[$indexOfItemConfirmedStatus];

                                    if($request->item_remarks[$indexOfItemConfirmedStatus] != 'Shipped' && $final_row_total > 0){
                                        dd('This order cannot be booked: All items with Non Zero row total are not scanned');
                                    }
                                }
                            }
                        }
                    }

		 $finalShipping = $shipping_amount;
		  //  $finalShipping = ceil(($shipping_amount/$request->quantity_ordered[$x]) * ($request->quantity_confirmed[$x] - $oldQty));
        //            $finalDiscount = ceil(($discount_amount/$request->quantity_ordered[$x]) * ($request->quantity_confirmed[$x] - $oldQty));
		  
		   //finalDiscount null check 
		    if($finalDiscount == null){
		    $finalDiscount = 0;
		    }
		   
      //    $total_amount = $total_amount + $priceOfIndvItem  + $finalShipping - $finalDiscount;

echo $discount_amount ."<br>";
echo $total_amount . "<br>";
echo $finalShipping ."<br>";
echo $priceOfIndvItem ."<br>";
die();
                }
  
	    }
	  
	//testing 
	// $total_amount = $total_amount + $priceOfIndvItem  + $finalShipping - $finalDiscount;  
	  //die();
          $total_amount = ceil($total_amount);

            if($request->order_payment_method != 'Cash on Delivery (COD)'){
                $total_amount = 0;
            }

            $key_price = array_search("{cod_amount}", $postArray);
            $key_weight = array_search("{weight}", $postArray);
            $key_pieces = array_search("{pieces}", $postArray);
            $key_product_detaials = array_search("{product_detail}", $postArray);

            $postArray[$key_price] = $total_amount;
            $postArray[$key_weight] = $weight < 0.5? 0.5 : $weight;
            $postArray[$key_pieces] = $pieces;
            $postArray[!$key_product_detaials? 'product_detail' : $key_product_detaials] = $product_details;

            $requestBodies[] = $postArray;

            // Resetting key values for next request building
            $postArray[$key_price] = '{cod_amount}';
            $postArray[$key_weight] = '{weight}';
            $postArray[$key_pieces] = '{pieces}';
            $postArray[$key_product_detaials] = '{product_detail}';
        }

        return $requestBodies;
    }
}

if (! function_exists('computeReshipPackageDetails')) {
    function computeReshipPackageDetails($request, $postArray) {
        $orderId = $request->order_id;

        $requestBodies = [];

        for($i=0; $i<max($request->package); $i++){
            $weight = 0;
            $pieces = 0;
            $product_details = '';
            $total_amount = 0;

            for($x=0; $x<sizeof($request->package); $x++){
                if($request->package[$x] == $i+1){
                    $shipmentItems = App\ShipmentItem::where('item_id', $request->item_id[$x])->orderBy('id', 'DESC')->first();

                    $weight = $weight + $shipmentItems->weight;
                    $pieces = $pieces + $shipmentItems->shipped_qty;
                    $product_details .= ' / '.$shipmentItems->sku.' ('.($shipmentItems->shipped_qty).')';

                    $total_amount = $total_amount + ($shipmentItems->sub_total + $shipmentItems->shipping_amount);
                }
            }

            $total_amount = ceil($total_amount);

            if($request->order_payment_method != 'Cash On Delivery'){
                $total_amount = 0;
            }

            $key_price = array_search("{cod_amount}", $postArray);
            $key_weight = array_search("{weight}", $postArray);
            $key_pieces = array_search("{pieces}", $postArray);
            $key_product_detaials = array_search("{product_detail}", $postArray);

            $postArray[$key_price] = $total_amount;
            $postArray[$key_weight] = $weight < 0.5? 0.5 : $weight;
            $postArray[$key_pieces] = $pieces;
            $postArray[!$key_product_detaials? 'product_detail' : $key_product_detaials] = $product_details;

            $requestBodies[] = $postArray;

            // Resetting key values for next request building
            $postArray[$key_price] = '{cod_amount}';
            $postArray[$key_weight] = '{weight}';
            $postArray[$key_pieces] = '{pieces}';
            $postArray[$key_product_detaials] = '{product_detail}';
        }

        return $requestBodies;
    }
}

if (! function_exists('updateCurrentDetails')) {
    function updateCurrentDetails($request, $cn_array, $api_name) {
        $orderId = $request->id;

        $allItemsArray = [];

        $allItems = DB::table('order_items')->where('parent_id', $orderId)->select('item_id')->get();

        foreach($allItems as $_item){
            $allItemsArray[] = $_item->item_id;
        }

        $arrayDiff = array_diff($allItemsArray, $request->all()['item_id']);

        $messages = [];

        if(!empty($arrayDiff)){
            foreach($arrayDiff as $_diffItem){
                $extraItem = DB::table('order_items')->where('item_id', $_diffItem)->first();

                if($extraItem->remarks != 'Shipped'){

                    $currentRemarks = is_null($extraItem->remarks)? 'Pending' : $extraItem->remarks;

                    $messages[] = $extraItem->sku.' was not Shipped due to being '.$currentRemarks.' on '.date('Y-m-d H:i:s');

                    $params = array('order_number' => $request->order_number, 'item_id' => $extraItem->item_id, 'sku' => $extraItem->sku, 'remarks' => $currentRemarks, 'ordered_quantity' => $extraItem->qty_ordered, 'confirm_quantity' => $extraItem->qty_confirmed, 'user_id' => Auth::user()->id);

                    $update = App\BookingDetail::create($params);

                    $updateItemRow = DB::table('order_items')->where('item_id', $_diffItem)->update(array('remarks' => $currentRemarks));
                }
            }
        }

        $totalItemsOrderedQty = sizeof($allItems);

        $shipping_amount = $request->order_shipping_amount/$totalItemsOrderedQty;

        for($i=0; $i<sizeof($request->item_remarks); $i++){
            if($request->quantity_confirmed[$i] == 0){
                $messages[] = $request->sku[$i].' was not Shipped due to being '.$request->item_remarks[$i].' on '.date('Y-m-d H:i:s');

                $params = array('order_number' => $request->order_number, 'item_id' => $request->item_id[$i], 'sku' => $request->sku[$i], 'remarks' => $request->item_remarks[$i], 'ordered_quantity' => $request->quantity_ordered[$i], 'confirm_quantity' => $request->quantity_confirmed[$i], 'user_id' => Auth::user()->id);

                $itemsParams = array('remarks' => $request->item_remarks[$i], 'qty_confirmed' => $request->quantity_confirmed[$i]);

                if($request->item_remarks[$i] == 'Out of Stock'){
                    $details = array('sku' => $request->sku[$i], 'order_number' => $request->order_number, 'consignee_name' => $request->customer_name);

                    // Mail::to($request->customer_email)->send(new Outofstock($details));
                }
            }else{
                $cnnumber = is_null($request->package[$i])? null : $cn_array[$request->package[$i]-1];

                $message = $request->sku[$i].' was Shipped in package '.$request->package[$i].' with Cn # '.$cnnumber.' on '.date('Y-m-d H:i:s');

                if(is_null($request->package[$i])){
                    $message = $request->sku[$i].' was not Shipped on due to being '.$request->item_remarks[$i].' on '.date('Y-m-d H:i:s');
                }

                $messages[] = $message;

                $params = array('order_number' => $request->order_number, 'item_id' => $request->item_id[$i], 'sku' => $request->sku[$i], 'remarks' => $request->item_remarks[$i], 'ordered_quantity' => $request->quantity_ordered[$i], 'confirm_quantity' => $request->quantity_confirmed[$i], 'package' => $request->package[$i], 'cn_number' => is_null($request->package[$i])? null : $cn_array[$request->package[$i]-1], 'user_id' => Auth::user()->id);

                $oldConfirmedQty = DB::table('order_items')->where('order_product_id', $request->item_id[$i])->first();

                $oldQty = 0;

                if(!is_null($oldConfirmedQty)){
                    $oldQty = $oldConfirmedQty->qty_confirmed;
                }

                $shippedQty = $request->quantity_confirmed[$i] - $oldQty;

                if($shippedQty == 0){
                    $shippedQty = $request->quantity_confirmed[$i];
                }

                if($shippedQty < 0){
                    $shippedQty = ($shippedQty) * (-1);
                }

                $itemsParams = array('remarks' => $request->item_remarks[$i], 'qty_confirmed' => $shippedQty, 'booking_timestamp' => now());

                if(!is_null($cnnumber)){
                    $shipment_id = null;

                    $checkIfShipmentIsCreated = App\Shipment::where([['order_number', $request->order_number], ['cnnumber', $cn_array[$request->package[$i]-1]]])->first();

                    if(is_null($checkIfShipmentIsCreated)){
                        $shipmentParams = array('order_number' => $request->order_number, 'cnnumber' => $cn_array[$request->package[$i]-1], 'courier' => $api_name, 'shipment_booked_by' => Auth::user()->id, 'shipment_booked_datetime' => now(), 'shipment_status' => 'Shipped');

                        $shipment_id = App\Shipment::create($shipmentParams);
                    }else{
                        $shipment_id = $checkIfShipmentIsCreated;
                    }

                    $finalShipping = ceil(($shipping_amount/$request->quantity_ordered[$i]) * ($request->quantity_confirmed[$i] - $oldQty));

                    if($finalShipping < 0)
                    {
                        $finalShipping = ($finalShipping) * (-1);
                    }

                    $shippedQty = $request->quantity_confirmed[$i] - $oldQty;

                    if($shippedQty == 0){
                        $shippedQty = $request->quantity_confirmed[$i];
                    }

                    if($shippedQty < 0){
                        $shippedQty = ($shippedQty) * (-1);
                    }

                    $discounted = ((($request->item_row_total[$i]/$request->quantity_ordered[$i]) * ($request->quantity_confirmed[$i] - $oldQty)) - (($request->item_discount[$i]/$request->quantity_ordered[$i]) * ($request->quantity_confirmed[$i] - $oldQty)));
                    $shipmentSubtotal = $request->item_row_total[$i]+$finalShipping;

                    if($shipmentSubtotal < 0)
                    {
                        $shipmentSubtotal = ($shipmentSubtotal) * (-1);
                    }

                    $shipmentItemParams = array('shipment_id' => $shipment_id->id, 'item_id' => $request->item_id[$i], 'sku' => $request->sku[$i], 'unit_price' => ($request->item_row_total[$i]/$request->quantity_ordered[$i]), 'shipped_qty' => $shippedQty, 'discount' => $discounted, 'shipping_amount' => $finalShipping, 'sub_total' => $shipmentSubtotal, 'total_tax' => $request->item_tax[$i], 'weight' => $request->item_weight[$i]);

                    $createShipmentItem = App\ShipmentItem::create($shipmentItemParams);
                }
            }

            $update = App\BookingDetail::create($params);

            $updateItemRow = DB::table('order_items')->where('order_product_id', $request->item_id[$i])->update($itemsParams);
        }

        $shippedItems = DB::table('order_items')->where([['parent_id', $request->id], ['remarks', 'Shipped']])->count();

        $outOfStockItems = DB::table('order_items')->where([['parent_id', $request->id], ['remarks', 'Out of Stock']])->count();

        $totalShippedAndOOS = $shippedItems + $outOfStockItems;

        $orderItemsCount = count($allItems);

        if($orderItemsCount == $totalShippedAndOOS){
            $messages[] = "Order marked Shipped via cp.makeupcityshop.com";
            $new_status = 'Shipped';
        }else{
            $messages[] = "Order marked Partially Shipped via cp.makeupcityshop.com";
            $new_status = 'Partially Shipped';
        }

        $updateOrder = DB::table('orders')->where('order_id', $request->order_id)->update(array('status' => $new_status));

        $addOrderComment = App\OrderComment::create([
            'parent_id' => $request->id,
            'comment' => implode('<br><br>', $messages),
            'status' => $new_status
        ]);

        // API CALL TO UPDATE MAGENTO
        // Call moved to function update_order_queue for speed issues

        $updateQueue = DB::table('order_update_queue')->insert([
            'order_id' => $request->order_id,
            'order_number' => $request->order_number,
            'comments' => implode('<br><br>', $messages),
            'tracking_no' => json_encode($cn_array),
            'carrier_code' => $api_name,
            'status' => $new_status,
            'is_updated' => 0,
            'created_at' => now(),
            'updated_at' => now()
        ]);

        $note = implode('<br><br>', $messages);

        $line_items = [];
        for($i = 0; $i < sizeof($request->quantity_remaining); $i++){
            if($request->quantity_confirmed[$i] != 0){
                $line_items[] = array("id" => $request->order_product_id[$i], "quantity" => $request->quantity_confirmed[$i]);
            }
        }

        $confirmed_line_items = json_encode($line_items);

        $remarks_array = [];
        foreach($request->item_remarks as $remark){
            $remarks_array[] = $remark;
        }

        $final_cn_numbers = implode(',',$cn_array);

        if(!in_array('Pending', $remarks_array)){
            shopify_update_order('https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com', $request->order_id, '{ "order": { "id": "'.$request->order_id.'", "tags": "Shipped" } }');
            shopify_create_fulfillment('https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com', $request->order_id, '{ "fulfillment": { "location_id": "61998137537", "tracking_number": "'.$final_cn_numbers.'", "tracking_urls": [""], "notify_customer": true, "tracking_company": "'.$api_name.'" } }');
            shopify_update_order('https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com', $request->order_id, '{ "order": { "id": "'.$request->order_id.'", "note": "'.$note.'" } }');
            shopify_post_request('https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com/'.$request->order_id.'/close.json', '{}');
            connector_update_order($request->order_id, 'Shipped');
        } else {
            shopify_update_order_partial('https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com', $request->order_id, '{ "order": { "id": "'.$request->order_id.'", "tags": "Partially Shipped" } }');
            shopify_create_fulfillment('https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com', $request->order_id, '{ "fulfillment": { "location_id": "61998137537", "tracking_number": "'.$final_cn_numbers.'", "tracking_urls": [""], "notify_customer": true, "tracking_company": "'.$api_name.'", "line_items": '.$confirmed_line_items.' } }');
            shopify_update_order('https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com', $request->order_id, '{ "order": { "id": "'.$request->order_id.'", "note": "'.$note.'" } }');
            connector_update_order($request->order_id, 'Partially Shipped');
        }
    }
}

if (! function_exists('updateCurrentReshipDetails')) {
    function updateCurrentReshipDetails($request, $cn_array, $api_name) {
        $orderId = $request->id;

        for($i=0; $i<sizeof($request->item_remarks); $i++){
            $cnnumber = is_null($request->package[$i])? null : $cn_array[$request->package[$i]-1];

            $messages[] = $request->sku[$i].' was Shipped in package '.$request->package[$i].' with Cn # '.$cnnumber.' on '.date('Y-m-d H:i:s');

            $params = array('order_number' => $request->order_number, 'item_id' => $request->item_id[$i], 'sku' => $request->sku[$i], 'remarks' => $request->item_remarks[$i], 'ordered_quantity' => $request->quantity_ordered[$i], 'confirm_quantity' => $request->quantity_confirmed[$i], 'package' => $request->package[$i], 'cn_number' => is_null($request->package[$i])? null : $cn_array[$request->package[$i]-1], 'user_id' => Auth::user()->id);

            if(!is_null($cnnumber)){
                $shipment_id = null;

                $checkIfShipmentIsCreated = App\Shipment::where([['order_number', $request->order_number], ['cnnumber', $cn_array[$request->package[$i]-1]]])->first();

                if(is_null($checkIfShipmentIsCreated)){
                    $shipmentParams = array('order_number' => $request->order_number, 'cnnumber' => $cn_array[$request->package[$i]-1], 'courier' => $api_name, 'shipment_booked_by' => Auth::user()->id, 'shipment_booked_datetime' => now(), 'shipment_status' => 'Shipped');

                    $shipment_id = App\Shipment::create($shipmentParams);
                }else{
                    $shipment_id = $checkIfShipmentIsCreated;
                }

                $existingShipmentItem = App\ShipmentItem::where([['shipment_id', $request->shipment_id], ['item_id', $request->item_id[$i]]])->orderBy('id', 'DESC')->first();

                $shipmentItemParams = array('shipment_id' => $shipment_id->id, 'item_id' => $request->item_id[$i], 'sku' => $existingShipmentItem->sku, 'unit_price' => $existingShipmentItem->unit_price, 'shipped_qty' => $existingShipmentItem->shipped_qty, 'discount' => $existingShipmentItem->discount, 'shipping_amount' => $existingShipmentItem->shipping_amount, 'sub_total' => $existingShipmentItem->sub_total, 'total_tax' => $existingShipmentItem->total_tax, 'weight' => $existingShipmentItem->weight);

                $createShipmentItem = App\ShipmentItem::create($shipmentItemParams);
            }

            $update = App\BookingDetail::create($params);
        }

        $shippedItems = App\Shipment::where([['order_number', $request->order_number], ['shipment_status', 'Shipped']])
        ->join('shipment_items', 'shipment_items.shipment_id', 'shipments.id')
        ->sum('shipped_qty');

        $outOfStockItems = App\OrderItem::where([['parent_id', $request->id], ['remarks', 'Out of Stock']])->sum('qty_confirmed');

        $totalShippedAndOOS = $shippedItems + $outOfStockItems;

        $orderItemsCount = $totalItemQuantity = OrderItem::where('parent_id', $orderId)->sum('qty_ordered');

        if($orderItemsCount == $totalShippedAndOOS){
            if($request->order_payment_method == 'Cash On Delivery'){
                $new_status = 'codshipped';
                $new_state = 'processing';
            }else{
                $new_status = 'shipped';
                $new_state = 'complete';
            }
        }else{
            $new_status = 'partiallyintransit';
            $new_state = 'processing';
        }

        $updateOrder = App\Order::where('order_number', $request->order_number)->update(array('status' => $new_status));

        $addOrderComment = App\OrderComment::create([
            'parent_id' => $request->id,
            'comment' => implode('<br><br>', $messages),
            'status' => $new_status
        ]);

        // API CALL TO UPDATE MAGENTO
        $params = [
            'order_id' => $request->order_id,
            'comments' => implode('<br><br>', $messages),
            'tracking_no' => $cn_array,
            'carrier_code' => $api_name,
            'ship_title' => $api_name,
            'customer_email_Comments' => implode('<br><br>', $messages),
            'status' => $new_status,
            'state' => $new_state
        ];

        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('POST', 'https://cp.makeupcityshop.com/warehouseapirest/index/updateordertracking', [
                'form_params' => $params
            ]);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }
    }
}

if(!function_exists('getUserBrands')){
    function getUserBrands($request) {
        $request_brands = [];
        $user_brands = [];
        $result = [];

        foreach($request as $val){
            $request_brands[] = explode('-',$val->item_sku)[0];
        }

        $users = DB::table('user_brand_pivot')->where('user_brand_pivot.user_id', Auth::user()->id)
        ->join('brands', 'brands.id', 'user_brand_pivot.brand_id')
        ->select('brands.*')
        ->get();

        foreach($users as $data){
            $user_brands[] = $data->code;
        }

        foreach($user_brands as $allowed){
            if(in_array($allowed, $request_brands)){
                $brands = App\Brand::where('code', $allowed)->select('brand_id')->first();
                $result[] = $brands->brand_id;
            }
        }
        return $result;
    }
}


if(!function_exists('checkBrandCode')){
    function checkBrandCode($brand_id) {
        $brand_code_array = array();
        $codes = array();
        $encoded_codes = "";

        $brands = DB::table('user_brand_pivot')->where('user_id', Auth::user()->id)
        ->join('brands', 'brands.id', 'user_brand_pivot.brand_id')
        ->select('brands.brand_id')
        ->get();

        foreach($brands as $val){
            $brand_code_array[] = (array)$val;
        }

        foreach($brand_code_array as $data){
            $codes[] = $data['brand_id'];
        }

        if(in_array($brand_id, $codes)){
            return TRUE;
        }
    }
}

if(!function_exists('checkIfItemIsShipped')){
    function checkIfItemIsShipped($order_product_id){
        $status = true;

        $row = App\OrderItem::where('order_product_id', $order_product_id)->first();

        if($row->remarks == 'Shipped'){
            $status = false;
        }

        return $status;
    }
}

if (! function_exists('user_permission_check')) {
    function user_permission_check($permission){
        $permissions_array = array('booking','roles','users','api_services','api_service_users','templates','smtp_configuration', 'brands', 'shipment','set_in_process');
        if (Auth::user()) {
            $auth_check_permissions = App\Role::where('id', Auth::user()->role_id)
            ->select('roles.permissions')
            ->first();

            $replace_str = array('{"permissions":"[\"', '\"', '\"', ']"}');

            $auth_check_permissions_array = json_decode($auth_check_permissions, true);

            $explode_array = explode(',',$auth_check_permissions);

            $User_permissions = str_replace($replace_str, '', $explode_array);

            if(in_array($permission, $User_permissions)){
                return true;
            }
        }
    }
}


if (! function_exists('get_orders_statuses')) {
    function get_orders_statuses($order_number){
        $status = DB::table('orders')->where('order_number', $order_number)
        ->select('status')
        ->first();

        return $status->status;
    }
}

if (! function_exists('get_brand_name')) {
    function get_brand_name($id){
        $brand = DB::table('brands')->where('brand_id', $id)
        ->select('name')
        ->first();

        return $brand->name;
    }
}

if (! function_exists('get_cnnumber_item')) {
    function get_cnnumber_item($id){
        $cn = App\ShipmentItem::where('shipment_items.item_id', $id)
        ->join('shipments', 'shipments.id', 'shipment_items.shipment_id')
        ->select('shipments.cnnumber')
        ->first();

        return is_null($cn)? '' : $cn->cnnumber;
    }
}

if (! function_exists('get_user_modules')) {
    function get_user_modules($module){
        $role_info = App\Role::where('id', Auth::user()->role_id)->first();
        $permissions = json_decode($role_info->permissions);

        if(in_array($module, $permissions)){
            return true;
        }
    }
}

if (! function_exists('get_payment_method')) {
    function get_payment_method($order_number){
        $order = App\Order::where('order_number', $order_number)->first();

        return $order->order_number;
    }
}

if (! function_exists('get_return_upc')) {
    function get_return_upc($item_id){
        $order = App\OrderItem::where('item_id', $item_id)->first();

        return $order->upc;
    }
}

if (! function_exists('get_order_by_cn')) {
    function get_order_by_cn($cn) {
        $get_order_number = App\Shipment::where('cnnumber', $cn)
        ->first();

        return $get_order_number->order_number;
    }
}

if (! function_exists('validate_customer_phone')) {
    function validate_customer_phone($phone) {
        $check_phone = str_replace('+92','0',$phone);
        $numericValue = preg_replace("/[^0-9]/", '', $check_phone);

        $number = $numericValue;

        if(strlen($numericValue) > 11){
            $number = substr($numericValue, 0, 11);
        }

        if(strlen($numericValue) < 11){
            $missingLength = 11 - strlen($numericValue);

            $lastPart = null;

            for($i=0; $i<$missingLength; $i++){
                $lastPart .= '0';
            }

            $number = $number.$lastPart;
        }

        return $number;
    }
}

if (! function_exists('check_complaint_placed')) {
    function check_complaint_placed($complaint_id) {
        $check_id = DB::table('return_complaint_response')->where('return_complaint_id', $complaint_id)->first();
        if(is_null($check_id)){
            return false;
        }

        return $check_id->action;
    }
}

if (! function_exists('get_coupon')) {
    function get_coupon($complaint_id) {
        $coupon = DB::table('return_complaint_response')->where('return_complaint_id', $complaint_id)->first();

        return $coupon->coupon_code;
    }
}

if (! function_exists('update_order_queue')) {
    function update_order_queue($order) {
        $intransitMessage = 'Order set intransit via cp.makeupcityshop.com';

        try {
            $client2 = new \GuzzleHttp\Client();

            $response2 = $client2->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/returnOrderUpdate?order_id='.$order->order_number.'&comments='.$intransitMessage.'&status=intransit', []);

            $result2 = $response2->getBody()->getContents();

        }catch(\Exception $e) {
            $result2 = $e->getMessage();
        }

        sleep(1);

        $params = [
            'order_id' => $order->order_id,
            'comments' => $order->comments,
            'tracking_no' => json_decode($order->tracking_no, true),
            'carrier_code' => $order->carrier_code,
            'ship_title' => $order->carrier_code,
            'customer_email_Comments' => $order->comments,
            'status' => $order->status,
            'state' => $order->state
        ];

        $proceed = true;

        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('POST', 'https://cp.makeupcityshop.com/warehouseapirest/index/updateordertracking', [
                'form_params' => $params
            ]);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
            $proceed = false;
        }

        return $proceed;
    }
}






if (! function_exists('fetch_oos_order')) {
    function fetch_oos_order($orders) {
        $orderItems = array();
        $order = array();
        $apiId = NULL;
        $api = NULL;
        $emailAddress = NULL;

        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/dataRequest?order_id='.$orders->order_number, []);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }

        $decodedResult = json_decode($result, true);

        if(empty($decodedResult)){
            $noOrder = DB::table('out_of_stock')->where('order_number', $orders->order_number)->update(array(
                'isUpdated' => 3,
                'updated_at' => now()
            ));
            die;
        }

        $checkOrder = App\Order::where('order_id', $decodedResult['orderData']['entity_id'])->first();

        if(is_null($checkOrder)){
            $createOrder = App\Order::create([
                'order_id' => $decodedResult['orderData']['entity_id'], 'order_number' => $decodedResult['orderData']['increment_id'], 'status' => $decodedResult['orderData']['status'], 'shipping_courier' => $decodedResult['orderData']['shipping_description'], 'payment_method' => $decodedResult['paymentMethod'], 'subtotal' => $decodedResult['orderData']['base_subtotal'], 'shipping_amount' => $decodedResult['orderData']['base_shipping_amount'],  'tax_amount' => $decodedResult['orderData']['base_tax_amount'], 'discount_amount' => $decodedResult['orderData']['base_discount_amount']
            ]);

            $createCustomerDetails = App\OrderCustomerDetail::create([
                'parent_id' => $createOrder->id, 'name' => $decodedResult['shippingDetails']['firstname'].' '.$decodedResult['shippingDetails']['lastname'], 'email' => $decodedResult['billingDetails']['email'], 'phone' => $decodedResult['shippingDetails']['telephone'], 'address' => $decodedResult['shippingDetails']['street'], 'city' => $decodedResult['shippingDetails']['city']
            ]);

            foreach($decodedResult['itemData'] as $itemData){
                $orderedQty = $itemData['qty_ordered'];

                if($itemData['meter'] == '1'){
                    $orderedQty = $itemData['men_fabric'] == '1'? $itemData['qty_ordered']/$itemData['meter_value'] : 1;
                }

                $createItems = App\OrderItem::create([
                    'parent_id' => $createOrder->id, 'item_id' => $itemData['item_id'], 'sku' => $itemData['sku'], 'upc' => $itemData['upc'], 'brand_id' => 1, 'applied_rule_ids' => $itemData['applied_rule_ids'], 'weight' => $itemData['weight'], 'qty_ordered' => $orderedQty, 'base_price' => $itemData['base_price'], 'base_tax_amount' => $itemData['base_tax_amount'], 'base_discount_amount' => $itemData['base_discount_amount'], 'base_row_total' => $itemData['base_row_total'], 'remarks' => $itemData['Remarks'], 'qty_confirmed' => $itemData['item_confirmqty'], 'booking_timestamp' => $itemData['item_bookingtimestamp']
                ]);
            }

            $firstComment = 'Order dropped in custom panel at '.now().' <br>(Automated message from cp.makeupcityshop.com)';

            try {
                $client = new \GuzzleHttp\Client();

                $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/addordercomment?order_id='.$decodedResult['orderData']['entity_id'].'&comment='.$firstComment, []);

                $result = $response->getBody()->getContents();
            }catch(\Exception $e) {
                $result = $e->getMessage();
            }

            $createCommnets = App\OrderComment::create([
                'parent_id' => $createOrder->id, 'comment' => $firstComment, 'status' => $decodedResult['orderData']['status']
            ]);

            return $decodedResult;
        }
    }
}


if (! function_exists('update_order_oos_status')) {
    function update_order_oos_status($order) {
        $orders = App\Order::where('order_number', $order->order_number)->first();

        $order_customer_details = App\OrderCustomerDetail::where('parent_id', $orders->id)->first();

        $email = null;

        if(!is_null($order_customer_details)){
            $email = $order_customer_details->email;
        }

        $orderItems = App\OrderItem::where('parent_id', $orders->id)->get();
        $itemCount = $orderItems->count();

        $finalCount = [];
        $statusArray = ['Shipped', 'Out of Stock'];

        foreach($orderItems as $item){
            if(in_array($item->remarks, $statusArray)){
                $finalCount[] = $item->remarks;
            }
        }

        $getCount = $itemCount - sizeof($finalCount);

        $orderStatus = '';

        if($getCount == 0){
            if(!in_array('Shipped', $finalCount)){
                $orderStatus = 'canceled';
            } else {
                $orderStatus = 'codshipped';
            }
            $orderUpdate = App\Order::where('order_number', $order->order_number)->update(array(
                'status' => $orderStatus
            ));
        }

        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/addordercommentoos?order_id='.$orders->order_id.'&sku='.$order->sku.'&status='.$orderStatus.'&comment='.$order->sku.' has been marked out of stock by makeupcity custompanel out of stock screen', []);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }

        if(!is_null($email)){
            $details = array('sku' => $order->sku, 'order_number' => $order->order_number, 'consignee_name' => $order_customer_details->name);

            // Mail::to($email)->send(new Outofstock($details));
        }else{
            echo 'Email not send. Email cannot be fetched';
        }

        return true;
    }
}


if (! function_exists('sale_report_extension')) {
	function sale_report_extension() {
		$getLog = DB::table('user_log')
		->select('url')
		->orderBy('created_at', 'desc')
		->first();

		$decoded = json_decode($getLog->url);

		$filename = now()."_salereport.csv";

		$csvFile = [];

		$file = fopen("upload/".$filename,"w");

		$csvFile[] = ['Web Order #', 'MakeupCity Ref#', 'Customer Name', 'Concept', 'Group', 'UPC', 'SKU', 'SIZE', 'COLOR', 'ON SALE', 'SMF', 'Payment Type', 'Payment Type Code', 'Country', 'City', 'Product Name', 'QTY', 'Discount Percent', 'SMF Price', 'Converted SMF Price', 'Price', 'Converted Price', 'Sub - Total', 'Converted Sub - Total', 'Coupon Code', 'Discount', 'Converted Total', 'Total', 'Gift Option', 'Converted Gift Option Charges', 'Gift Option Charges', 'Free Shipping', 'Shipping Method', 'Shipping Charges', 'Converted Shipping Charges', 'Net Total', 'Converted Net Total', 'Order Date', 'Gender', 'Order Currency'];
		foreach($decoded as $key => $data) {
			$csvFile[] = [$data->increment_id, '', $data->fullname, $data->concept, $data->group, $data->upc, $data->sku, $data->size, $data->color, $data->on_sale, $data->smf, $data->payment_type_code, $data->payment_method, $data->country, $data->city, $data->product_name, $data->qty, $data->discount_percent, $data->smf_price, $data->smf_price, $data->price, $data->price, $data->sub_total, $data->sub_total, $data->coupon_code, $data->base_discount_amount, $data->total, $data->total, $data->gift_option, $data->gift_option_charges, $data->gift_option_charges, $data->free_shipping, $data->shipping_method, $data->shipping_charges, $data->shipping_charges, $data->net_total, $data->net_total, $data->created_at, $data->gender, $data->order_currency_code];
		}

		foreach ($csvFile as $line) {
			fputcsv($file, $line);
		}

		fclose($file);

		return $filename;

	}
}



//-----------------   ship item function -------------------------//


if (! function_exists('fetch_ship_item_order')) {
    function fetch_ship_item_order($orders) {
        $orderItems = array();
        $order = array();
        $apiId = NULL;
        $api = NULL;
        $emailAddress = NULL;

        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/dataRequest?order_id='.$orders->order_number, []);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }

        $decodedResult = json_decode($result, true);

        if(empty($decodedResult)){
            $noOrder = DB::table('out_of_stock')->where('order_number', $orders->order_number)->update(array(
                'isUpdated' => 3,
                'updated_at' => now()
            ));
            die;
        }

        $checkOrder = App\Order::where('order_id', $decodedResult['orderData']['entity_id'])->first();

        if(is_null($checkOrder)){
            $createOrder = App\Order::create([
                'order_id' => $decodedResult['orderData']['entity_id'], 'order_number' => $decodedResult['orderData']['increment_id'], 'status' => $decodedResult['orderData']['status'], 'shipping_courier' => $decodedResult['orderData']['shipping_description'], 'payment_method' => $decodedResult['paymentMethod'], 'subtotal' => $decodedResult['orderData']['base_subtotal'], 'shipping_amount' => $decodedResult['orderData']['base_shipping_amount'],  'tax_amount' => $decodedResult['orderData']['base_tax_amount'], 'discount_amount' => $decodedResult['orderData']['base_discount_amount']
            ]);

            $createCustomerDetails = App\OrderCustomerDetail::create([
                'parent_id' => $createOrder->id, 'name' => $decodedResult['shippingDetails']['firstname'].' '.$decodedResult['shippingDetails']['lastname'], 'email' => $decodedResult['billingDetails']['email'], 'phone' => $decodedResult['shippingDetails']['telephone'], 'address' => $decodedResult['shippingDetails']['street'], 'city' => $decodedResult['shippingDetails']['city']
            ]);

            foreach($decodedResult['itemData'] as $itemData){
                $orderedQty = $itemData['qty_ordered'];

                if($itemData['meter'] == '1'){
                    $orderedQty = $itemData['men_fabric'] == '1'? $itemData['qty_ordered']/$itemData['meter_value'] : 1;
                }

                $createItems = App\OrderItem::create([
                    'parent_id' => $createOrder->id, 'item_id' => $itemData['item_id'], 'sku' => $itemData['sku'], 'upc' => $itemData['upc'], 'brand_id' => 1, 'applied_rule_ids' => $itemData['applied_rule_ids'], 'weight' => $itemData['weight'], 'qty_ordered' => $orderedQty, 'base_price' => $itemData['base_price'], 'base_tax_amount' => $itemData['base_tax_amount'], 'base_discount_amount' => $itemData['base_discount_amount'], 'base_row_total' => $itemData['base_row_total'], 'remarks' => $itemData['Remarks'], 'qty_confirmed' => $itemData['item_confirmqty'], 'booking_timestamp' => $itemData['item_bookingtimestamp']
                ]);
            }

            $firstComment = 'Order dropped in custom panel via ship item tool at '.now().' <br>(Automated message from cp.makeupcity.com)';

            try {
                $client = new \GuzzleHttp\Client();

                $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/addordercomment?order_id='.$decodedResult['orderData']['entity_id'].'&comment='.$firstComment, []);

                $result = $response->getBody()->getContents();
            }catch(\Exception $e) {
                $result = $e->getMessage();
            }

            $createCommnets = App\OrderComment::create([
                'parent_id' => $createOrder->id, 'comment' => $firstComment, 'status' => $decodedResult['orderData']['status']
            ]);

            return $decodedResult;
        }
    }
}



if (! function_exists('update_order_item_status')) {
    function update_order_item_status($order) {
        $orders = App\Order::where('order_number', $order->order_number)->first();

        $orderItems = App\OrderItem::where('parent_id', $orders->id)->get();
        $itemCount = $orderItems->count();

        $finalCount = [];
        $statusArray = ['Shipped', 'Out of Stock'];

        foreach($orderItems as $item){
            if(in_array($item->remarks, $statusArray)){
                $finalCount[] = $item->remarks;
            }
        }

        $getCount = $itemCount - sizeof($finalCount);

        $orderStatus = '';
        $state = '';

        if($getCount == 1){
            $orderStatus = 'codshipped';
            $state = 'processing';
        }elseif($getCount > 1){
            $orderStatus = 'partiallyintransit';
            $state = 'processing';
        }else{
            $orderStatus = 'codshipped';
            $state = 'processing';
        }

        $update_order_status = App\Order::where('order_number', $order->order_number)->update(array(
            'status' => $orderStatus
        ));

        $messages[] = $order->sku.' has been updated with tracking #'.$order->tracking_number.' from cp.makeupcityshop custompanel';

         $params = [
            'order_id' => $orders->order_id,
            'comments' => implode('<br><br>', $messages),
            'tracking_no' => array($order->tracking_number),
            'carrier_code' => $order->title,
            'ship_title' => $order->title,
            'customer_email_Comments' => implode('<br><br>', $messages),
            'status' => $orderStatus,
            'state' => $state
        ];

        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('POST', 'https://cp.makeupcityshop.com/warehouseapirest/index/shipsheetitem', [
                'form_params' => $params
            ]);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }

        return true;
    }
}



if (! function_exists('updateIntlCurrentDetails')) {
    function updateIntlCurrentDetails($request) {
        $orderId = $request->id;

        $allItemsArray = [];

        $allItems = App\OrderItem::where('parent_id', $orderId)->select('item_id')->get();

        foreach($allItems as $_item){
            $allItemsArray[] = $_item->item_id;
        }

        $arrayDiff = array_diff($allItemsArray, $request->all()['item_id']);

        $messages = [];

        if(!empty($arrayDiff)){
            foreach($arrayDiff as $_diffItem){
                $extraItem = App\OrderItem::where('item_id', $_diffItem)->first();

                if($extraItem->remarks != 'Shipped'){

                    $currentRemarks = is_null($extraItem->remarks)? 'Pending' : $extraItem->remarks;

                    $messages[] = $extraItem->sku.' was not Shipped due to being '.$currentRemarks.' on '.date('Y-m-d H:i:s');

                    $params = array('order_number' => $request->order_number, 'item_id' => $extraItem->item_id, 'sku' => $extraItem->sku, 'remarks' => $currentRemarks, 'ordered_quantity' => $extraItem->qty_ordered, 'confirm_quantity' => $extraItem->qty_confirmed, 'user_id' => Auth::user()->id);

                    $update = App\BookingDetail::create($params);

                    $updateItemRow = App\OrderItem::where('item_id', $_diffItem)->update(array('remarks' => $currentRemarks));
                }
            }
        }

        $totalItemsOrderedQty = sizeof($allItems);

        $shipping_amount = $request->order_shipping_amount/$totalItemsOrderedQty;

        for($i=0; $i<sizeof($request->item_remarks); $i++){
            if($request->quantity_confirmed[$i] == 0){
                $messages[] = $request->sku[$i].' was not Shipped due to being '.$request->item_remarks[$i].' on '.date('Y-m-d H:i:s');

                $params = array('order_number' => $request->order_number, 'item_id' => $request->item_id[$i], 'sku' => $request->sku[$i], 'remarks' => $request->item_remarks[$i], 'ordered_quantity' => $request->quantity_ordered[$i], 'confirm_quantity' => $request->quantity_confirmed[$i], 'user_id' => Auth::user()->id);

                $itemsParams = array('remarks' => $request->item_remarks[$i], 'qty_confirmed' => $request->quantity_confirmed[$i]);

                if($request->item_remarks[$i] == 'Out of Stock'){
                    $details = array('sku' => $request->sku[$i], 'order_number' => $request->order_number, 'consignee_name' => $request->customer_name);
                }
            }else{
                $message = 'International order confirmed on cp.makeupcityshop';

                if(is_null($request->package[$i])){
                    $message = $request->sku[$i].' was not Shipped on due to being '.$request->item_remarks[$i].' on '.date('Y-m-d H:i:s');
                }

                if(!is_null($request->package[$i])){
                    $message = $request->sku[$i].' was '.$request->item_remarks[$i].' on '.date('Y-m-d H:i:s');
                }

                $messages[] = $message;

                $params = array('order_number' => $request->order_number, 'item_id' => $request->item_id[$i], 'sku' => $request->sku[$i], 'remarks' => $request->item_remarks[$i], 'ordered_quantity' => $request->quantity_ordered[$i], 'confirm_quantity' => $request->quantity_confirmed[$i], 'package' => $request->package[$i], 'cn_number' => 'N/A', 'user_id' => Auth::user()->id);

                $itemsParams = array('remarks' => $request->item_remarks[$i], 'qty_confirmed' => $request->quantity_confirmed[$i], 'booking_timestamp' => now());

                $oldConfirmedQty = App\OrderItem::where('item_id', $request->item_id[$i])->first();

                $oldQty = 0;

                if(!is_null($oldConfirmedQty)){
                    $oldQty = $oldConfirmedQty->qty_confirmed;
                }

                $shipment_id = null;

                $date = explode(' ', now())[0];

                $checkIfShipmentIsCreated = DB::table('intl_shipments')->where('order_number', $request->order_number)->whereBetween('created_at', [$date.' 00:00:00', $date.' 23:59:59'])->first();

                if(is_null($checkIfShipmentIsCreated)){
                    $shipmentParams = array('order_number' => $request->order_number, 'cnnumber' => rand(10000,10000000), 'courier' => 'DHL', 'shipment_booked_by' => Auth::user()->id, 'shipment_booked_datetime' => now(), 'shipment_status' => 'Shipped', 'created_at' => now(), 'updated_at' => now());

                    $shipment_id = DB::table('intl_shipments')->insert($shipmentParams);

                    $intl_ship_id = DB::table('intl_shipments')->where('order_number', $request->order_number)->first();
                }else{
                    $shipment_id = $checkIfShipmentIsCreated;
                }

                $finalShipping = ceil(($shipping_amount/$request->quantity_ordered[$i]) * ($request->quantity_confirmed[$i] - $oldQty));

                if(is_null($checkIfShipmentIsCreated)){
                    $intl_id = $intl_ship_id->id;
                } else {
                    $intl_id = $checkIfShipmentIsCreated->id;
                }

                $shipmentItemParams = array('intl_shipment_id' => $intl_id,
                 'item_id' => $request->item_id[$i],
                 'sku' => $request->sku[$i],
                 'unit_price' => ($request->item_row_total[$i]/$request->quantity_ordered[$i]),
                 'shipped_qty' => ($request->quantity_confirmed[$i] - $oldQty),
                 'discount' => $request->item_discount[$i],
                 'shipping_amount' => $finalShipping,
                 'sub_total' => ((($request->item_row_total[$i]/$request->quantity_ordered[$i]) * ($request->quantity_confirmed[$i] - $oldQty)) - (($request->item_discount[$i]/$request->quantity_ordered[$i]) * ($request->quantity_confirmed[$i] - $oldQty))),
                 'total_tax' => $request->item_tax[$i],
                 'weight' => $request->item_weight[$i],
                 'created_at' => now(),
                 'updated_at' => now()
                );

                $createShipmentItem = DB::table('intl_shipment_items')->insert($shipmentItemParams);
            }

            $update = App\BookingDetail::create($params);

            $updateItemRow = App\OrderItem::where('item_id', $request->item_id[$i])->update($itemsParams);
        }

        $shippedItems = App\OrderItem::where([['parent_id', $request->id], ['remarks', 'Shipped']])->count();

        $outOfStockItems = App\OrderItem::where([['parent_id', $request->id], ['remarks', 'Out of Stock']])->count();

        $totalShippedAndOOS = $shippedItems + $outOfStockItems;

        $orderItemsCount = count($allItems);

        if($orderItemsCount == $totalShippedAndOOS){
            if($request->order_payment_method == 'Cash On Delivery'){
                $new_status = 'codshipped';
                $new_state = 'processing';
            }else{
                $new_status = 'intransit';
                $new_state = 'processing';
            }
        }else{
            $new_status = 'partiallyintransit';
            $new_state = 'processing';
        }

        $updateOrder = App\Order::where('order_number', $request->order_number)->update(array('status' => $new_status));

        $addOrderComment = App\OrderComment::create([
            'parent_id' => $request->id,
            'comment' => implode('<br><br>', $messages),
            'status' => $new_status
        ]);

        $comment_message = implode('<br><br>', $messages);

        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/addordercommentintl?order_id='.$request->order_id.'&status='.$new_status.'&comment='.$comment_message, []);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }

        // API CALL TO UPDATE MAGENTO
        // Call moved to function update_order_queue for speed issues

        // $updateQueue = DB::table('order_update_queue')->insert([
        //     'order_id' => $request->order_id,
        //     'order_number' => $request->order_number,
        //     'comments' => implode('<br><br>', $messages),
        //     'tracking_no' => json_encode($cn_array),
        //     'carrier_code' => $api_name,
        //     'status' => $new_status,
        //     'state' => $new_state,
        //     'is_updated' => 0,
        //     'created_at' => now(),
        //     'updated_at' => now()
        // ]);
    }
}


if (! function_exists('checkIfItemInventory')) {
    function checkIfItemInventory($upc) {
        $check_inventory = DB::table('inventory_stock')->where('item_number', $upc)->first();

        if(!is_null($check_inventory)){
            return true;
        }
    }
}


if (! function_exists('sale_report_status_active')) {
    function sale_report_status_active() {
        try {

            $active = DB::table('sale_report_cron_active')->where('id', 1)->update([
                'is_active' => 1,
                'date_time' => now()
            ]);

            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/salereportactive', []);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }
    }
}


if (! function_exists('sale_report_status_active_rwp')) {
    function sale_report_status_active_rwp() {
        try {

            $active = DB::table('sale_report_cron_active')->where('id', 1)->update([
                'is_active' => 2,
                'date_time' => now()
            ]);

            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/salereportactiverwp', []);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }
    }
}


if (! function_exists('sale_report_status_active_fsd')) {
    function sale_report_status_active_fsd() {
        try {

            $active = DB::table('sale_report_cron_active')->where('id', 1)->update([
                'is_active' => 3,
                'date_time' => now()
            ]);

            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', 'https://cp.makeupcityshop.com/warehouseapirest/index/salereportactivefsd', []);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }
    }
}

if (! function_exists('is_running_sale_report')) {
    function is_running_sale_report() {
        $check_is_running = DB::table('sale_report_cron_active')->where('id', 1)->first();

        return $check_is_running->is_active;
    }
}

// Product
if (! function_exists('shopify_get_product')) {
    function shopify_get_product($product_id) {
        $endpoint = str_replace('{product_id}', $product_id, '/admin/api/2021-01/products/{product_id}.json');
        $url = 'https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com'.$endpoint;

        return shopify_get_request($url);
    }
}

// Product Variant
if (! function_exists('shopify_get_variant')) {
    function shopify_get_variant($variant_id) {
        $endpoint = str_replace('{variant_id}', $variant_id, '/admin/api/2021-01/variants/{variant_id}.json');
        $url = 'https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com'.$endpoint;

        return shopify_get_request($url);
    }
}

// Product Images
if (! function_exists('shopify_get_product_images')) {
    function shopify_get_product_images($product_id) {
        $endpoint = str_replace('{product_id}', $product_id, '/admin/api/2021-01/products/{product_id}/images.json');
        $url = 'https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com'.$endpoint;

        return shopify_get_request($url);
    }
}

if (! function_exists('shopify_get_request')) {
    function shopify_get_request($url) {
        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', $url);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }

        return $result;
    }
}

//shopify update order apis

if (! function_exists('shopify_update_order')) {
    function shopify_update_order($api_target, $order_id, $body) {
        $endpoint = str_replace('{order_id}', $order_id, '/admin/api/2021-01/orders/{order_id}.json');
        $url = 'https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com'.$endpoint;

        return shopify_put_request($url, $body);
    }
}

if (! function_exists('shopify_put_request')) {
    function shopify_put_request($url, $body) {
        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('PUT', $url, [
                'json' => json_decode($body)
            ]);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }

        return $result;
    }
}

if (! function_exists('shopify_create_fulfillment')) {
    function shopify_create_fulfillment($api_target, $order_id, $body) {
        $endpoint = str_replace('{order_id}', $order_id, '/admin/api/2020-10/orders/{order_id}/fulfillments.json');
        $url = 'https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com'.$endpoint;

        return shopify_post_request($url, $body);
    }
}

if (! function_exists('shopify_post_request')) {
    function shopify_post_request($url, $body) {
        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('POST', $url, [
                'json' => json_decode($body)
            ]);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }

        return $result;
    }
}

if (! function_exists('shopify_update_order_partial')) {
    function shopify_update_order_partial($api_target, $order_id, $body) {
        $endpoint = str_replace('{order_id}', $order_id, '/admin/api/2021-01/orders/{order_id}.json');
        $url = 'https://e8d04e9e2e4106aee3851d6512221148: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@make-up-city-pakistan.myshopify.com'.$endpoint;

        return shopify_put_request($url, $body);
    }
}

if (! function_exists('connector_update_order')) {
    function connector_update_order($order_id, $tags) {
        $url = 'https://connector.ecompk.com/connector_update_order?order_id='.$order_id.'&tags='.$tags;

        try {
            $client = new \GuzzleHttp\Client();

            $response = $client->request('GET', 'https://connector.ecompk.com/api/connector_update_order?order_id='.$order_id.'&tags='.$tags, []);

            $result = $response->getBody()->getContents();
        }catch(\Exception $e) {
            $result = $e->getMessage();
        }
    }
}


?>
