package com.applicaster.easytracking.ivw import de.prosiebensat1.easytracking.ETKeys class IVWCodeMapper(private val events: List) { private var lastScreenName: String? = null fun mapScreen(name: String): ApplicasterScreen { events.forEach { event -> if (event is Screen && event.name != null && event.code != null) { val regex = Regex(event.name, RegexOption.IGNORE_CASE) if (regex.matches(name.toLowerCase())) { //config event name regexp matches screen name if (isNotMatchTrackOnceRule(lastScreenName, event, regex)) { val params = mapOf(KEY_MARKETING_CATEGORY to event.code) lastScreenName = name return ApplicasterScreen(name, params, event) } else lastScreenName = name return@forEach } } } lastScreenName = name return ApplicasterScreen(name, mapOf(), null) } private fun isNotMatchTrackOnceRule(lastScreenName: String?, event: Screen, currentScreenRegex: Regex): Boolean { return (event.trackOnce == null) || (event.trackOnce == false) || (event.trackOnce == true && lastScreenName != null && !currentScreenRegex.matches(lastScreenName.toLowerCase())) } fun mapAction(name: String, params : MutableMap): ApplicasterEvent { events.forEach { event -> if (event is Action && event.name != null && event.code != null) { event.sourceEventNames.forEach { supportedScreen -> val screenRegex = Regex(supportedScreen, RegexOption.IGNORE_CASE) val currentScreen = lastScreenName if (currentScreen != null && screenRegex.matches(currentScreen.toLowerCase())) { val actionRegex = Regex(event.name, RegexOption.IGNORE_CASE) if (actionRegex.matches(name)) { params[KEY_MARKETING_CATEGORY] = event.code ETKeys return ApplicasterEvent(name, params) } else return@forEach } else return@forEach } } } return ApplicasterEvent(name, params) } data class ApplicasterEvent(val name: String, val params : Map) data class ApplicasterScreen(val name: String, val params : Map, val ivwScreenConfig: Screen?) companion object { const val KEY_MARKETING_CATEGORY = "marketingCategory" } }