/// <summary>
        /// This method is used to upload customer and check status of upload asynchronously as well as it notify user about result of processing of data
        /// </summary>
        /// <param name="param"></param>
        private async void ProcessAndNotifyResult(TaskProcessParam param)
        {
            try
            {
                // #1 Upload customer data
                EvilUploadCustomerRequest evilCustRequest = new EvilUploadCustomerRequest();

                evilCustRequest.Action   = config.UploadAction;
                evilCustRequest.Customer = param.Customer;
                evilCustRequest.File     = param.FileName;
                evilCustRequest.Property = param.UserName;
                evilCustRequest.Value    = param.Value;

                var uploadRes = await evilUploadRepository.UploadCustomerData(evilCustRequest).ConfigureAwait(false);

                // if somehow we dont get the hash value then render response accordingly
                if (string.IsNullOrWhiteSpace(uploadRes.Hash))
                {
                    NotifyResult(param.FileName, uploadRes, param.AuthIdentity);
                }
                else
                {
                    // #2 We got response and now its time to invoke check customer upload
                    var checkUploadResponse = await evilUploadRepository.GetCustomer(uploadRes.Hash).ConfigureAwait(false);

                    // Now, lets check if hash exists
                    if (string.IsNullOrWhiteSpace(checkUploadResponse.Hash))
                    {
                        uploadRes.Added  = false;
                        uploadRes.Errors = checkUploadResponse.Errors;
                    }

                    // #3 Notify web about response
                    NotifyResult(param.FileName, uploadRes, param.AuthIdentity);
                }
            }
            catch (Exception ex)
            {
                var response = new EvilUploadCustomerResponse
                {
                    Customer = param.Customer,
                    Value    = param.Value,
                    Errors   = new[] { ex.Message } // Ideally, it should be some meaningful error, or it should not on the first place!!
                };

                // notify error result
                NotifyResult(param.FileName, response, param.AuthIdentity);
            }
        }
        /// <summary>
        /// This method is used to upload customer data to 3rd party API
        /// </summary>
        /// <param name="customerRequest"></param>
        /// <returns></returns>
        public async Task <EvilUploadCustomerResponse> UploadCustomerData(EvilUploadCustomerRequest customerRequest)
        {
            using (var client = GetHttpClient(configData.ApiUrl))
            {
                var content = new StringContent(JsonConvert.SerializeObject(customerRequest), Encoding.UTF8, "application/json");

                var response = await client.PostAsync(configData.UploadUrl, content).ConfigureAwait(false);

                var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                var result = JsonConvert.DeserializeObject <EvilUploadCustomerResponse>(responseText);
                result.Customer = customerRequest.Customer;
                result.Value    = customerRequest.Value;

                return(result);
            }
        }