<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use App\Models\FoodicsMapping;
use App\Models\MiddlewareContent;
// use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Psr7\Request;
use App\Mail\DemoEmail;
use Illuminate\Support\Facades\Mail;

class IntegrationAPIController extends Controller
{
    public function index($runningId)
    {
        $controller = new HomeAPIController();
        // get requests
        // $runningId = 897;
        $debug = 0;
        $get_request = MiddlewareContent::where('id', $runningId)->latest()->first();

        $firstData = json_decode($get_request);
        // print_r(json_decode($get_request->body));
        // exit;
        // // get request body from DB
        $body = json_decode($get_request->body, true);
        if (!MiddlewareContent::isRealTimeBatch($get_request->batch)) {
            if (isset($body['check_param'])) {
                $record = FoodicsMapping::where([
                    'chefadmin_id' => $body['check_param'],
                    'status' => 1,
                ])->first();
                // record already exists we will update not create
                if (!empty($record)) {
                    $updateRecord = 1;
                    (explode('_', $get_request->type)[0] == 'create') ? $get_request->type = str_replace("create", "update", $get_request->type) : $updateRecord = 0;
                    if ($updateRecord) {
                        MiddlewareContent::where('id', $get_request->id)->update(['type' => $get_request->type]);
                    }
                }
            }
        }

        // print_r($body);
        $mappingTypeChefadmin = $firstData->type;
        $result = $controller->handlePayload($body, $mappingTypeChefadmin);

        $resultJson = json_decode($result, true);
        // print_r($resultJson);
        // exit;
        $mainMethod = $resultJson[0]['method'];

        if ($mainMethod == "POST") {
            $this->postInventory($firstData, $resultJson, $runningId, $debug);
        } elseif ($mainMethod == "PUT") {
            $this->postInventory($firstData, $resultJson, $runningId, $debug);
        }
        if ($mainMethod == "DELETE") {
            // $this->delInventory($firstData, $resultJson);
            $this->postInventory($firstData, $resultJson, $runningId, $debug);
        }
    }

    public function postInventory($firstData, $resultJson, $runningId, $debug)
    {

        $mappingTypeChefadmin = $firstData->type;
        $mappingId = $firstData->id;
        $mappingbrandId = $firstData->brand_id;
        $batch = $firstData->batch;
        $Response = "Success";
        // print("TAHAA");
        // print(count($resultJson));
        // exit;
        for ($i = 0; $i < count($resultJson); $i++) {
            // print("TAHAA");
            // exit;
            if ($debug == 1) {
                echo "<br /><br />----------------";
            }
            if ($debug == 1) {
                echo "STEP#" . $i;
            }
            if ($debug == 1) {
                echo "<br /><br />----------------";
            }

            $accessToken = 'Bearer ' . $resultJson[$i]['access_token'];
            $url = $resultJson[$i]['url'];
            $orgUrl = $resultJson[$i]['url'];
            $method = $resultJson[$i]['method'];

            if (!str_contains($url, 'https://')) {
                if ($debug == 1) {
                    echo "URL Incorrect " . $url;
                }
                $Response = "Failure";
                continue;
            }
            // if($method == "DELETE"){
            //     continue;
            // }

            $repetitive = $resultJson[$i]['repetitive'];

            if ($repetitive == 1) {
                $bodyCount = count($resultJson[$i]['body']);
            } else {
                $bodyCount = 1;
            }
            if ($debug == 1) {
                echo "Total bodyCount is " . $bodyCount;
            }
            // exit;
            for ($k = 0; $k < $bodyCount; $k++) {
                $extraDelete = 0;
                if ($debug == 1) {
                    echo "<br /><br />----------------STEP# Body " . $k . "<br /><br />----------------";
                }
                $dependent_params = trim($resultJson[$i]['dependent_params']);
                if ($debug == 1) {
                    echo "dependent_params: " . $dependent_params . "<br /><br />----------------";
                }
                $foodics_swap_params = trim($resultJson[$i]['foodics_swap_params']);
                if ($debug == 1) {
                    echo "foodics_swap_params: " . $foodics_swap_params . "<br /><br />----------------";
                }
                $foodics_mapping_param = trim($resultJson[$i]['foodics_mapping_param']);
                if ($debug == 1) {
                    echo "foodics_mapping_param: " . $foodics_mapping_param . "<br /><br />----------------";
                }
                if ($dependent_params != "" || $dependent_params != null) {
                    $dependent_params_array = explode(",", $dependent_params);
                    echo "dependent_params_array----------------------";
                    print_r($dependent_params_array);
                }
                // exit;
                if ($foodics_swap_params != "" || $foodics_swap_params != null) {
                    $foodics_swap_params_array = explode(",", $foodics_swap_params);
                }
                // print_r($foodics_swap_params_array);
                if ($repetitive == 1) {
                    if (isset($resultJson[$i]['body'][$k]['ingredient_id'])) {
                        $ingredient_id_value = trim($resultJson[$i]['body'][$k]['ingredient_id']);
                    }
                    if ($foodics_swap_params != "" || $foodics_swap_params != null) {
                        if (count($foodics_swap_params_array) > 1) {
                            // $foodics_swap_params_value1 = trim($resultJson[$i]['body'][$k][$foodics_swap_params_value[0]]);
                            // $foodics_swap_params_value2 = trim($resultJson[$i]['body'][$k][$foodics_swap_params_value[1]]);
                        } else {
                            $foodics_swap_params_value1 = trim($resultJson[$i]['body'][$k][$foodics_swap_params]);
                        }
                    }
                    if ($foodics_mapping_param != "" || $foodics_mapping_param != null) {
                        if (isset($resultJson[$i]['body'][$k][$foodics_mapping_param])) {
                            $foodics_mapping_param_value = trim($resultJson[$i]['body'][$k][$foodics_mapping_param]);
                            $foodics_mapping_param_value_default = trim($resultJson[$i]['body'][$k][$foodics_mapping_param]);
                        } else {
                            $foodics_mapping_param_value_default = "";
                        }
                    }
                    $submission_payload_value = $resultJson[$i]['body'][$k];
                } else {
                    if (isset($resultJson[$i]['body'][$k]['ingredient_id'])) {
                        $ingredient_id_value = trim($resultJson[$i]['body']['ingredient_id']);
                    }
                    if ($foodics_swap_params != "" || $foodics_swap_params != null) {
                        if (count($foodics_swap_params_array) > 1) {
                            // $foodics_swap_params_value1 = trim($resultJson[$i]['body'][$foodics_swap_params_value[0]]);
                            // $foodics_swap_params_value2 = trim($resultJson[$i]['body'][$foodics_swap_params_value[1]]);
                        } else {
                            $foodics_swap_params_value1 = trim($resultJson[$i]['body'][$foodics_swap_params]);
                        }
                    }
                    if ($foodics_mapping_param != "" || $foodics_mapping_param != null) {
                        if (isset($resultJson[$i]['body'][$foodics_mapping_param])) {
                            $foodics_mapping_param_value = trim($resultJson[$i]['body'][$foodics_mapping_param]);
                            $foodics_mapping_param_value_default = trim($resultJson[$i]['body'][$foodics_mapping_param]);
                        } else {
                            $foodics_mapping_param_value_default = "";
                        }
                    }
                    $submission_payload_value = $resultJson[$i]['body'];
                    
                }

                if (isset($dependent_params_array)) {
                    $url = $orgUrl;
                    $str = explode('/', $url);
                    $final = [];
                    foreach ($str as $words) {
                        (!empty(explode(':', $words))) ? (isset(explode(':', $words)[1])) ? $final[] = explode(':', $words)[1] : false : false;
                    }
                    for ($d = 0; $d < count($final) - 1; $d++) {
                        if ($repetitive == 1) {
                            $dependent_params_value = trim($resultJson[$i]['body'][$k][$dependent_params_array[$d]]);
                        } else {
                            $dependent_params_value = trim($resultJson[$i]['body'][$dependent_params_array[$d]]);
                        }
                        // if($debug == 1){ echo "<br /><br />----------inventoryItemId------";}
                        if ($debug == 1) {
                            echo $dependent_params_array[$d];
                        }
                        // if($debug == 1){ echo "<br /><br />----------------";}
                        // if($debug == 1){ echo $dependent_params_value;
                        // STarting with 9649961-f9e0-4e77-bdde-40ebe9182b5 LIKE', "%{$search}%")
                        $search = "9";
                        if ($debug == 1) {
                            echo "<br /><br />----------------select('*')->where('chefadmin_id', '=', " . $dependent_params_value . ")->where('foodics_id', 'LIKE', \"{$search}%\")->get()";
                        }
                        if ($dependent_params_value != "" || $dependent_params_value != null) {
                            $foodics_Itemid_get = FoodicsMapping::select('*')->where('chefadmin_id', '=', $dependent_params_value)->where('foodics_id', 'LIKE', "{$search}%")->get();
                            // print_r($foodics_Itemid_get);
                            if (isset($foodics_Itemid_get[0]->foodics_id)) {
                                $url = str_replace(':' . $final[$d + 1], $foodics_Itemid_get[0]->foodics_id, $url);
                                if ($debug == 1) {
                                    echo "<br />" . $final[$d + 1] . " is replace by " . $foodics_Itemid_get[0]->foodics_id . "-<br />";
                                }
                                if ($debug == 1) {
                                    echo "Modified URL " . $url . "-<br />";
                                }
                                $last_foodics_Itemid_get = $foodics_Itemid_get[0]->foodics_id;
                                // if type = 27 or Update Combo then I need to fetch in step 3 and 5 ignore the 
                            } else {
                                if ($debug == 1) {
                                    echo "<br /><br />No :foodics_id_get2 in db <br />-<br />";
                                }
                                if ($method == "DELETE") {
                                    $extraDelete = 1;
                                }
                            }
                        } else {
                            if ($method == "DELETE") {
                                $extraDelete = 1;
                                if ($debug == 1) {
                                    echo '<br /><br /><span style="color:#FF0000;text-align:center;">Dependent Param ' . $dependent_params_value . ' did not found in mapping table </span>';
                                }
                            }
                            // for delete loop
                        }
                        if ($extraDelete == 1) {
                            $search = "9";
                            if(isset($resultJson[$i]['body'][$dependent_params_array[0]])){
                                $dependent_params_value = trim($resultJson[$i]['body'][$dependent_params_array[0]]);
                                $foodics_Itemid_get_delete = FoodicsMapping::select('*')->where('foodics_id', '=', $last_foodics_Itemid_get)->where('type_foodics', 'LIKE', "{$search}%")->get();
                            }
                            // print_r($foodics_Itemid_get_delete[0]->type_foodics);
                            // print_r($foodics_Itemid_get_delete[1]->type_foodics);
                            // exit;
                        }
                    }
                }

                if (isset($foodics_swap_params_array)) {

                    if (count($foodics_swap_params_array) > 1) {
                        for ($f = 0; $f < count($foodics_swap_params_array); $f++) {
                            if ($repetitive == 1) {
                                $foodics_swap_params_value1 = trim($resultJson[$i]['body'][$k][$foodics_swap_params_array[$f]]);
                            } else {
                                $foodics_swap_params_value1 = trim($resultJson[$i]['body'][$foodics_swap_params_array[$f]]);
                            }
                            $search = "9";
                            if ($debug == 1) {
                                echo "<br />After 1st Step More Than One Params ----------------" . $foodics_swap_params_array[$f] . " ------ " . $foodics_swap_params_value1;
                            }
                            if ($debug == 1) {
                                echo "<br />select('*')->where('chefadmin_id', '=', " . $foodics_swap_params_value1 . ")->where('foodics_id', 'LIKE', '{$search}%')->get()";
                            }

                            $foodics_id_get2 = FoodicsMapping::select('*')->where('chefadmin_id', '=', $foodics_swap_params_value1)->where('foodics_id', 'LIKE', "{$search}%")->get();
                            if (isset($foodics_id_get2[0]->foodics_id)) {
                                if ($debug == 1) {
                                    echo "<br /><br />Yes :foodics_id_get2 in db <br /><br />" . $foodics_id_get2[0]->foodics_id . "-<br />";
                                }
                                if ($repetitive == 1) {
                                    $submission_payload_value[$foodics_swap_params_array[$f]] = $foodics_id_get2[0]->foodics_id;
                                } else {
                                    $submission_payload_value[$foodics_swap_params_array[$f]] = $foodics_id_get2[0]->foodics_id;
                                }
                            } else {
                                if ($debug == 1) {
                                    echo "<br /><br />No :foodics_id_get2 in db <br />-<br />";
                                }
                            }
                        }
                    } else {
                        $search = "9";
                        if ($debug == 1) {
                            echo "<br />After 1st Step Only One Param ----------------" . $foodics_swap_params . " ------ " . $foodics_swap_params_value1;
                        }
                        if ($debug == 1) {
                            echo "<br />select('*')->where('chefadmin_id', '=', " . $foodics_swap_params_value1 . ")->where('foodics_id', 'LIKE', '{$search}%')->get()";
                        }

                        $foodics_id_get2 = FoodicsMapping::select('*')->where('chefadmin_id', '=', $foodics_swap_params_value1)->where('foodics_id', 'LIKE', "{$search}%")->get();
                        // print_r($foodics_id_get2[0]->foodics_id);
                        if (isset($foodics_id_get2[0]->foodics_id)) {
                            if ($debug == 1) {
                                echo "<br /><br />Yes :foodics_id_get2 in db <br /><br />" . $foodics_id_get2[0]->foodics_id;
                            }
                            if ($repetitive == 1) {
                                $submission_payload_value[$foodics_swap_params] = $foodics_id_get2[0]->foodics_id;
                            } else {
                                $submission_payload_value[$foodics_swap_params] = $foodics_id_get2[0]->foodics_id;
                            }
                        } else {
                            if ($debug == 1) {
                                echo "<br /><br />No :foodics_id_get2 in db <br />-<br />";
                            }
                        }
                    }
                }

                if (isset($foodics_mapping_param)) {

                    if ($debug == 1) {
                        echo "foodics_mapping_param name ----------------------<br />-<br />";
                    }
                    if ($debug == 1) {
                        echo $foodics_mapping_param;
                    }
                    if ($debug == 1) {
                        echo "<br /><br />foodics_mapping_param value ----------------------<br />-<br />";
                    }
                    if (isset($resultJson[$i]['body'][$foodics_mapping_param])) {
                        $chefadmin_id = $foodics_mapping_param_value;
                    } else {
                        $chefadmin_id = $foodics_mapping_param_value_default;
                    }
                    if ($debug == 1) {
                        echo $chefadmin_id;
                    }
                }
                // exit;
                // Repetitive Body

                $submission_payload = $submission_payload_value;

                if ($debug == 1) {
                    echo '<br /><br /><span style="color:#008000;text-align:center;">submission_payload starts ----------------------</span>';
                }
                if ($debug == 1) {
                    echo '<br /><br /><span style="color:#4CBB17;text-align:center;"><b>' . json_encode($submission_payload) . '</b></span>';
                }
                if ($debug == 1) {
                    echo '<br /><br /><span style="color:#008000;text-align:center;">submission_payload url ----------------------</span>';
                }
                if ($debug == 1) {
                    echo '<br /><br /><span style="color:#4CBB17;text-align:center;">' . $url . '</span>';
                }
                if ($debug == 1) {
                    echo '<br /><br /><span style="color:#008000;text-align:center;">submission_payload method ----------------------</span>';
                }
                if ($debug == 1) {
                    echo '<br /><br /><span style="color:#4CBB17;text-align:center;">' . $method . '</span>';
                }
                if ($debug == 1) {
                    echo '<br /><br /><span style="color:#008000;text-align:center;">submission_payload ends ----------------------</span>';
                }

                echo '<br /><br /> mappingTypeChefadmin '.$mappingTypeChefadmin;
                // exit;
                if ($method == "DELETE") {
                    if($mappingTypeChefadmin == "update_combo"){
                        // echo "TAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
                        // echo '<br /><br />update_combo<br /><br />';
                        // SELECT * FROM `foodics_mappings` WHERE chefadmin_id LIKE 'combo-137%' AND type_foodics = 'options'
                        $chefadmin_id = $resultJson[$i]['body'][$k]['comboId'];
                        echo "<br />select('*')->where('chefadmin_id', 'LIKE', '{$chefadmin_id}%')->where('type_foodics', '=', 'options')->where('process_id', '!=', '$mappingId')->get()";
                        $foodics_Itemid_get_delete = FoodicsMapping::select('*')->where('chefadmin_id', 'LIKE', "{$chefadmin_id}%")->where('type_foodics', '=', 'options')->where('process_id', '!=', "$mappingId")->get();
                        // print_r($foodics_Itemid_get_delete[0]->type_foodics);
                        // print_r($foodics_Itemid_get_delete[1]->type_foodics);
                        // echo "TAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
                        $extraDelete = 1;
                    }else if($mappingTypeChefadmin == "active_menu_item" || $mappingTypeChefadmin == "update_sub_recipe"){
                        // echo "TAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
                        // exit;
                        // echo "active_menu_item";
                        // echo '<br /><br />active_menu_item<br /><br />';
                        if(isset($resultJson[$i]['body'][$k]['sku'])){
                            // print "ISSET";
                            $chefadmin_id = $resultJson[$i]['body'][$k]['sku'];
                        }else{
                            // print "NOT SET";
                            $chefadmin_id = $resultJson[$i]['body']['sku'];
                        }
                        $foundPost = false;  // Flag to indicate whether we've found a POST record
                        $lastProcessId = $mappingId;  // Start with the current process_id
                        $allFoundRecords = collect();  // Store all found records
                        $targetProcessId = null;  // The process_id we're looking for

                        // Start a loop to fetch records with decreasing process_id
                        // Fetch records with the given conditions
                        $records = FoodicsMapping::select('*')
                        ->where('chefadmin_id', 'LIKE', "{$chefadmin_id}%")  // Match chefadmin_id
                        ->where('type_chefadmin', '=', $mappingTypeChefadmin)    // Match type_chefadmin
                        ->where('process_id', '<', $lastProcessId)            // Process_id must be smaller than the last process_id
                        ->where('process_id', '!=', $mappingId)               // Exclude the current process_id
                        ->whereNotIn('type_foodics', ['products'])            // Exclude records where type_foodics is 'products'
                        ->where('submission_method', '=', 'POST')             // Only consider POST submission_method
                        ->orderByDesc('process_id')                           // Order by process_id descending (most recent first)
                        ->get();
                        // exit;
                        // If records are found, process them
                        // If records are found, process them
                        if ($records->isNotEmpty()) {
                            foreach ($records as $record) {
                                // print $targetProcessId;
                                if ($record->submission_method === 'POST') {
                                    // print "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT";
                                    // print_r($record->process_id);
                                    // Once a POST submission is found, set the flag and stop the search
                                    if ($targetProcessId === null) {
                                        // If we haven't set the targetProcessId yet, set it to the current process_id
                                        $targetProcessId = $record->process_id;
                                    }

                                    // If the current record belongs to the found process_id (targetProcessId), add it
                                    if ($record->process_id == $targetProcessId) {
                                        $allFoundRecords->push($record);  // Add the record to the collection
                                    }

                                    if($record->process_id != $targetProcessId){
                                        $foundPost = true;
                                        break;  // Exit the loop as we've found the first POST record
                                    }
                                }
                            }
                        } else {
                            // If no records are found, exit the loop
                            $foundPost = true;
                        }
                        if ($debug == 1) {
                            print_r(count($allFoundRecords));
                        }
                        $foodics_Itemid_get_delete = $allFoundRecords;
                        // print_r($foodics_Itemid_get_delete[0]->type_foodics);
                        $extraDelete = 1;
                        // exit;
                    }
                }
                
                // exit;
                // If extraDelete = 1
                if ($extraDelete == 1) {
                    
                    $extraDelete = 0;
                    if (isset($foodics_Itemid_get_delete)) {
                        echo "TAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA IFF0FFFFF";
                        echo count($foodics_Itemid_get_delete);
                        for ($d = 0; $d < count($foodics_Itemid_get_delete); $d++) {
                            print_r($foodics_Itemid_get_delete[$d]->type_foodics);
                            echo "TAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA FORRRRRRRRRRRRR";
                            echo $url = str_replace(':itemId', $foodics_Itemid_get_delete[$d]->type_foodics, $url);
                            echo '<br /><br />';
                            $response_payload = $this->requestSubmit($accessToken, $method, $url, $submission_payload);
                            if ($debug == 1) {
                                echo "<br /><br />response_payload starts ----------------------<br />-<br />";
                            }
                            if ($debug == 1) {
                                echo '<br /><br /><span style="color:#FF0000;text-align:center;">response_payload starts ----------------------</span>';
                            }
                            if ($debug == 1) {
                                echo '<br /><br /><span style="color:#FF0000;text-align:center;"><b>' . json_encode($response_payload) . '</b></span>';
                            }
                            if ($debug == 1) {
                                echo '<br /><br /><span style="color:#FF0000;text-align:center;">response_payload ends ----------------------</span>';
                            }
                            $foodics_id = "Deleted";
                            $mapping_status = 0;
                            $foodics_status = 1;
                            $Response = "Success";

                            $mappingTypefoodics = substr($url, strrpos($url, '/') + 1);
                            $submission_url = $url;
                            $submission_method = $method;

                            $foodics_mapping['brand_id'] = $mappingbrandId;
                            $foodics_mapping['process_id'] = $mappingId;
                            $foodics_mapping['chefadmin_id'] = $chefadmin_id;
                            $foodics_mapping['foodics_id'] = $foodics_id;
                            $foodics_mapping['type_foodics'] = $mappingTypefoodics;
                            $foodics_mapping['type_chefadmin'] = $mappingTypeChefadmin;
                            $foodics_mapping['submission_url'] = $submission_url;
                            $foodics_mapping['submission_method'] = $submission_method;
                            $foodics_mapping['submission_payload'] = json_encode($submission_payload);
                            $foodics_mapping['response_payload'] = json_encode($response_payload);
                            $foodics_mapping['status'] = $foodics_status;
                            $foodics_mapping['batch'] = $batch;
                            if ($debug == 1) {
                                echo "<br /><br />FoodicsMapping Insertion<br />-<br />";
                            }
                            // if($debug == 1){ echo '<br /><br /><span style="color:#FF0000;text-align:center;"><b>'.print_r($foodics_mapping).'</b></span>';}

                            // exit;
                            $dbInsert = FoodicsMapping::create($foodics_mapping);
                            if ($debug == 1) {
                                echo $dbInsert . "<br />-<br />";
                            }

                            if ($debug == 1) {
                                echo "Status Update in Middleware Content<br />-<br />";
                            }
                            $mapping = MiddlewareContent::where('id', $runningId)->update(array("status" => $mapping_status));
                            if ($debug == 1) {
                                echo '<span style="color:#FF0000;text-align:center;"><b>' . $mapping . '</b></span>';
                            }
                        }
                    }
                    // exit;
                } else {
                    $response_payload = $this->requestSubmit($accessToken, $method, $url, $submission_payload);
                    if ($debug == 1) {
                        echo "<br /><br />response_payload starts ----------------------<br />-<br />";
                    }
                    if ($debug == 1) {
                        echo '<br /><br /><span style="color:#FF0000;text-align:center;">response_payload starts ----------------------</span>';
                    }
                    if ($debug == 1) {
                        echo '<br /><br /><span style="color:#FF0000;text-align:center;"><b>' . json_encode($response_payload) . '</b></span>';
                    }
                    if ($debug == 1) {
                        echo '<br /><br /><span style="color:#FF0000;text-align:center;">response_payload ends ----------------------</span>';
                    }
                    // exit;
                    // $response_payload->message = "Internal Server Error";
                    if (isset($response_payload->data)) {
                        $foodics_id = $response_payload->data->id;
                        $mapping_status = 0;
                        $foodics_status = 1;
                        $Response = "Success";
                    } else {
                        // if($method == "DELETE" && $response_payload == null){
                        //     $foodics_id = "Deleted";
                        //     $mapping_status = 0;
                        //     $foodics_status = 1;
                        // }else{
                        //     $foodics_id = "invalid data";
                        //     $mapping_status = 2;
                        //     $foodics_status = 2;
                        // }
                        if (isset($response_payload->message)) {
                            if ($response_payload->message == "Internal Server Error") {
                                if ($debug == 1) {
                                    echo "<br /><br />Internal Server Error";
                                }
                                if ($debug == 1) {
                                    echo "<br /><br />Retrying...";
                                }
                                $response_payload = $this->requestSubmit($accessToken, $method, $url, $submission_payload);
                                if ($debug == 1) {
                                    echo "<br /><br />response_payload starts ----------------------<br />-<br />";
                                }
                                if ($debug == 1) {
                                    echo '<br /><br /><span style="color:#FF0000;text-align:center;">response_payload starts ----------------------</span>';
                                }
                                if ($debug == 1) {
                                    echo '<br /><br /><span style="color:#FF0000;text-align:center;"><b>' . json_encode($response_payload) . '</b></span>';
                                }
                                if ($debug == 1) {
                                    echo '<br /><br /><span style="color:#FF0000;text-align:center;">response_payload ends ----------------------</span>';
                                }
                                if (isset($response_payload->data)) {
                                    $foodics_id = $response_payload->data->id;
                                    $mapping_status = 0;
                                    $foodics_status = 1;
                                    $Response = "Success";
                                } else {
                                    if (isset($response_payload->message)) {
                                        $foodics_id = $response_payload->message;
                                    } else {
                                        $foodics_id = $response_payload;
                                    }
                                    $mapping_status = 2;
                                    $foodics_status = 2;
                                    $Response = "Failure";
                                }
                            }
                            elseif ($response_payload->message == "Too Many Attempts.") {
                                $mapping_status = 1;
                                $foodics_status = 2;
                                $Response = "Failure";
                            }
                            else {
                                // $foodics_id = $response_payload->message;
                                // $mapping_status = 2;
                                // $foodics_status = 2;
                                // $Response = "Failure";
                            }
                            if ($method == "DELETE" && ($response_payload == null || $response_payload->message = "The requested entity was not found.")) {
                                $foodics_id = "Deleted";
                                $mapping_status = 0;
                                $foodics_status = 1;
                                $Response = "Success";
                            } else {
                                if (isset($response_payload->data->id)) {
                                    $foodics_id = $response_payload->data->id;
                                } elseif ($response_payload->message) {
                                    $foodics_id = $response_payload->message;
                                }
                                $mapping_status = 2;
                                $foodics_status = 2;
                                $Response = "Success";
                            }
                            // exit;
                        } else {
                            if ($response_payload == "" || $response_payload == null) {
                                $foodics_id = "Deleted";
                                $mapping_status = 1;
                                $foodics_status = 1;
                                $Response = "Success";
                            } else {
                                $foodics_id = $response_payload->message;
                                $mapping_status = 2;
                                $foodics_status = 2;
                                $Response = "Success";
                            }
                        }
                    }
                    // if($debug == 1){ echo $foodics_id;
                    // exit;
                    $mappingTypefoodics = substr($url, strrpos($url, '/') + 1);
                    $submission_url = $url;
                    $submission_method = $method;

                    $foodics_mapping['brand_id'] = $mappingbrandId;
                    $foodics_mapping['process_id'] = $mappingId;
                    $foodics_mapping['chefadmin_id'] = $chefadmin_id;
                    $foodics_mapping['foodics_id'] = $foodics_id;
                    $foodics_mapping['type_foodics'] = $mappingTypefoodics;
                    $foodics_mapping['type_chefadmin'] = $mappingTypeChefadmin;
                    $foodics_mapping['submission_url'] = $submission_url;
                    $foodics_mapping['submission_method'] = $submission_method;
                    $foodics_mapping['submission_payload'] = json_encode($submission_payload);
                    $foodics_mapping['response_payload'] = json_encode($response_payload);
                    $foodics_mapping['status'] = $foodics_status;
                    $foodics_mapping['batch'] = $batch;
                    if ($debug == 1) {
                        echo "<br /><br />FoodicsMapping Insertion<br />-<br />";
                    }
                    // if($debug == 1){ echo '<br /><br /><span style="color:#FF0000;text-align:center;"><b>'.print_r($foodics_mapping).'</b></span>';}

                    // exit;
                    $dbInsert = FoodicsMapping::create($foodics_mapping);
                    if ($debug == 1) {
                        echo $dbInsert . "<br />-<br />";
                    }

                    if ($debug == 1) {
                        echo "Status Update in Middleware Content<br />-<br />";
                    }
                    $mapping = MiddlewareContent::where('id', $runningId)->update(array("status" => $mapping_status));
                    if ($debug == 1) {
                        echo '<span style="color:#FF0000;text-align:center;"><b>' . $mapping . '</b></span>';
                    }
                    $submission_payload = "";
                }
            }
        }
        $data = array("Response" => $Response);
        echo json_encode($data);
        // Send an asynchronous request.
        exit;
    }
    public function requestSubmit($accessToken, $method, $url, $submission_payload)
    {
        $headers = [
            'Authorization' => $accessToken,
            'Accept' => 'application/json',
            'Content-Type' => 'application/json',
        ];

        try {
            $client = new \GuzzleHttp\Client([
                'retry' => 3
            ]);
            $request = new Request($method, $url, $headers, json_encode($submission_payload));
            $res = $client->sendAsync($request)->wait();
            // print_r(json_decode($res->getBody()));
            return json_decode($res->getBody());
        } catch (\GuzzleHttp\Exception\RequestException $e) {
            $this->errors = json_decode($e->getResponse()->getBody()->getContents());
            // print_r($this->errors);
            return $this->errors;
        }

        // public function test()
        // {
        //     $request = new Request($method, $url, $headers, json_encode($submission_payload));
        //     $handlerStack = HandlerStack::create(new CurlHandler());
        //     $handlerStack->push(Middleware::retry($this->retryDecider(), $this->retryDelay()));
        //     $client = new Client(array('handler' => $handlerStack));

        //     $response = $client->request(
        //         'GET',
        //         // @todo replace to a real url!!!
        //         'https://500-error-code-url'
        //     )->getBody()->getContents();

        //     return \GuzzleHttp\json_decode($response, true);
        // }


        // public function retryDecider()
        // {
        //     return function (
        //         $retries,
        //         Request $request,
        //         Response $response = null,
        //         RequestException $exception = null
        //     ) {
        //         // Limit the number of retries to 5
        //         if ($retries >= 5) {
        //             return false;
        //         }

        //         // Retry connection exceptions
        //         if ($exception instanceof ConnectException) {
        //             return true;
        //         }

        //         if ($response) {
        //             // Retry on server errors
        //             if ($response->getStatusCode() >= 500 ) {
        //                 return true;
        //             }
        //         }

        //         return false;
        //     };
        // }

        // /**
        //  * delay 1s 2s 3s 4s 5s
        //  *
        //  * @return Closure
        //  */
        // public function retryDelay()
        // {
        //     return function ($numberOfRetries) {
        //         return 1000 * $numberOfRetries;
        //     };
        // }
    }

    public function delInventory($firstData, $resultJson)
    {

        $mappingTypeChefadmin = $firstData->type;
        $ma5ppingId = $firstData->id;
        $mappingbrandId = $firstData->brand_id;

        for ($i = 0; $i <= count($resultJson); $i++) {

            $submission_payload = "";
            $accessToken = 'Bearer ' . $resultJson[$i]['access_token'];
            $url = $resultJson[$i]['url'];
            $method = $resultJson[$i]['method'];

            $response_payload = $this->requestSubmit($accessToken, $method, $url, $submission_payload);
            print_r($response_payload);
            $mappingTypefoodics = substr($url, strrpos($url, '/') + 1);

            $foodics_mapping['brand_id'] = $mappingbrandId;
            $foodics_mapping['process_id'] = $mappingId;
            $foodics_mapping['chefadmin_id'] = $chefadmin_id;
            $foodics_mapping['foodics_id'] = $foodics_id;
            $foodics_mapping['type_foodics'] = $mappingTypefoodics;
            $foodics_mapping['type_chefadmin'] = $mappingTypeChefadmin;
            $foodics_mapping['submission_payload'] = json_encode($submission_payload);
            $foodics_mapping['response_payload'] = json_encode($response_payload);
            $foodics_mapping['status'] = $foodics_status;
            print_r($foodics_mapping);
            // exit;
            $dbInsert = FoodicsMapping::create($foodics_mapping);
            // if($debug == 1){ echo $dbInsert;
            $mapping = MiddlewareContent::where('id', 1)->update(array("status" => $mapping_status));
            // if($debug == 1){ echo $mapping;
            $submission_payload = "";
        }
    }

    public function checkparams($processId)
    {
        // if($debug == 1){ echo $processId;
        if (!isset($processId)) {
            if ($debug == 1) {
                echo "No processId";
            }
            exit;
        }
        $controller = new HomeAPIController();
        // get requests
        $get_request = MiddlewareContent::where('id', $processId)->latest()->first();

        $firstData = json_decode($get_request);
        // print_r(json_decode($get_request->body));
        // exit;
        // // get request body from DB
        $body = json_decode($get_request->body, true);
        // print_r($body);
        $mappingTypeChefadmin = $firstData->type;
        $result = $controller->handlePayload($body, $mappingTypeChefadmin);

        $resultJson = json_decode($result, true);
        print_r($result);
        exit;
    }

    // //  write a function to get last updated rows from FoodicsMapping table select batch, brand_id, foodics_id from foodics_mapping where updated_at >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
    // public function getUpdatedRows()
    // {
    //     $updatedRows = FoodicsMapping::select('batch', 'brand_id', 'foodics_id')->where('updated_at', '>=', Carbon::now()->subHour())->get();
    //     return $updatedRows;
    // }
    public function sendMail($processId)
    {
        $searchWord = 'bulk_';
        $batchId = FoodicsMapping::select('batch')->where('batch', 'LIKE', "{$searchWord}%")->where('id', $processId)->where('status', '!=', '0')->get();
        // print_r($batchId[0]['batch']);
        // exit;
        $totalCount = FoodicsMapping::select('*')->where('batch', '=', $batchId[0]['batch'])->get();
        $successCount = FoodicsMapping::select('id')->where('batch', '=', $batchId[0]['batch'])->where('status', '1')->get();
        $serverCount = FoodicsMapping::select('id')->where('batch', '=', $batchId[0]['batch'])->where('status', '3')->get();
        $dataCount = FoodicsMapping::select('id')->where('batch', '=', $batchId[0]['batch'])->where('status', '2')->get();

        $objDemo = new \stdClass();
        $objDemo->demo_one = 'Demo One Value';
        $objDemo->demo_two = 'Demo Two Value';
        $objDemo->sender = 'SenderUserName';
        $objDemo->receiver = 'ReceiverUserName';

        Mail::to("rehmantahamustafa@gmail.com")->send(new DemoEmail($objDemo));
        Mail::to("talhabinhaider@gmail.com")->send(new DemoEmail($objDemo));
    }
}
