//AddressCleansing#/addressCleansing
        public JsonResult GetData(HttpPostedFileBase fileToUpload)
        {
            var result = new List<List<string>>();
            string time = RandomGeneratorController.GetUserId();
            Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
            string folder = Server.MapPath("~/Tuploads/" + time + "/");
            var fileLocation = new List<string>();
            string targetFolder = folder + fileToUpload.FileName;
            fileToUpload.SaveAs(targetFolder);
            var csvToData = new CsvToDataTable();
            var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder, "address");
            var tmpResults = new Helpers.DataCleansingLogich();

            fileLocation.Add(targetFolder);
            result.Add(fileLocation);

            if(csvData.Rows.Count > 10)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return Json(404, JsonRequestBehavior.AllowGet);
            }

            foreach (DataRow row in csvData.Rows)
            {
                List<string> str = new List<string>();

                foreach (var item in row.ItemArray)
                {
                    var tmpResult = tmpResults.Cleansing(item.ToString());

                    foreach(var items in tmpResult)
                    {
                        str.Add(items.BuildingName);
                        str.Add(items.Flat);
                        str.Add(items.BuildingNumber);
                        str.Add(items.Street);
                        str.Add(items.Locality);
                        str.Add(items.TraditionalCounty);
                        str.Add(items.PostCode);
                        break;
                    }
                    result.Add(str);
                }
            }
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        public ActionResult BulkAddress(IEnumerable<HttpPostedFileBase> fileToUpload)
        {
            var outputStream = new MemoryStream();
            int foundAddress = 0;
            int notFoundAddress = 0;
            int totalRecords = 0;
            using (var zip = new ZipFile())
            {
                string time = User.Identity.Name + DateTime.Now.Ticks;
                Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
                string folder = Server.MapPath("~/Tuploads/") + time + "/";
                foreach (var csvFile in fileToUpload)
                {
                    var results = new List<AddressModel>();
                    string targetFolder = folder + csvFile.FileName;
                    csvFile.SaveAs(targetFolder);
                    var csvToData = new CsvToDataTable();
                    var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder, "address");
                    //Billing
                    int records = csvData.Rows.Count;

                    var helper = new Helpers.CreditsDeduct();
                    //if more than 1 file submited
                    totalRecords += records;

                    var resul = helper.IsValid(User.Identity.Name, records, "", "bulk", "address");

                    if (resul == false)
                    {
                        Response.StatusCode = (int)HttpStatusCode.BadRequest;
                        return Json(404, JsonRequestBehavior.AllowGet);
                    }

                    //If user has enough credits start cleansing
                    foreach (DataRow res in csvData.Rows)
                    {
                        StringBuilder tempString = new StringBuilder();

                        foreach (var item in res.ItemArray)
                        {
                            if (item.ToString().Length == 0)
                            {
                                continue;
                            }
                            tempString = tempString.Append(item + ",");
                        }
                        var dataCleansing = new DataCleansingLogich();
                        var tempResult = dataCleansing.Cleansing(tempString.ToString().Substring(0, tempString.Length - 1)).FirstOrDefault();

                        if (tempResult.IsValid == "Corrected")
                        {
                            foundAddress++;
                        }
                        else
                        {
                            notFoundAddress++;
                        }

                        results.Add(new AddressModel
                        {
                            AdministrativeCounty = tempResult.AdministrativeCounty,
                            BuildingName = tempResult.BuildingName,
                            BuildingNumber = tempResult.BuildingNumber,
                            City = tempResult.City,
                            Flat = tempResult.Flat,
                            IsValid = tempResult.IsValid,
                            Locality = tempResult.Locality,
                            PostCode = tempResult.PostCode,
                            Street = tempResult.Street,
                            TraditionalCounty = tempResult.TraditionalCounty
                        });
                    }

                    this.Data.AddressCleansingHistory.Add(new AddressCleansingHistory
                    {
                        AddressCorrected = foundAddress,
                        AddressNotFound = notFoundAddress,
                        RecordsUploaded = totalRecords,
                        UserName = User.Identity.Name,
                        DateSubmited = DateTime.Now
                    });

                    this.Data.SaveChanges();

                    MemoryStream output = new MemoryStream();
                    int i = 0;

                    if (results.Count() > 0)
                    {

                        StreamWriter write = new StreamWriter(output, Encoding.UTF8);
                        StringBuilder sb = new StringBuilder();

                        write.Write("Corrected address");
                        write.Write(Environment.NewLine);

                        foreach (var details in results)
                        {
                            sb.Append(details.Flat + "," + details.BuildingName + "," + details.BuildingNumber + "," + details.Street + "," + details.City + "," + details.Locality + "," + details.TraditionalCounty + "," + details.PostCode + "," + details.IsValid);
                            write.Write(sb);
                            write.Write(Environment.NewLine);
                            sb.Clear();
                        }
                        write.Flush();
                        output.Position = 0;
                    }
                    //If any records write them to csv file and return to user
                    if (fileToUpload.Count() == 1)
                    {
                        return File(output, "text/coma-separated-values", User.Identity.Name + "_" + DateTime.Now.Ticks + ".csv");
                    }
                    else
                    {
                        using (FileStream file = new FileStream(folder + "test" + i + ".csv", FileMode.Create, System.IO.FileAccess.Write))
                        {
                            byte[] bytes = new byte[output.Length];
                            output.Read(bytes, 0, (int)output.Length);
                            file.Write(bytes, 0, bytes.Length);
                            output.Close();
                        }
                        zip.AddFile(folder + "test" + i + ".csv", @"\");
                        i++;
                        if (i == fileToUpload.Count())
                        {
                            zip.Save(outputStream);
                        }
                    }
                }

                outputStream.Position = 0;
                outputStream.Seek(0, SeekOrigin.Begin);
                return File(outputStream, "application/octet-stream", "filename.zip");

            }
        }
        public ActionResult BulkBic(IEnumerable<HttpPostedFileBase> fileToUpload)
        {
            var outputStream = new MemoryStream();

            int i = 0;
            using (var zip = new ZipFile())
            {
                string time = User.Identity.Name + DateTime.Now.Ticks;
                Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
                string folder = Server.MapPath("~/Tuploads/") + time + "/";

                foreach (var csvFile in fileToUpload)
                {
                    var returData = new HashSet<BicInfoModel>();
                    if (csvFile.ContentType.ToString() != "application/vnd.ms-excel")
                    {
                        //TO CHANGE!!!!!!!!!!!!!!!!
                        ViewBag.WrongFileType = "Wrong file type!";
                        return View();
                    }

                    string targetFolder = folder + csvFile.FileName;
                    csvFile.SaveAs(targetFolder);
                    var csvToData = new CsvToDataTable();
                    var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder,"bic");
                    //Billing
                    int records = csvData.Rows.Count;

                    if (User.Identity.IsAuthenticated)
                    {
                        var helper = new Helpers.CreditsDeduct();
                        var res = helper.IsValid(User.Identity.Name, records,"","bulk","bic");
                        if (res == false)
                        {
                            //TO CHANGE!!!!!!!
                            ViewBag.Error = "You don't have enough credits!";
                            return View();
                        }
                    }

                    foreach (DataRow item in csvData.Rows)
                    {
                        using (var context = new ApplicationDbContext())
                        {
                            var result = context.Database.SqlQuery<BicInfoModel>("GetFullDetailsSwift @SwiftCode", new SqlParameter("SwiftCode", item.Field<string>(0)));

                            foreach (var rr in result)
                            {
                                returData.Add(new BicInfoModel()
                                {
                                    BankOrInstitution = rr.BankOrInstitution,
                                    Branch = rr.Branch,
                                    City = rr.City,
                                    Country = rr.Country,
                                    SwiftCode = rr.SwiftCode
                                });
                            }
                        }
                    }

                    MemoryStream output = new MemoryStream();
                    //Save data to CSV file
                    if (returData.Count > 0)
                    {
                        StreamWriter writer = new StreamWriter(output, Encoding.UTF8);
                        StringBuilder sb = new StringBuilder();

                        writer.Write("Bank Name,Branch Name,City,Country,Swift ");
                        writer.Write(Environment.NewLine);

                        foreach (var bicDetails in returData)
                        {
                            sb.Append(bicDetails.BankOrInstitution + "," + bicDetails.Branch + "," + bicDetails.City + "," + bicDetails.Country + "," + bicDetails.SwiftCode);
                            writer.Write(sb);
                            writer.Write(Environment.NewLine);
                            sb.Clear();
                        }
                        writer.Flush();
                        output.Position = 0;
                    }

                    if (fileToUpload.Count() == 1)
                    {
                        return File(output, "text/comma-separated-values", User.Identity.Name + "_" + DateTime.Now.Ticks + ".csv");
                    }
                    else
                    {
                        using (FileStream file = new FileStream(folder + "test" + i + ".csv", FileMode.Create, System.IO.FileAccess.Write))
                        {
                            byte[] bytes = new byte[output.Length];
                            output.Read(bytes, 0, (int)output.Length);
                            file.Write(bytes, 0, bytes.Length);
                            output.Close();
                        }
                        zip.AddFile(folder + "test" + i + ".csv", @"\");
                        i++;
                        if (i == fileToUpload.Count())
                        {
                            zip.Save(outputStream);
                        }
                    }
                }
                outputStream.Position = 0;
                outputStream.Seek(0, SeekOrigin.Begin);
                return File(outputStream, "application/octet-stream", "filename.zip");
            }
        }
        public ActionResult BulkIban(IEnumerable<HttpPostedFileBase> fileToUpload)
        {
            var outputStream = new MemoryStream();
            int recordsSubmited = 0;
            int validRecords = 0;
            int invalidRecords = 0;

            int i = 0;
            using (var zip = new ZipFile())
            {
                string time = User.Identity.Name + DateTime.Now.Ticks;
                Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
                string folder = Server.MapPath("~/Tuploads/") + time + "/";

                foreach (var csvFile in fileToUpload)
                {
                    var returData = new List<BulkIbanModel>();
                    var results = new List<BulkIbanModel>();
                    if (csvFile.ContentType.ToString() != "application/vnd.ms-excel")
                    {
                        //TO CHANGE!!!!!!!!!!!!!!!!
                        ViewBag.WrongFileType = "Wrong file type!";
                        return View();
                    }
                    string targetFolder = folder + csvFile.FileName;
                    csvFile.SaveAs(targetFolder);
                    var csvToData = new CsvToDataTable();
                    var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder, "iban");

                    //Billing
                    int records = csvData.Rows.Count;

                    recordsSubmited += records;

                        var helper = new Helpers.CreditsDeduct();
                        var res = helper.IsValid(User.Identity.Name, records, "", "bulk", "iban");
                        if (res == false)
                        {
                            //TO CHANGE!!!!!!!
                            ViewBag.Error = "You don't have enough credits!";
                            return View();
                        }

                    foreach (DataRow item in csvData.Rows)
                    {
                        var iban = BankValidationController.Iban.CheckIban(item.Field<string>(0).ToString().Replace(" ", "").TrimEnd().TrimStart(), true);
                        //Show why iban fail if so
                        if (iban.IsValid == false)
                        {
                            returData.Add(new BulkIbanModel { IsValid = iban.Message });
                            invalidRecords++;
                        }

                        var bankValidation = new BankValidationController();

                        //If iban is correct take details from DB
                        var result = bankValidation.BicCountry(item.Field<string>(0).TrimStart().TrimEnd().ToUpper());
                        foreach (var rr in result)
                        {
                            returData.Add(new BulkIbanModel
                            {
                                BankCode = rr.BankCode,
                                BankName = rr.BankName,
                                BranchAddress = rr.BranchAddress,
                                BranchCode = rr.BranchCode,
                                BranchName = rr.BranchName,
                                City = rr.City,
                                ClientIban = item.Field<string>(0),
                                Country = rr.Country,
                                Fax = rr.Fax,
                                IsoCode = rr.IsoCode,
                                IsValid = iban.IsValid.ToString(),
                                Postcode = rr.Postcode,
                                Swift = rr.Swift,
                                Telephone = rr.Telephone
                            });
                            validRecords++;
                        }
                    }

                    this.Data.IbanCleansingHistory.Add(new IbanCleansingHistory
                    {
                        DateSubmited = DateTime.Now,
                        InvalidRecords = invalidRecords,
                        SubmitedRecords = recordsSubmited,
                        UserName = User.Identity.Name,
                        ValidRecords = validRecords
                    });

                    this.Data.SaveChanges();

                    MemoryStream output = new MemoryStream();
                    //Save data to CSV file
                    if (returData.Count > 0)
                    {
                        StreamWriter writer = new StreamWriter(output, Encoding.UTF8);
                        StringBuilder sb = new StringBuilder();

                        writer.Write("Iban,Is Valid,Bank Name,Branch Name,Branch Address,City,Post Code,Telephone,Fax,Swift ");
                        writer.Write(Environment.NewLine);

                        foreach (var bankName in returData)
                        {
                            sb.Append(bankName.ClientIban + "," + bankName.IsValid + "," + bankName.BankName + "," + bankName.BranchName + "," + bankName.BranchAddress + "," + bankName.City + "," + bankName.Postcode + "," + bankName.Telephone + "," + bankName.Fax + "," + bankName.Swift);
                            writer.Write(sb);
                            writer.Write(Environment.NewLine);
                            sb.Clear();
                        }
                        writer.Flush();
                        output.Position = 0;
                    }
                    if (fileToUpload.Count() == 1)
                    {
                        return File(output, "text/comma-separated-values", User.Identity.Name + "_" + DateTime.Now.Ticks + ".csv");
                    }
                    else
                    {
                        using (FileStream file = new FileStream(folder + "test" + i + ".csv", FileMode.Create, System.IO.FileAccess.Write))
                        {
                            byte[] bytes = new byte[output.Length];
                            output.Read(bytes, 0, (int)output.Length);
                            file.Write(bytes, 0, bytes.Length);
                            output.Close();
                        }

                        zip.AddFile(folder + "test" + i + ".csv", @"\");
                        i++;
                        if (i == fileToUpload.Count())
                        {
                            zip.Save(outputStream);
                        }
                    }
                }
                outputStream.Position = 0;
                outputStream.Seek(0, SeekOrigin.Begin);
                return File(outputStream, "application/octet-stream", "filename.zip");
            }
        }
        public ActionResult BulkPhoneValidation(IEnumerable<HttpPostedFileBase> fileToUpload)
        {
            int recordsSubmited = 0;
            var outputStream = new MemoryStream();
            int i = 0;
            using (var zip = new ZipFile())
            {
                string time = User.Identity.Name + DateTime.Now.Ticks;
                Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
                string folder = Server.MapPath("~/Tuploads/") + time + "/";
                foreach (var csvFile in fileToUpload)
                {
                    if (csvFile.ContentType.ToString() != "application/vnd.ms-excel")
                    {
                        Response.StatusCode = (int)HttpStatusCode.BadRequest;
                        return Json(404, JsonRequestBehavior.AllowGet);
                    }
                    string targetFolder = folder + csvFile.FileName;
                    csvFile.SaveAs(targetFolder);
                    var csvToData = new CsvToDataTable();
                    var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder, "phone");
                    //Billing
                    int records = csvData.Rows.Count;

                    recordsSubmited += records;

                    var helper = new Helpers.CreditsDeduct();
                    var res = helper.IsValid(User.Identity.Name, records, "", "bulk", "phone");

                    if (res == false)
                    {
                        Response.StatusCode = (int)HttpStatusCode.BadRequest;
                        return Json(404, JsonRequestBehavior.AllowGet);
                    }

                    var results = Validate(csvData);

                    var counts = results[results.Count - 1];

                    this.Data.PhoneCleansingHistory.Add(new PhoneCleansingHistory
                    {
                        DateSubmited = DateTime.Now,
                        Invalid = Int32.Parse(counts.Number),
                        SubmitedRecords = recordsSubmited,
                        UserName = User.Identity.Name,
                        Valid = Int32.Parse(counts.Message)
                    });

                    this.Data.SaveChanges();

                    MemoryStream output = new MemoryStream();

                    if (results.Count() > 0)
                    {
                        StreamWriter writer = new StreamWriter(output, Encoding.UTF8);
                        StringBuilder sb = new StringBuilder();
                        writer.Write("Phone Number, Area, Is valid, Message ");
                        writer.Write(Environment.NewLine);
                        foreach (var details in results)
                        {
                            sb.Append(details.Number + "," + details.Area + "," + details.IsValid + "," + details.Message);
                            writer.Write(sb);
                            writer.Write(Environment.NewLine);
                            sb.Clear();
                        }
                        writer.Flush();
                        output.Position = 0;
                    }
                    //If any records write them to csv file and return to user
                    if (fileToUpload.Count() == 1)
                    {
                        return File(output, "text/coma-separated-values", User.Identity.Name + "_" + DateTime.Now.Ticks + ".csv");
                    }
                    else
                    {
                        using (FileStream file = new FileStream(folder + "test" + i + ".csv", FileMode.Create, System.IO.FileAccess.Write))
                        {
                            byte[] bytes = new byte[output.Length];
                            output.Read(bytes, 0, (int)output.Length);
                            file.Write(bytes, 0, bytes.Length);
                            output.Close();
                        }
                        zip.AddFile(folder + "test" + i + ".csv", @"\");
                        i++;
                        if (i == fileToUpload.Count())
                        {
                            zip.Save(outputStream);
                        }
                    }
                }
                outputStream.Position = 0;
                outputStream.Seek(0, SeekOrigin.Begin);
                return File(outputStream, "application/octet-stream", "filename.zip");
            }
        }
        public ActionResult BulkCardValidation(IEnumerable<HttpPostedFileBase> fileToUpload)
        {
            var outputStream = new MemoryStream();
            int i = 0;
            int recordsSubmited = 0;
            int validCards = 0;
            int invalidCards = 0;
            using (var zip = new ZipFile())
            {
                string time = User.Identity.Name + DateTime.Now.Ticks;
                Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
                string folder = Server.MapPath("~/Tuploads/") + time + "/";
                foreach (var csvFile in fileToUpload)
                {
                    var results = new List<CardValidationViewModel>();

                    if (csvFile.ContentType.ToString() != "application/vnd.ms-excel")
                    {
                        results.Add(new CardValidationViewModel
                        {
                            Message = "Wrong file type! File must be CSV"
                        });

                        return Json(results, JsonRequestBehavior.AllowGet);
                    }
                    string targetFolder = folder + csvFile.FileName;
                    csvFile.SaveAs(targetFolder);
                    var csvToData = new CsvToDataTable();
                    var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder, "card");
                    //Billing
                    int records = csvData.Rows.Count;

                    recordsSubmited += records;

                    if (User.Identity.IsAuthenticated)
                    {
                        var helper = new Helpers.CreditsDeduct();
                        var res = helper.IsValid(User.Identity.Name, records, "", "bulk", "card");

                        if (res == false)
                        {
                            results.Add(new CardValidationViewModel
                            {
                                Message = "You don't have enought credits left. Please Top Up!"
                            });

                            return Json(results, JsonRequestBehavior.AllowGet);
                        }
                    }

                    //If user has enough credits start cleansing
                    foreach (DataRow res in csvData.Rows)
                    {
                        StringBuilder tempString = new StringBuilder();

                        foreach (var item in res.ItemArray)
                        {
                            if (item.ToString().Length == 0)
                            {
                                continue;
                            }
                            tempString = tempString.Append(item + ",");
                        }
                        var cardType = new CardType();

                        var temp = cardType.CardLogic(tempString.ToString().Substring(0, tempString.Length - 1));

                        foreach (var resul in temp)
                        {
                            results.Add(new CardValidationViewModel
                            {
                                CardIssue = resul.CardIssue,
                                IsValid = resul.IsValid,
                                Message = resul.Message,
                                CardNumber = resul.CardNumber
                            });

                            if (resul.IsValid == "Card is valid")
                                validCards++;
                            else
                                invalidCards++;
                        }
                    }

                    MemoryStream output = new MemoryStream();

                    this.Data.CardCleansingHistory.Add(new CardCleansingHistory
                    {
                        DateSubmited = DateTime.Now,
                        InvalidCards = invalidCards,
                        RecordsUploaded = recordsSubmited,
                        UserName = User.Identity.Name,
                        ValidCards = validCards
                    });

                    this.Data.SaveChanges();

                    if (results.Count() > 0)
                    {
                        StreamWriter writer = new StreamWriter(output, Encoding.UTF8);
                        StringBuilder sb = new StringBuilder();

                        writer.Write("Card Number, Card Type, Is valid, Message ");
                        writer.Write(Environment.NewLine);

                        foreach (var details in results)
                        {
                            sb.Append(details.CardNumber + "," + details.CardIssue + "," + details.IsValid + "," + details.Message);
                            writer.Write(sb);
                            writer.Write(Environment.NewLine);
                            sb.Clear();
                        }
                        writer.Flush();
                        output.Position = 0;
                    }
                    //If any records write them to csv file and return to user
                    if (fileToUpload.Count() == 1)
                    {
                        return File(output, "text/coma-separated-values", User.Identity.Name + "_" + DateTime.Now.Ticks + ".csv");
                    }
                    else
                    {
                        using (FileStream file = new FileStream(folder + "test" + i + ".csv", FileMode.Create, System.IO.FileAccess.Write))
                        {
                            byte[] bytes = new byte[output.Length];
                            output.Read(bytes, 0, (int)output.Length);
                            file.Write(bytes, 0, bytes.Length);
                            output.Close();
                        }
                        zip.AddFile(folder + "test" + i + ".csv", @"\");
                        i++;
                        if (i == fileToUpload.Count())
                        {
                            zip.Save(outputStream);
                        }
                    }
                }

                outputStream.Position = 0;
                outputStream.Seek(0, SeekOrigin.Begin);
                return File(outputStream, "application/octet-stream", "filename.zip");

            }
        }
        public JsonResult GetData(HttpPostedFileBase fileToUpload)
        {
            var result = new List<List<string>>();
            string time = RandomGeneratorController.GetUserId();
            Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
            string folder = Server.MapPath("~/Tuploads/" + time + "/");
            var fileLocation = new List<string>();
            string targetFolder = folder + fileToUpload.FileName;
            fileToUpload.SaveAs(targetFolder);
            var csvToData = new CsvToDataTable();
            var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder, "phone");

            if (csvData.Rows.Count > 10)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return Json(404, JsonRequestBehavior.AllowGet);
            }

            var resul = Validate(csvData);

            //remove last element in witch has valid and invalid data
            resul.RemoveAt(resul.Count - 1);

            foreach (var item in resul)
            {
                List<string> str = new List<string>();
                str.Add(item.Number);
                str.Add(item.IsValid);
                str.Add(item.Area);
                str.Add(item.Message);
                result.Add(str);
            }

            return Json(result, JsonRequestBehavior.AllowGet);
        }
        public List<List<string>> ExactMatch(string matchCriteria, string toggleCheck, string time, int columns,string userName)
        {
            int uniqueRecords = 0;
            int dublicatedRecords = 0;
            var results = new List<List<string>>();
            var res = new List<List<string>>();
            var columnCriteria = toggleCheck.Split(',');
            var csvToData = new CsvToDataTable();
            var csvData = csvToData.GetDataTabletFromCSVFile(time, "deduplicate");
            HashSet<string> ScannedRecords = new HashSet<string>();
            HashSet<string> ScannedRecords2 = new HashSet<string>();

            int recordsSubmited = csvData.Rows.Count;
            int rowNumb = recordsSubmited;

            var getCredits = this.Data.Credits.All().Where(x => x.UserName == userName);
            int credits = 0;
            foreach (var item in getCredits)
            {
                credits = Int32.Parse(item.Credits.ToString());
                break;
            }

            //Checking if user have enough credits
            if (credits - rowNumb  < 0)
            {
                return results;
            }

            // 2 = not preview, bill user
            if (columns == 2)
            {
                var helper = new Helpers.CreditsDeduct();

                var creditsLeft = helper.IsValid(userName, rowNumb, "", "bulk", "deduplicate");

                if (!creditsLeft)
                {
                    return results;
                }
            }

            if (matchCriteria == "1")
            {
                foreach (DataRow row in csvData.Rows)
                {
                    List<string> str = new List<string>();
                    StringBuilder sb = new StringBuilder();

                    if (rowNumb > 0)
                    {
                        List<string> numb = new List<string>();
                        numb.Add(rowNumb.ToString());
                        results.Add(numb);
                        rowNumb = 0;
                    }

                    foreach (DataColumn col in csvData.Columns)
                    {
                        //checking for column conditions
                        if (columnCriteria.Contains(col.ToString()))
                            sb.AppendFormat("[{0}={1}]", col, row[col.ColumnName].ToString());
                    }

                    if (ScannedRecords.Add(sb.ToString()))
                    {
                        uniqueRecords++;
                        for (int i = 0; i < row.ItemArray.Length; i++)
                        {
                            str.Add(row.ItemArray[i].ToString());
                        }

                        results.Add(str);
                        //Showing first 100 records to prevent fraud
                        if (results.Count == 100 && columns == 1)
                        {
                            return results;
                        }
                    }
                    else
                    {
                        dublicatedRecords++;
                    }
                }
            }
            else if (matchCriteria == "2")
            {
                List<string> str = new List<string>();

                foreach (DataRow row in csvData.Rows)
                {
                    var sb = new StringBuilder();
                    foreach (DataColumn col in csvData.Columns)
                    {
                        if (columnCriteria.Contains(col.ToString()))
                        {
                            sb.AppendFormat("[{0}={1}]", col, row[col.ColumnName].ToString());
                        }
                    }
                    str.Add(sb.ToString());
                }

                int rowNumber = str.Count();

                foreach (DataRow row in csvData.Rows)
                {
                    List<string> str2 = new List<string>();
                    StringBuilder sb = new StringBuilder();
                    StringBuilder sb3 = new StringBuilder();

                    if (rowNumber > 0)
                    {
                        List<string> numb = new List<string>();
                        numb.Add(rowNumber.ToString());
                        results.Add(numb);
                        rowNumber = 0;
                    }

                    foreach (DataColumn col in csvData.Columns)
                    {
                        //checking for column conditions
                        if (columnCriteria.Contains(col.ToString()))
                        {
                            sb.AppendFormat("[{0}={1}]", col, row[col.ColumnName].ToString());
                            sb3.AppendFormat("[{0}={1}]", col, row[col.ColumnName].ToString());
                        }
                    }

                    if (ScannedRecords.Add(sb.ToString()))
                    {
                        uniqueRecords++;
                        for (int i = 0; i < row.ItemArray.Length; i++)
                        {
                            str2.Add(row.ItemArray[i].ToString());
                        }

                        var lenshtine = new Levenshtine();

                        var levenshtineResult = lenshtine.Search(sb3.ToString(), str, 0.9);

                        foreach (var item in levenshtineResult)
                        {
                            dublicatedRecords++;
                            ScannedRecords.Add(item);
                        }

                        results.Add(str2);
                        //Showing first 100 records to prevent fraud
                        if (results.Count == 100 && columns == 1)
                        {
                            return results;
                        }
                    }
                }
            }

            this.Data.DeduplicateCleansingHistory.Add(new DeduplicateCleansingHistory
                {
                    DateSubmited = DateTime.Now,
                    DuplicateRecords = dublicatedRecords,
                    SubmitedRecords = recordsSubmited,
                    UniqueRecords = uniqueRecords,
                    UserName = userName
                });

            this.Data.SaveChanges();

            return results;
        }
        //Application#/deduplicate
        //Deduplicate#/deduplicate
        public JsonResult GetColumn(IEnumerable<HttpPostedFileBase> fileToUpload)
        {
            var columnName = new List<string>();
            string time = User.Identity.Name + DateTime.Now.Ticks;
            Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
            string folder = Server.MapPath("~/Tuploads/") + time + "/";

            foreach (var csvFile in fileToUpload)
            {
                string targetFolder = folder + csvFile.FileName;
                csvFile.SaveAs(targetFolder);
                columnName.Add(targetFolder);
                var csvToData = new CsvToDataTable();
                var csvData = csvToData.GetDataTableColumns(targetFolder);

                foreach (DataColumn col in csvData.Columns)
                {
                    columnName.Add(col.ColumnName);
                }
            }

            return Json(columnName, JsonRequestBehavior.AllowGet);
        }
        public JsonResult GetData(HttpPostedFileBase fileToUpload)
        {
            var result = new List<List<string>>();
            string time = RandomGeneratorController.GetUserId();
            Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
            string folder = Server.MapPath("~/Tuploads/" + time + "/");
            var fileLocation = new List<string>();
            string targetFolder = folder + fileToUpload.FileName;
            fileToUpload.SaveAs(targetFolder);
            var csvToData = new CsvToDataTable();
            var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder,"email");
            var tmpResilts = new Controllers.Helpers.Email();

            //add file location to List
            fileLocation.Add(targetFolder);
            result.Add(fileLocation);

            if (csvData.Rows.Count > 10)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return Json(404, JsonRequestBehavior.AllowGet);
            }

            foreach (DataRow row in csvData.Rows)
            {
                List<string> str = new List<string>();

                foreach (var item in row.ItemArray)
                {
                    var tmpResult = tmpResilts.Validate(item.ToString());

                    foreach (var items in tmpResult)
                    {
                        str.Add(items.Email);
                        str.Add(items.IsValid);
                        str.Add(items.Message);
                        str.Add(items.MxRecord);
                        break;
                    }
                    result.Add(str);
                }
            }

            return Json(result, JsonRequestBehavior.AllowGet);
        }
        public ActionResult BulkPhoneValidation(IEnumerable<HttpPostedFileBase> fileToUpload)
        {
            int recordsSubmited = 0;
            int validRecords = 0;
            int invalidRecords = 0;
            var outputStream = new MemoryStream();
            int i = 0;
            using (var zip = new ZipFile())
            {
                string time = User.Identity.Name + DateTime.Now.Ticks;
                Directory.CreateDirectory(Server.MapPath("~/Tuploads/") + time);
                string folder = Server.MapPath("~/Tuploads/") + time + "/";
                foreach (var csvFile in fileToUpload)
                {
                    var results = new List<PhoneValidationViewModel>();

                    if (csvFile.ContentType.ToString() != "application/vnd.ms-excel")
                    {
                        results.Add(new PhoneValidationViewModel
                        {
                            Message = "Wrong file type! File must be CSV"
                        });
                        return Json(results, JsonRequestBehavior.AllowGet);
                    }
                    string targetFolder = folder + csvFile.FileName;
                    csvFile.SaveAs(targetFolder);
                    var csvToData = new CsvToDataTable();
                    var csvData = csvToData.GetDataTabletFromCSVFile(targetFolder, "phone");
                    //Billing
                    int records = csvData.Rows.Count;

                    recordsSubmited += records;

                    if (User.Identity.IsAuthenticated)
                    {
                        var helper = new Helpers.CreditsDeduct();
                        var res = helper.IsValid(User.Identity.Name, records, "", "bulk", "phone");

                        if (res == false)
                        {
                            results.Add(new PhoneValidationViewModel
                            {
                                Message = "You don't have enought credits left. Please Top Up!"
                            });

                            return Json(results, JsonRequestBehavior.AllowGet);
                        }
                    }

                    //If user has enough credits start cleansing
                    foreach (DataRow res in csvData.Rows)
                    {
                        //StringBuilder tempString = new StringBuilder();

                        foreach (var item in res.ItemArray)
                        {
                            var cleanNumber = RemoveSpecialCharacters(item.ToString());

                            if (cleanNumber.Length != 11 && cleanNumber.Length != 10)
                            {
                                results.Add(new PhoneValidationViewModel
                                {
                                    IsValid = "Phone is invalid",
                                    Number = "=\"" + item.ToString() + "\"",
                                });

                                invalidRecords++;
                            }
                            else
                            {
                                using (var context = new ApplicationDbContext())
                                {
                                    for (int j = 5; j >= 2; j--)
                                    {
                                        var numberPer = new SqlParameter("@Number", cleanNumber.Substring(0, i));

                                        var tmpData = context.Database.SqlQuery<GetPhoneArea_Result>("GetPhoneArea @Number", numberPer).First();

                                        if (tmpData.IsValid == "Valid")
                                        {
                                            results.Add(new PhoneValidationViewModel
                                            {
                                                Area = tmpData.AreaCovered,
                                                Number = "=\"" + item.ToString() + "\"",
                                                IsValid = tmpData.IsValid
                                            });
                                            validRecords++;
                                            break;
                                        }
                                        if (j == 2)
                                        {
                                            results.Add(new PhoneValidationViewModel
                                            {
                                                Area = tmpData.AreaCovered,
                                                Number = "=\"" + item.ToString() + "\"",
                                                IsValid = tmpData.IsValid
                                            });
                                            invalidRecords++;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }

                    this.Data.PhoneCleansingHistory.Add(new PhoneCleansingHistory
                    {
                        DateSubmited = DateTime.Now,
                        Invalid = invalidRecords,
                        SubmitedRecords = recordsSubmited,
                        UserName = User.Identity.Name,
                        Valid = validRecords
                    });

                    this.Data.SaveChanges();

                    MemoryStream output = new MemoryStream();

                    if (results.Count() > 0)
                    {
                        StreamWriter writer = new StreamWriter(output, Encoding.UTF8);
                        StringBuilder sb = new StringBuilder();
                        writer.Write("Phone Number, Area, Is valid, Message ");
                        writer.Write(Environment.NewLine);
                        foreach (var details in results)
                        {
                            sb.Append(details.Number + "," + details.Area + "," + details.IsValid + "," + details.Message);
                            writer.Write(sb);
                            writer.Write(Environment.NewLine);
                            sb.Clear();
                        }
                        writer.Flush();
                        output.Position = 0;
                    }
                    //If any records write them to csv file and return to user
                    if (fileToUpload.Count() == 1)
                    {
                        return File(output, "text/coma-separated-values", User.Identity.Name + "_" + DateTime.Now.Ticks + ".csv");
                    }
                    else
                    {
                        using (FileStream file = new FileStream(folder + "test" + i + ".csv", FileMode.Create, System.IO.FileAccess.Write))
                        {
                            byte[] bytes = new byte[output.Length];
                            output.Read(bytes, 0, (int)output.Length);
                            file.Write(bytes, 0, bytes.Length);
                            output.Close();
                        }
                        zip.AddFile(folder + "test" + i + ".csv", @"\");
                        i++;
                        if (i == fileToUpload.Count())
                        {
                            zip.Save(outputStream);
                        }
                    }
                }
                outputStream.Position = 0;
                outputStream.Seek(0, SeekOrigin.Begin);
                return File(outputStream, "application/octet-stream", "filename.zip");
            }
        }