/// <summary>
        /// Delete a product on correct product.
        /// </summary>
        /// <param name="delstt"></param>
        /// <returns></returns>
        public ActionResult deleteproduct(String sttproduct)
        {
            // get list product in session.
            List<ProductMap> listpro = (List<ProductMap>)Session["listproduct"];
            List<ProductMap> listerror = (List<ProductMap>)Session["listerror"];
            List<List<ProductMap>> listduplicate = (List<List<ProductMap>>)Session["listduplicate"];
            ProductMap delpro = new ProductMap();
            foreach (ProductMap p in listpro)
            {
                if (p.stt.Equals(sttproduct))
                {
                    delpro = p;
                    break;
                }
            }
            listpro.Remove(delpro);
            Session["listproduct"] = listpro;

            return RedirectToAction("Index");
        }
        /// <summary>
        /// Tách tất cả
        /// </summary>
        /// <param name="value2"></param>
        /// <returns></returns>
        public ActionResult tachtatca(List<String> value2)
        {
            List<List<String>> listlon = new List<List<String>>();

            for (int i = 1; i < value2.Count; i++)
            {
                List<String> listcon = new List<String>();
                String[] tablestt = value2[i].ToString().Split('@');
                for (int j = 1; j < tablestt.Length; j++)
                {
                    listcon.Add(tablestt[j]);
                }
                listlon.Add(listcon);

            }
            for (int h = 0; h < listlon.Count; h++)
            {
                //-------------------------------------------------------------------------------------------------------------------
                // get list product in session.
                List<ProductMap> listpro = (List<ProductMap>)Session["listproduct"];
                List<ProductMap> listerror = (List<ProductMap>)Session["listerror"];
                List<List<ProductMap>> listduplicate = (List<List<ProductMap>>)Session["listduplicate"];
                ProductMap duplicate = new ProductMap();
                for (int i = 0; i < listduplicate.Count; i++)
                {
                    for (int j = 0; j < listduplicate[i].Count; j++)
                    {
                        // duyệt để tim thấy list có chưa id tách được gửi về.
                        for (int t = 0; t < listlon[h].Count; t++)
                        {
                            if (listduplicate[i][j].stt.ToString().Equals(listlon[h][t].ToString()))
                            {
                                listpro.Add(listduplicate[i][j]);
                                listduplicate[i].Remove(listduplicate[i][j]);
                            }
                        }

                        // kiểm tra trong list nhỏ còn có 1 phần tử thì tách nó luôn cho vào list correct
                        if (listduplicate[i].Count == 1)
                        {
                            listpro.Add(listduplicate[i].First());
                            listduplicate[i].Remove(listduplicate[i].First());
                            //Xóa list rỗng trong list bự duplicate
                            listduplicate.Remove(listduplicate[i]);
                        }
                        else if (listduplicate[i].Count == 0)
                        {
                            //Xóa list rỗng trong list bự duplicate
                            listduplicate.Remove(listduplicate[i]);
                        }
                    }
                }

                Session["listerror"] = listerror;
                Session["listduplicate"] = listduplicate;
                Session["listproduct"] = listpro;
                //-------------------------------------------------------------------------------------------------------------------
            }
            return RedirectToAction("Index");
        }
        /// <summary>
        /// gộp tất cả
        /// </summary>
        /// <param name="value1"></param>
        /// <returns></returns>
        public ActionResult goptatca(List<String> value1)
        {
            List<List<String>> listlon = new List<List<String>>();

            for (int i = 1; i < value1.Count; i++)
            {
                List<String> listcon = new List<String>();
                String[] tablestt = value1[i].ToString().Split('@');
                for (int j = 1; j < tablestt.Length; j++)
                {
                    listcon.Add(tablestt[j]);
                }
                listlon.Add(listcon);

            }
            for (int h = 0; h < listlon.Count; h++)
            {

                //--------------------------------------------------------------------------------------------------------------------
                List<ProductMap> listpro = (List<ProductMap>)Session["listproduct"];
                List<ProductMap> listerror = (List<ProductMap>)Session["listerror"];
                List<List<ProductMap>> listduplicate = (List<List<ProductMap>>)Session["listduplicate"];

                // lấy tên chính ở cuối list ra và remove
                string sttTenchinh = listlon[h].Last();
                listlon[h].Remove(listlon[h].Last());

                // tên sản phẩm gộp
                string tenmoi = "";
                ProductMap sanphamgop = new ProductMap();

                int count = 0;
                for (int i = 0; i < listduplicate.Count; i++)
                {
                    for (int j = 0; j < listduplicate[i].Count; j++)
                    {
                        // duyệt để tim thấy list có chưa id tách được gửi về.
                        for (int t = 0; t < listlon[h].Count; t++)
                        {
                            if (listduplicate[i][j].stt.ToString().Equals(sttTenchinh))
                            {
                                count++;
                                tenmoi = listduplicate[i][j].ten;
                                sanphamgop = listduplicate[i][j];
                                listduplicate[i].Remove(listduplicate[i][j]);
                            }
                            if (listduplicate[i][j].stt.ToString().Equals(listlon[h][t].ToString()))
                            {
                                tenmoi += ";" + listduplicate[i][j].ten;
                                listduplicate[i].Remove(listduplicate[i][j]);
                            }
                            if (listduplicate[i].Count == 0)
                            {
                                break;
                            }
                        }
                        // kiểm tra trong list nhỏ còn có 1 phần tử thì tách nó luôn cho vào list correct
                        if (listduplicate[i].Count == 1)
                        {
                            listpro.Add(listduplicate[i].First());
                            listduplicate[i].Remove(listduplicate[i].First());
                            //Xóa list rỗng trong list bự duplicate
                            listduplicate.Remove(listduplicate[i]);
                        }
                        else if (listduplicate[i].Count == 0)
                        {
                            //Xóa list rỗng trong list bự duplicate
                            listduplicate.Remove(listduplicate[i]);
                        }
                        if (count > 0)
                        {

                            break;
                        }
                    }
                    if (count > 0)
                    {

                        break;
                    }
                }

                sanphamgop.ten = tenmoi;
                listpro.Add(sanphamgop);
                Session["listproduct"] = listpro;
                Session["listerror"] = listerror;
                Session["listduplicate"] = listduplicate;
                //--------------------------------------------------------------------------------------------------------------------
            }
            // string txtName = Request.Params["id"];
            //      Json(new { Result = String.Format("Fist item in list: '{0}'", value1[0]) });
            return RedirectToAction("Index");
        }
        /// <summary>
        /// Tách 1 table trùng
        /// </summary>
        /// <param name="values"></param>
        /// <returns></returns>
        public ActionResult getTach(List<String> valuesTach)
        {
            // get list product in session.
            List<ProductMap> listpro = (List<ProductMap>)Session["listproduct"];
            List<ProductMap> listerror = (List<ProductMap>)Session["listerror"];
            List<List<ProductMap>> listduplicate = (List<List<ProductMap>>)Session["listduplicate"];
            ProductMap duplicate = new ProductMap();
            for (int i = 0; i < listduplicate.Count; i++)
            {
                for (int j = 0; j < listduplicate[i].Count; j++)
                {
                    // duyệt để tim thấy list có chưa id tách được gửi về.
                    for (int t = 0; t < valuesTach.Count; t++)
                    {
                        if (listduplicate[i][j].stt.ToString().Equals(valuesTach[t].ToString()))
                        {
                            listpro.Add(listduplicate[i][j]);
                            listduplicate[i].Remove(listduplicate[i][j]);
                        }
                    }

                    // kiểm tra trong list nhỏ còn có 1 phần tử thì tách nó luôn cho vào list correct
                    if (listduplicate[i].Count == 1)
                    {
                        listpro.Add(listduplicate[i].First());
                        listduplicate[i].Remove(listduplicate[i].First());
                        //Xóa list rỗng trong list bự duplicate
                        listduplicate.Remove(listduplicate[i]);
                    }
                    else if (listduplicate[i].Count == 0)
                    {
                        //Xóa list rỗng trong list bự duplicate
                        listduplicate.Remove(listduplicate[i]);
                    }
                }
            }

            Session["listerror"] = listerror;
            Session["listduplicate"] = listduplicate;
            Session["listproduct"] = listpro;
            return RedirectToAction("Index");
        }
        /// <summary>
        /// Gộp 1 table trùng
        /// </summary>
        /// <param name="values"></param>
        /// <returns></returns>
        public ActionResult getGop(List<String> values)
        {
            List<ProductMap> listpro = (List<ProductMap>)Session["listproduct"];
            List<ProductMap> listerror = (List<ProductMap>)Session["listerror"];
            List<List<ProductMap>> listduplicate = (List<List<ProductMap>>)Session["listduplicate"];

            // lấy tên chính ở cuối list ra và remove
            string sttTenchinh = values.Last();
            values.Remove(values.Last());

            // tên sản phẩm gộp
            string tenmoi = "";
            ProductMap sanphamgop = new ProductMap();

            int count = 0;
            for (int i = 0; i < listduplicate.Count; i++)
            {
                for (int j = 0; j < listduplicate[i].Count; j++)
                {
                    // duyệt để tim thấy list có chưa id tách được gửi về.
                    for (int t = 0; t < values.Count; t++)
                    {
                        if (listduplicate[i][j].stt.ToString().Equals(sttTenchinh))
                        {
                            count++;
                            tenmoi = listduplicate[i][j].ten;
                            sanphamgop = listduplicate[i][j];
                            listduplicate[i].Remove(listduplicate[i][j]);
                        }
                        if (listduplicate[i][j].stt.ToString().Equals(values[t].ToString()))
                        {
                            tenmoi += ";" + listduplicate[i][j].ten;
                            listduplicate[i].Remove(listduplicate[i][j]);
                        }
                        if (listduplicate[i].Count == 0)
                        {
                            break;
                        }
                    }
                    // kiểm tra trong list nhỏ còn có 1 phần tử thì tách nó luôn cho vào list correct
                    if (listduplicate[i].Count == 1)
                    {
                        listpro.Add(listduplicate[i].First());
                        listduplicate[i].Remove(listduplicate[i].First());
                        //Xóa list rỗng trong list bự duplicate
                        listduplicate.Remove(listduplicate[i]);
                    }
                    else if (listduplicate[i].Count == 0)
                    {
                        //Xóa list rỗng trong list bự duplicate
                        listduplicate.Remove(listduplicate[i]);
                    }
                    if (count > 0)
                    {

                        break;
                    }
                }
                if (count > 0)
                {

                    break;
                }
            }

            sanphamgop.ten = tenmoi;
            listpro.Add(sanphamgop);
            Session["listproduct"] = listpro;
            Session["listerror"] = listerror;
            Session["listduplicate"] = listduplicate;

            //    Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
            return RedirectToAction("Index");
        }
        /// <summary>
        /// Sản phẩm lỗi đã được sửa.
        /// </summary>
        /// <param name="delstt"></param>
        /// <returns></returns>
        public ActionResult fixedErrorProduct()
        {
            // get list product in session.
            List<ProductMap> listpro = (List<ProductMap>)Session["listproduct"];
            List<ProductMap> listerror = (List<ProductMap>)Session["listerror"];
            List<List<ProductMap>> listduplicate = (List<List<ProductMap>>)Session["listduplicate"];

            string stt = Request.Params["button"];
            string ten = Request.Params["tenpro"];
            string tronngso = Request.Params["trongsopro"];
            string loai = Request.Params["loaipro"];

            // xóa sản phẩm trong list error và cập nhập vào session
            ProductMap delpro = new ProductMap();
            foreach (ProductMap p in listerror)
            {
                if (p.stt.Equals(stt))
                {
                    delpro = p;
                    break;
                }
            }
            listerror.Remove(delpro);
            Session["listerror"] = listerror;
            // xử lý sản phẩm lỗi đã được update.
            ProductMap update = new ProductMap();
            update.stt = stt;
            update.ten = ten;
            update.trongso = tronngso;
            update.loai = loai;

            // so trùng với correct list và duplicate list
            List<ProductMap> listtam = new List<ProductMap>();
            listtam.Add(update);

            //Duyệt hết list correct
            for (int i = 0; i < listpro.Count; i++)
            {
                // nếu phát hiện trùng
                if (similarity(listpro[i].ten.ToString(), update.ten) >= 0.857)
                {
                    listtam.Add(listpro[i]);
                    listpro.Remove(listpro[i]);
                }
            }

            //Kiểm tra xem list tạm lớn hơn 1 tức là trong correct product có trùng.
            if (listtam.Count > 1)
            {
                listduplicate.Add(listtam);
            }
            // trong correct ko trùng thì bay qua list duplicate tìm trùng.
            else
            {
                int count = 0;
                for (int i = 0; i < listduplicate.Count; i++)
                {
                    if (similarity(listduplicate[i][0].ToString(), update.ten) >= 0.857)
                    {
                        listduplicate[i].Add(update);
                        count++;
                        break;
                    }
                }
                if (count == 0)
                {
                    listpro.Add(update);
                }

            }
            //update listError and listDuplicate
            Session["listpro"] = listpro;
            Session["listduplicate"] = listduplicate;

            return RedirectToAction("Index");
        }