// POST: MasterLC/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        //[HttpPost]
        //[ValidateAntiForgeryToken]
        //public ActionResult Create([Bind(Include = "Id,LCNo,LCDate,LCExpiryDate,PaymentTerm,Tenor,LCReceiveDate,LatestShipmentDate,Quantity,TotalValue,BuyerInfoId,BuyerBankId,IsAuth,OpBy,OpOn,AuthBy,AuthOn")] MasterLCInfoMas masterLCInfoMas)
        //{
        //    if (ModelState.IsValid)
        //    {
        //        db.MasterLCInfoMas.Add(masterLCInfoMas);
        //        db.SaveChanges();
        //        return RedirectToAction("Index");
        //    }

        //    ViewBag.BuyerInfoId = new SelectList(db.BuyerInfo, "Id", "Name", masterLCInfoMas.BuyerInfoId);
        //    return View(masterLCInfoMas);
        //}


        public JsonResult SaveLCInfo(IEnumerable <MasterLCInfoDet> LCMasterDetInfo, IEnumerable <VMMasterLCInfoOrderDet> LCDetailOrderInfo, MasterLCInfoMas LCMasterInfo)
        {
            var result = new
            {
                flag    = false,
                message = "Error occured. !",
                Id      = 0
            };

            try
            {
                var OpDate = DateTime.Now;
                using (var dbContextTransaction = db.Database.BeginTransaction())
                {
                    try
                    {
                        //var LcInfoM = new BuyerOrderMas()
                        //{
                        //    Id = 0,
                        //    OrderRefNo = OrderMas.OrderRefNo,
                        //    OrderDate = OrderMas.OrderDate,
                        //    BuyerInfoId = OrderMas.BuyerInfoId,
                        //    ProdDepartmentId = OrderMas.ProdDepartmentId,
                        //    SeasonInfoId = OrderMas.SeasonInfoId,
                        //    FabSupplierId = OrderMas.FabSupplierId,
                        //    OpBy = 1,
                        //    OpOn = OpDate,
                        //    IsAuth = true,
                        //    IsLocked = false
                        //};

                        LCMasterInfo.OpBy   = 1;
                        LCMasterInfo.OpOn   = OpDate;
                        LCMasterInfo.IsAuth = true;

                        db.MasterLCInfoMas.Add(LCMasterInfo);
                        db.SaveChanges();

                        Dictionary <int, int> dictionary =
                            new Dictionary <int, int>();


                        foreach (var item in LCMasterDetInfo)
                        {
                            //var OrderD = new BuyerOrderDet()
                            //{
                            //    Id = 0,
                            //    BuyerOrderMasId = OrderM.Id,
                            //    ProdCatTypeId = item.ProdCatTypeId,
                            //    StyleNo = item.StyleNo,
                            //    ProdSizeId = item.ProdSizeId,
                            //    ProdColorId = item.ProdColorId,
                            //    FabricItemId = item.FabricItemId,
                            //    SupplierId = item.SupplierId,
                            //    UnitPrice = item.UnitPrice,
                            //    Quantity = item.Quantity,
                            //    ExFactoryDate = item.ExFactoryDate,
                            //    IsLocked = false

                            //};

                            item.MasterLCInfoMasId = LCMasterInfo.Id;
                            db.MasterLCInfoDet.Add(item);
                            db.SaveChanges();

                            //dictionary.Add(item.TempOrderDetId, OrderD.Id);
                            dictionary.Add(item.BuyerOrderMasId, item.Id);
                        }

                        //---- lc order det data

                        //var slno = 1;

                        if (LCDetailOrderInfo != null)
                        {
                            foreach (var item in LCDetailOrderInfo)
                            {
                                var ordetDet = new MasterLCInfoOrderDet()
                                {
                                    Id = item.Id,
                                    MasterLCInfoDetId = dictionary[item.TempMasterLCInfoDetId],
                                    BuyerOrderDetId   = item.BuyerOrderDetId,
                                };

                                //db.Entry(deliv).State = deliv.Id == 0 ?
                                //                            EntityState.Added :
                                //                            EntityState.Modified;

                                db.MasterLCInfoOrderDet.Add(ordetDet);
                                db.SaveChanges();
                            }
                        }



                        dbContextTransaction.Commit();

                        result = new
                        {
                            flag    = true,
                            message = "Saving successful !!",
                            Id      = LCMasterInfo.Id
                        };

                        Success("Record saved successfully.", true);
                    }
                    catch (Exception ex)
                    {
                        dbContextTransaction.Rollback();

                        result = new
                        {
                            flag    = false,
                            message = ex.Message,
                            Id      = 0
                        };
                    }
                }
            }
            catch (Exception ex)
            {
                result = new
                {
                    flag    = false,
                    message = ex.Message,
                    Id      = 0
                };
            }


            return(Json(result, JsonRequestBehavior.AllowGet));
        }
        // POST: MasterLC/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        //[HttpPost]
        //[ValidateAntiForgeryToken]
        //public ActionResult Edit([Bind(Include = "Id,LCNo,LCDate,LCExpiryDate,PaymentTerm,Tenor,LCReceiveDate,LatestShipmentDate,Quantity,TotalValue,BuyerInfoId,BuyerBankId,IsAuth,OpBy,OpOn,AuthBy,AuthOn")] MasterLCInfoMas masterLCInfoMas)
        //{
        //    if (ModelState.IsValid)
        //    {
        //        db.Entry(masterLCInfoMas).State = EntityState.Modified;
        //        db.SaveChanges();
        //        return RedirectToAction("Index");
        //    }
        //    ViewBag.BuyerInfoId = new SelectList(db.BuyerInfo, "Id", "Name", masterLCInfoMas.BuyerInfoId);
        //    return View(masterLCInfoMas);
        //}

        //IEnumerable<VMBuyerOrderDetEdit> OrderDetails, IEnumerable<VMShipmentSummDet> DelivDetails, VMBuyerOrderMasEdit OrderMas, int[] DelItems, int[] DelDelivItems

        public JsonResult UpdateLCInfo(IEnumerable <MasterLCInfoDet> LCMasterDetInfo, IEnumerable <VMMasterLCInfoOrderDet> LCDetailOrderInfo, MasterLCInfoMas LCMasterInfo, int[] DeletedItems, int[] DeletedOrderDetails)
        {
            var result = new
            {
                flag    = false,
                message = "Error occured. !"
            };

            //return Json(result, JsonRequestBehavior.AllowGet);

            try
            {
                var OpDate = DateTime.Now;
                using (var dbContextTransaction = db.Database.BeginTransaction())
                {
                    try
                    {
                        var LcInfoMas = db.MasterLCInfoMas.Find(LCMasterInfo.Id);

                        if (LcInfoMas == null)
                        {
                            result = new
                            {
                                flag    = false,
                                message = "Invalid Id. Saving failed !"
                            };

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

                        /*
                         * Id = lc.lcMas.Id,
                         * LCNo = lc.lcMas.LCNo,
                         * LCDate = lc.lcMas.LCDate ,
                         * LCReceiveDate = lc.lcMas.LCReceiveDate,
                         * LCExpiryDate = lc.lcMas.LCExpiryDate,
                         * BuyerInfoId = lc.lcMas.BuyerInfoId,
                         * BuyerName = lc.buyer.Name,
                         * BuyerBankId = lc.lcMas.BuyerBankId,
                         * LatestShipmentDate = lc.lcMas.LatestShipmentDate,
                         * PaymentTerm = lc.lcMas.PaymentTerm,
                         * Quantity = lc.lcMas.Quantity,
                         * Tenor = lc.lcMas.Tenor,
                         * TotalValue = lc.lcMas.TotalValue
                         */
                        LcInfoMas.LCNo               = LCMasterInfo.LCNo;
                        LcInfoMas.LCDate             = LCMasterInfo.LCDate;
                        LcInfoMas.LCReceiveDate      = LCMasterInfo.LCReceiveDate;
                        LcInfoMas.LCExpiryDate       = LCMasterInfo.LCExpiryDate;
                        LcInfoMas.BuyerBankId        = LCMasterInfo.BuyerBankId;
                        LcInfoMas.LatestShipmentDate = LCMasterInfo.LatestShipmentDate;
                        LcInfoMas.PaymentTerm        = LCMasterInfo.PaymentTerm;
                        LcInfoMas.Quantity           = LCMasterInfo.Quantity;
                        LcInfoMas.Tenor              = LCMasterInfo.Tenor;
                        LcInfoMas.TotalValue         = LCMasterInfo.TotalValue;

                        db.Entry(LcInfoMas).State = EntityState.Modified;
                        db.SaveChanges();

                        //---- Delete MasterLCInfoOrderDet, MasterLCInfoDet

                        if (DeletedOrderDetails != null)
                        {
                            foreach (var item in DeletedOrderDetails)
                            {
                                var orderDets = db.MasterLCInfoOrderDet.Find(item);

                                if (orderDets != null)
                                {
                                    db.MasterLCInfoOrderDet.Remove(orderDets);
                                }
                                db.SaveChanges();
                            }
                        }

                        if (DeletedItems != null)
                        {
                            foreach (var item in DeletedItems)
                            {
                                var orderDets = db.MasterLCInfoOrderDet.Where(x => x.MasterLCInfoDetId == item);

                                if (orderDets != null)
                                {
                                    db.MasterLCInfoOrderDet.RemoveRange(orderDets);
                                }

                                var delLCDet = db.MasterLCInfoDet.Find(item);
                                db.MasterLCInfoDet.Remove(delLCDet);
                                db.SaveChanges();
                            }
                        }


                        // --- Save LC Det

                        // ---- save LC ORder det


                        Dictionary <int, int> dictionary =
                            new Dictionary <int, int>();

                        foreach (var item in LCMasterDetInfo)
                        {
                            item.MasterLCInfoMasId = LCMasterInfo.Id;
                            db.Entry(item).State   = item.Id == 0 ?
                                                     EntityState.Added :
                                                     EntityState.Modified;

                            db.SaveChanges();

                            dictionary.Add(item.BuyerOrderMasId, item.Id);
                        }

                        //var slno = 1;

                        if (LCDetailOrderInfo != null)
                        {
                            foreach (var item in LCDetailOrderInfo)
                            {
                                var ordetDet = new MasterLCInfoOrderDet()
                                {
                                    Id = item.Id,
                                    MasterLCInfoDetId = dictionary[item.TempMasterLCInfoDetId],
                                    BuyerOrderDetId   = item.BuyerOrderDetId,
                                };

                                db.Entry(ordetDet).State = ordetDet.Id == 0 ?
                                                           EntityState.Added :
                                                           EntityState.Modified;

                                //db.MasterLCInfoOrderDet.Add(ordetDet);
                                db.SaveChanges();
                            }
                        }

                        //if (DelivDetails != null)
                        //{
                        //    foreach (var item in DelivDetails)
                        //    {
                        //        var deliv = new ShipmentSummDet()
                        //        {
                        //            Id = item.Id,
                        //            BuyerOrderDetId = item.BuyerOrderDetId == 0 ? dictionary[item.DelivOrderDetTempId] : item.BuyerOrderDetId,
                        //            DelivSlno = slno++,
                        //            ExFactoryDate = item.ExFactoryDate,
                        //            HandoverDate = item.HandoverDate,
                        //            ETD = item.ETD,
                        //            DestinationPortId = item.DestinationPortId,
                        //            DelivQuantity = item.DelivQuantity,
                        //            BuyersPONo = item.BuyersPONo,
                        //            IsLocked = false
                        //        };

                        //        db.Entry(deliv).State = deliv.Id == 0 ?
                        //                                    EntityState.Added :
                        //                                    EntityState.Modified;

                        //        //db.BuyerOrderDets.Add(OrderD);
                        //        db.SaveChanges();

                        //    }
                        //}



                        ////--- delete shipment detail items
                        //if (DelDelivItems != null)
                        //{
                        //    foreach (var item in DelDelivItems)
                        //    {
                        //        var delOrder = db.ShipmentSummDet.Find(item);
                        //        db.ShipmentSummDet.Remove(delOrder);
                        //        db.SaveChanges();
                        //    }
                        //}

                        //---- delete order detail items
                        //if (DelItems != null)
                        //{
                        //    foreach (var item in DelItems)
                        //    {
                        //        //---- if order detail deleted without manual deletion of shipment
                        //        // ---- find those shipment and delete first

                        //        var shipDets = db.ShipmentSummDet.Where(x => x.BuyerOrderDetId == item);

                        //        if (shipDets != null)
                        //        {
                        //            db.ShipmentSummDet.RemoveRange(shipDets);
                        //        }

                        //        var delOrder = db.BuyerOrderDet.Find(item);
                        //        db.BuyerOrderDet.Remove(delOrder);
                        //        db.SaveChanges();
                        //    }
                        //}



                        dbContextTransaction.Commit();

                        result = new
                        {
                            flag    = true,
                            message = "Update successful !!"
                        };

                        Success("Updated successfully.", true);
                    }
                    catch (Exception ex)
                    {
                        dbContextTransaction.Rollback();

                        result = new
                        {
                            flag    = false,
                            message = ex.Message
                        };
                    }
                }
            }
            catch (Exception ex)
            {
                result = new
                {
                    flag    = false,
                    message = ex.Message
                };
            }


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