public IMarketRuleResultIntent Apply(Fixture fixture, IMarketStateCollection oldState, IMarketStateCollection newState) { var result = new MarketRuleResultIntent(); if (_includedSports.Contains(newState.Sport.ToLower())) { foreach (var mkt in fixture.Markets) { string type = string.Format("{0}.{1}", newState.Sport, mkt.Type).ToLower(); if (_excludedMarketTypes.Contains(type)) { _Logger.DebugFormat("market rule={0} => {1} of {2} is excluded from rule due its type={3}", Name, mkt, fixture, mkt.Type); continue; } var oldMarketState = oldState != null ? oldState[mkt.Id] : null; var newMarketState = newState[mkt.Id]; if (oldMarketState == null) { //must be a snapshot then if (newMarketState.IsActive) { //create market _Logger.DebugFormat("market rule={0} => {1} of {2} is created", Name, mkt, fixture); result.MarkAsUnRemovable(mkt); } else { //dont create market _Logger.DebugFormat("market rule={0} => {1} of {2} is not created", Name, mkt, fixture); result.MarkAsRemovable(mkt); } } else { if (oldMarketState.HasBeenActive) continue; if (newMarketState.IsActive) { //create Action<Market> editMarketAction = (m => { if (newMarketState.TagsCount == 0) return; foreach (var tagKey in newMarketState.TagKeys) { m.AddOrUpdateTagValue(tagKey, newMarketState.GetTagValue(tagKey)); } foreach (var sel in m.Selections) { var selState = newMarketState[sel.Id]; foreach (var tagKey in selState.TagKeys) { sel.AddOrUpdateTagValue(tagKey, selState.GetTagValue(tagKey)); } } }); var mri = new MarketRuleEditIntent(editMarketAction, MarketRuleEditIntent.OperationType.CHANGE_DATA); _Logger.DebugFormat("market rule={0} => {1} of {2} is created", Name, mkt, fixture); result.EditMarket(mkt, mri); } else { //dont create market _Logger.DebugFormat("market rule={0} => {1} of {2} is not created", Name, mkt, fixture); result.MarkAsRemovable(mkt); } } } } return result; }