private async void logResponse(HttpResponseMessage response, string serviceCall, bool isDownload, string filePath = "")
        {
            Console.WriteLine();
            Console.WriteLine("*************************************************************************");
            Console.WriteLine("SERVICECALL                  :::: " + serviceCall);

            Console.WriteLine();
            Console.WriteLine("METHOD                       :::: " + response.RequestMessage.Method);
            Console.WriteLine("REQUEST_STATUS_CODE          :::: " + response.StatusCode);

            if (response.IsSuccessStatusCode && serviceCall == "UploadFile")
            {
                Console.WriteLine("--------------------");
                Console.WriteLine("RESPONSE                 :::: " + " The following code is the ID of your file which you should use to start a slicing task: ");

                FileIdResponse resObj = JsonConvert.DeserializeObject <FileIdResponse>(response.Content.ReadAsStringAsync().Result);

                Console.WriteLine(resObj.Result.FileId);
                Console.WriteLine("--------------------");
            }
            else if (isDownload && HttpStatusCode.OK == response.StatusCode)
            {
                Console.WriteLine("--------------------");
                Console.WriteLine("RESPONSE                 :::: " + " Please check the following folder for the downloaded FCode file: ");
                Console.WriteLine(filePath);
                Console.WriteLine("--------------------");
            }
            else
            {
                Console.WriteLine("RESPONSE                     :::: " + await response.Content.ReadAsStringAsync());
            }

            Console.WriteLine("*************************************************************************");
            Console.WriteLine();
        }
        // ************************************************************************************* //
        //This function is used by all the API Functions to call the API
        // ************************************************************************************* //

        public async Task <MakeRequestResponse> MakeRequest(String method, string serviceCall, ApiRequest ApiRequest, bool isDownload = false, string downloadFolderPath = "")
        {
            using (HttpClient client = new HttpClient())
            {
                try
                {
                    //Authentication & Authorization
                    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", this.ApiSettings.ApiKey);
                    // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", this.Token);

                    HttpResponseMessage result = new HttpResponseMessage();

                    //Making the request depending on which type of request( multipart/form-data or application/json )
                    //Only UploadFile uses multipart/form-data

                    if (serviceCall == "UploadFile")
                    {
                        //Turn the ApiRequest into an UploadApiRequest
                        string           tempString = JsonConvert.SerializeObject(ApiRequest);
                        UploadApiRequest apiReq     = JsonConvert.DeserializeObject <UploadApiRequest>(tempString);
                        //The API main link ( ex: http://localhost:5001/REALvision/ )
                        client.BaseAddress = new Uri(this.ApiSettings.ApiUrl);
                        //Initializing the multipart Http request entity
                        MultipartFormDataContent multipartRequest = new MultipartFormDataContent();

                        //Adding details to the request like the filename and the file itself
                        HttpContent FileNameContent = new StringContent(apiReq.FileName);
                        HttpContent stlFileContent  = new ByteArrayContent(apiReq.File);

                        multipartRequest.Add(FileNameContent, "FileName");
                        multipartRequest.Add(stlFileContent, "file", apiReq.FileName);

                        try
                        {
                            result = client.PostAsync("UploadFile", multipartRequest).Result;
                        }
                        catch (HttpRequestException e)
                        {
                            Console.WriteLine("Error while uploading file  ... ");
                            throw e;
                        }

                        Console.WriteLine("*************************************************************************");

                        //Logging the results of the request
                        this.logResponse(result, serviceCall, false);

                        if (result.IsSuccessStatusCode)
                        {
                            string uploadFileResponseString = await result.Content.ReadAsStringAsync();

                            FileIdResponse uploadFileResponse = JsonConvert.DeserializeObject <FileIdResponse>(uploadFileResponseString);
                            return(new MakeRequestResponse(result.StatusCode, uploadFileResponse.Result.FileId));
                        }
                        else
                        {
                            string errorResponseString = await result.Content.ReadAsStringAsync();

                            //ApiErrorResponse errorResponse = JsonConvert.DeserializeObject<ApiErrorResponse>(errorResponseString);

                            return(new MakeRequestResponse(result.StatusCode, errorResponseString));
                        }
                    }
                    else
                    {
                        string downloadFileName = "";
                        //Turn the ApiRequest into an UploadApiRequest
                        string tempString = JsonConvert.SerializeObject(ApiRequest);
                        //We use the string for the HTTP request
                        if (method == "GET")
                        {
                            result = client.GetAsync(this.ApiSettings.ApiUrl + serviceCall).Result;
                        }
                        else
                        {
                            result = client.PostAsync(this.ApiSettings.ApiUrl + serviceCall, new StringContent(tempString, Encoding.UTF8, "application/json")).Result;
                        }

                        if (result.IsSuccessStatusCode)
                        {
                            //Reading the response as a string
                            var response = await result.Content.ReadAsStringAsync();

                            if (!isDownload)
                            {
                                this.logResponse(result, serviceCall, false);

                                switch (serviceCall)
                                {
                                case "GetActivationStatus":
                                    ActivationStatusResponse resp = JsonConvert.DeserializeObject <ActivationStatusResponse>(response);
                                    return(new MakeRequestResponse(result.StatusCode, resp.Result.Activated));

                                case "StartSlicingTask":
                                    TaskIdResponse startSlicingTaskResponse = JsonConvert.DeserializeObject <TaskIdResponse>(response);
                                    return(new MakeRequestResponse(result.StatusCode, startSlicingTaskResponse.Result.TaskId));

                                case "GetProgress":
                                    ProgressResponse responseObject = JsonConvert.DeserializeObject <ProgressResponse>(response);
                                    return(new MakeRequestResponse(result.StatusCode, responseObject.Result.Progress));

                                case "GetPrintingInformation":
                                    PrintingInformationResponse printingInformationResponse = JsonConvert.DeserializeObject <PrintingInformationResponse>(response);
                                    return(new MakeRequestResponse(result.StatusCode, JsonConvert.SerializeObject(printingInformationResponse.Result)));

                                default:
                                    return(new MakeRequestResponse(result.StatusCode, "Service call could not be found."));
                                }
                            }
                            else
                            {
                                this.logResponse(result, serviceCall, isDownload, downloadFolderPath + downloadFileName);

                                downloadFileName = result.Content.Headers.ContentDisposition.FileName;
                                SaveFile(response, Path.GetFileNameWithoutExtension(downloadFileName), Path.GetExtension(downloadFileName), downloadFolderPath);

                                return(new MakeRequestResponse(result.StatusCode, response));
                            }
                        }
                        else
                        {
                            string errorResponseString = await result.Content.ReadAsStringAsync();

                            ApiErrorResponse errorResponse = JsonConvert.DeserializeObject <ApiErrorResponse>(errorResponseString);

                            throw new Exception(errorResponse.Error.ErrorMessage);
                        }
                    }
                }
                catch (WebException e)
                {
                    throw e;
                }
            }
        }