public async Task <IActionResult> PlaceBackOffer([FromBody] List <OfferDto> offer)
        {
            double laibelty = 0.00;

            foreach (var item in offer)
            {
                laibelty = laibelty + item.Stake;
            }
            if (await _OfferService.CheckLaiaabilty(laibelty, offer[0].UserId) == false)
            {
                return(BadRequest("you don't have enough cash to place this bet"));
            }
            else
            {
                await _accountService.TakeFromBalance(offer[0].UserId, laibelty);
            }
            List <List <Bet> > bettoreturn = new List <List <Bet> >();

            foreach (var item in offer)
            {
                item.MarketName = item.MarketName.Replace("%2F", "/");


                var layexsist = await _OfferService.CheckExsitingLaybets(item.Odds, item.MarketName, item.EventId, item.RunnerName);

                if (layexsist != null)
                {
                    var exsist = await _OfferService.GetLayOffer(layexsist);

                    if (exsist.Liquidity != 0)
                    {
                        if (exsist.Liquidity == item.Stake || exsist.Liquidity > item.Stake)
                        {
                            await _OfferService.TakeFromLayLiquidity(exsist.Id, item.Stake);

                            var matchedbet  = _mapper.Map <Bet>(item);
                            var betinvolved = await _OfferService.ManageInvolvedLayBets(exsist.Id, matchedbet);

                            matchedbet.Status         = "Closed";
                            matchedbet.RemainingStake = 0;
                            matchedbet.InStake        = item.Stake;
                            matchedbet.Lalaibelty     = laibelty;
                            matchedbet.Profit         = item.Stake * item.Odds;
                            var bettoadd = await _OfferService.AddToBets(matchedbet);

                            await _BetCSer.addtoCounter(bettoadd.EventId);

                            await _OfferService.AddToLayMatchedbet(exsist.Id, bettoadd);

                            betinvolved.Add(bettoadd);
                            SendNotification(betinvolved, "MatchingBet");
                            bettoreturn.Add(betinvolved);
                        }
                        else if (exsist.Liquidity < item.Stake)
                        {
                            var remainingStake = item.Stake - exsist.Liquidity;
                            var matchedbet     = _mapper.Map <Bet>(item);
                            var betinvolved    = await _OfferService.ManageInvolvedLowLayBets(exsist.Id, matchedbet);

                            matchedbet.InStake        = exsist.Liquidity;
                            matchedbet.RemainingStake = 0;
                            matchedbet.Status         = "Closed";
                            matchedbet.Lalaibelty     = exsist.Liquidity;
                            matchedbet.Profit         = exsist.Liquidity * item.Odds;
                            var bettoadd = await _OfferService.AddToBets(matchedbet);

                            await _BetCSer.addtoCounter(bettoadd.EventId);

                            await _OfferService.AddToLayMatchedbet(exsist.Id, bettoadd);

                            var x = _mapper.Map <BackOffer>(item);
                            x.Liquidity = remainingStake;
                            var newBack = await _OfferService.AddBackOffer(x);

                            var c     = _mapper.Map <Bet>(x);
                            var added = await _OfferService.AddToBets(c);

                            await _BetCSer.addtoCounter(added.EventId);

                            var betbackinvoled = _mapper.Map <InvolvedBackBets>(added);
                            await _OfferService.AddToInvolvedBackBets(newBack.Id, betbackinvoled);

                            betinvolved.Add(matchedbet);
                            SendNotification(betinvolved, "MatchingBet");
                            bettoreturn.Add(betinvolved);
                        }
                    }
                }
                var backexsist = await _OfferService.CheckExsitingBackbets(item.Odds, item.MarketName, item.EventId, item.RunnerName);

                if (backexsist != null)
                {
                    List <Bet> backbets = new List <Bet>();
                    await _OfferService.AddToBackLiquidity(backexsist, item.Stake);

                    var backbet = _mapper.Map <Bet>(item);
                    backbets.Add(backbet);
                    var added = await _OfferService.AddToBets(backbet);

                    await _BetCSer.addtoCounter(added.EventId);

                    var involved = _mapper.Map <InvolvedBackBets>(added);
                    involved.Status = "open";
                    await _OfferService.AddToInvolvedBackBets(backexsist, involved);

                    SendNotification(backbets, "New Bet Accepted and waiting for matching");
                    bettoreturn.Add(backbets);
                }
                if (layexsist == null && backexsist == null)
                {
                    List <Bet> newbackbet = new List <Bet>();
                    var        betoffer   = _mapper.Map <BackOffer>(item);
                    var        backoffer  = await _OfferService.AddBackOffer(betoffer);

                    var bet = _mapper.Map <Bet>(betoffer);
                    newbackbet.Add(bet);
                    var added2 = await _OfferService.AddToBets(bet);

                    await _BetCSer.addtoCounter(added2.EventId);

                    var betlayinvoled = _mapper.Map <InvolvedBackBets>(added2);
                    await _OfferService.AddToInvolvedBackBets(backoffer.Id, betlayinvoled);

                    SendNotification(newbackbet, "New Bet Accepted and waiting for matching");
                    bettoreturn.Add(newbackbet);
                }
            }

            return(Ok(bettoreturn));
        }