{"version":3,"file":"index.mjs","sources":["../src/packages/cta-automation/consts.ts","../src/packages/cta-automation/enums.ts","../src/packages/cta-automation/utils/assignCtaScenario/assignCtaScenario.ts","../src/packages/cta-automation/utils/loadDataFromDeeplinkService/loadDataFromDeeplinkService.ts","../src/packages/cta-automation/utils/makeDeepLinkServiceUrl/makeDeepLinkServiceUrl.ts","../src/packages/cta-automation/utils/buildCTA/buildCTA.ts","../src/packages/cta-automation/utils/getIconForDeeplinkKey/getIconForDeeplinkKey.ts","../src/packages/cta-automation/utils/mapResponse/mapResponse.ts","../src/packages/cta-automation/utils/dispatchDeeplinksData/dispatchDeeplinksData.ts","../src/packages/cta-automation/utils/mapDeeplinksResponse/mapDeeplinksResponse.ts","../src/packages/cta-automation/utils/assignDynamicValues/assignDynamicValues.ts","../src/utils/provideDataFromStore/provideDataFromStore.ts","../src/packages/cta-automation/utils/initializeCtaStoreListener/initializeABTestStoreListener.ts","../src/packages/cta-automation/utils/assignCtaScenario/assignABCtaScenario.ts","../src/packages/cta-automation/utils/initialization/initialization.ts","../src/packages/cta-automation/utils/getEnquiryData/getEnquiryData.ts","../src/consts.ts","../src/packages/cta-automation/index.ts","../src/packages/price-automation/consts.ts","../src/packages/price-automation/utils/loadDataFromVmdsService/loadDataFromVmdsService.ts","../src/packages/price-automation/types.ts","../src/packages/price-automation/utils/formatPrice/formatPrice.ts","../src/packages/price-automation/index.ts","../src/packages/price-automation/utils/makeVmdsServiceUrl/makeVmdsServiceUrl.ts","../src/packages/price-automation/utils/formatResponse/formatResponse.ts","../src/index.ts","../src/packages/cta-automation/utils/initializeCtaStoreListener/initializeCtaStoreListener.ts"],"sourcesContent":["export const SERVICE_NAMESPACE = 'cta-automation-service';\nexport const DEEPLINK_MOCK_DATA_STORAGE_KEY = 'cta_service.deeplink_response_mock_data';\nexport const PROD_API_URL = 'https://api.oneweb.mercedes-benz.com';\nexport const CTA_SERVICE_INITIALIZATION_KEY = 'cta_service.is_initialized';\n","export enum DeeplinkKeys {\n  Configurator = 'CONFIGURATOR',\n  OnlineShop = 'ONLINE_SHOP',\n  ProductPage = 'PRODUCT_PAGE',\n  TestDrive = 'TEST_DRIVE',\n  Enquiry = 'ENQUIRY',\n}\n\nexport enum DeeplinkCmsInstance {\n  Publish = 'PUBLISHER',\n  Author = 'AUTHOR',\n}\n\nexport enum CTAKeys {\n  Primary = 'primary',\n  Secondary = 'secondary',\n  Shop = 'shop',\n  Configurator = 'configurator',\n  Info = 'info',\n  CarDrive = 'cardrive',\n  Enquiry = 'enquiry',\n  TestDrive = 'testDrive',\n}\n\nexport enum CtaIcons {\n  Configurator = 'bds/car-config/24',\n  OnlineShop = 'bds/shopping-cart/24',\n  Enquiry = 'bds/pencil-document/24',\n}\n\nexport enum ScenarioKeys {\n  Default = 'default',\n  Alternative = 'alternative',\n}\n\nexport enum DynamicParams {\n  VehicleId = 'vehicleId',\n  ColorGroup = 'colorGroup',\n}\n\nexport enum SubBrands {\n  Default = '',\n  AMG = 'MERCEDES_AMG',\n  Maybach = 'MERCEDES_MAYBACH',\n}\n","import { DeeplinkResponse } from '../../types';\nimport { DeeplinkKeys, ScenarioKeys } from '../../enums';\nimport { initializeLogger } from '@seamless/logger';\nimport { SERVICE_NAMESPACE } from '../../consts';\n\nconst logger = initializeLogger(SERVICE_NAMESPACE);\n\n// All deeplink response scenarios are valid for both use cases, home and PI/PAD\nconst fullScenario = [DeeplinkKeys.Configurator, DeeplinkKeys.OnlineShop];\nconst noShopScenario = [DeeplinkKeys.Configurator];\nconst noCarConfiguratorScenario = [DeeplinkKeys.OnlineShop, DeeplinkKeys.ProductPage];\nconst noShopAndCarConfiguratorScenario = [DeeplinkKeys.ProductPage];\nconst onlyShopScenario = [DeeplinkKeys.OnlineShop];\nconst abTest = [DeeplinkKeys.Enquiry, DeeplinkKeys.TestDrive];\n\nconst validateDeeplinkResponse = (response: DeeplinkResponse, ctaScenario: DeeplinkKeys[]): boolean =>\n  ctaScenario.every((key: DeeplinkKeys) => Object.keys(response).includes(key));\n\nexport const assignCtaScenario = (\n  response: DeeplinkResponse,\n  productPageContext = false,\n  scenario = ScenarioKeys.Default,\n  isAbTest: boolean = false,\n): DeeplinkKeys[] => {\n  switch (true) {\n    case isAbTest:\n      return validateDeeplinkResponse(response, abTest)\n        ? [DeeplinkKeys.TestDrive, DeeplinkKeys.Enquiry]\n        : [DeeplinkKeys.Enquiry];\n    case validateDeeplinkResponse(response, fullScenario):\n      return productPageContext\n        ? assignCTAAlternativeScenario(scenario)\n        : [DeeplinkKeys.OnlineShop, DeeplinkKeys.ProductPage];\n    case validateDeeplinkResponse(response, noShopScenario):\n      return productPageContext\n        ? [DeeplinkKeys.Configurator, DeeplinkKeys.Enquiry]\n        : [DeeplinkKeys.Configurator, DeeplinkKeys.ProductPage];\n    case validateDeeplinkResponse(response, noCarConfiguratorScenario):\n      return productPageContext ? [DeeplinkKeys.OnlineShop] : [DeeplinkKeys.OnlineShop, DeeplinkKeys.ProductPage];\n    case validateDeeplinkResponse(response, noShopAndCarConfiguratorScenario):\n      return productPageContext ? [DeeplinkKeys.Enquiry] : [DeeplinkKeys.ProductPage];\n    case validateDeeplinkResponse(response, onlyShopScenario):\n      return [DeeplinkKeys.OnlineShop, DeeplinkKeys.Enquiry];\n    default:\n      logger.error('No scenario detected for loaded data:', response);\n      return [DeeplinkKeys.Enquiry];\n  }\n};\n\nconst assignCTAAlternativeScenario = (scenario: string): DeeplinkKeys[] => {\n  return scenario === ScenarioKeys.Default\n    ? [DeeplinkKeys.OnlineShop, DeeplinkKeys.Configurator]\n    : [DeeplinkKeys.OnlineShop, DeeplinkKeys.Enquiry];\n};\n","import { initializeLogger } from '@seamless/logger';\nimport { SERVICE_NAMESPACE, DEEPLINK_MOCK_DATA_STORAGE_KEY } from '../../consts';\nimport { DeeplinkResponse } from '../../types';\n\nconst logger = initializeLogger(SERVICE_NAMESPACE);\n\n// Data mocking is designed for QA to make sure all the scenarios are covered.\n// In the time of developing the CTA service, not all scenarios are returned from deep link service,\n// which means we need to provide a possibility to test every specific case.\nconst getMockData = (): DeeplinkResponse | undefined => {\n  try {\n    const storedMockData = localStorage.getItem(DEEPLINK_MOCK_DATA_STORAGE_KEY);\n    if (storedMockData) {\n      const mockData = JSON.parse(storedMockData) as DeeplinkResponse;\n      logger.log(\n        'Skipping sending request to the deeplink service and using mock data from the local storage:',\n        mockData,\n      );\n      return mockData;\n    }\n  } catch (error: any) {\n    logger.error('An error occurred during injecting deep link data from the local storage:', error.message);\n  }\n};\n\nexport const loadDataFromDeeplinkService = async (url: string): Promise<DeeplinkResponse | undefined> => {\n  const mockData = getMockData();\n  if (mockData) {\n    return mockData;\n  }\n\n  try {\n    logger.log(`Sending request to ${url}`);\n    const response = await fetch(url);\n    const data = await response.json();\n    if (response.ok) {\n      return data;\n    }\n  } catch (error) {\n    logger.error('Error caused during processing request to deep link service');\n  }\n};\n","import { DeeplinkUrlParams } from '../../types';\nimport { DeeplinkCmsInstance, SubBrands } from '../../enums';\n\nexport const makeDeepLinkServiceUrl = (\n  apiUrl: string,\n  { runMode, country, language, modelSeries, subBrands, engineConcept }: DeeplinkUrlParams,\n): string => {\n  const cmsInstance = runMode === 'AUTHOR' ? DeeplinkCmsInstance.Author : DeeplinkCmsInstance.Publish;\n  const searchParams = new URLSearchParams([\n    ...(subBrands || []).map((subBrand: string) => ['subBrands', subBrand]),\n    ['cmsInstance', cmsInstance],\n    ...(engineConcept === 'PLUGIN_HYBRID' && subBrands.includes(SubBrands.AMG)\n      ? [['engineConcept', engineConcept]]\n      : []), // adding engineConcept only when subbrands is AMG AND value is PLUGIN_HYBRID, because deeplinks does not support any other engineConcepts\n  ]);\n  // the option of a formatted country below was added due to Antarctica not having CTAs visible. In that case it was aligned to replace it with Germany.\n  const formattedCountry = country === 'AQ' ? 'DE' : country;\n  return `${apiUrl}/vehicle-deeplinks-api/v1/deeplinks/${formattedCountry}/${language}/model-series/${modelSeries}?${searchParams}`;\n};\n","import { DeeplinkKeys } from '../../enums';\nimport { DeeplinkUrlBase } from '../../types';\nimport { getIconForDeeplinkKey } from '../getIconForDeeplinkKey/getIconForDeeplinkKey';\n\nexport const buildCTA = (deeplinkData: DeeplinkUrlBase | undefined, deeplinkKey: DeeplinkKeys): any => {\n  const icon = getIconForDeeplinkKey(deeplinkKey);\n\n  return {\n    ...deeplinkData,\n    type: deeplinkKey,\n    baseUrl: deeplinkData?.url,\n    icon,\n  };\n};\n","import { DeeplinkKeys, CtaIcons } from '../../enums';\n\nexport const getIconForDeeplinkKey = (deeplinkKey: DeeplinkKeys): string => {\n  switch (deeplinkKey) {\n    case DeeplinkKeys.OnlineShop:\n      return CtaIcons.OnlineShop;\n    case DeeplinkKeys.Configurator:\n      return CtaIcons.Configurator;\n    case DeeplinkKeys.Enquiry:\n      return CtaIcons.Enquiry;\n    default:\n      return '';\n  }\n};\n","import { CTAFormatted, DeeplinkResponse } from '../../types';\nimport { CTAKeys, DeeplinkKeys } from '../../enums';\nimport { buildCTA } from '../buildCTA/buildCTA';\nimport { CTAData } from '@dh-io-globalelem/vehicle-data-store-connection';\n\ntype MapResponseInput = DeeplinkResponse | CTAData;\n\nconst toCamel = (str: string) =>\n  str.toLowerCase().replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n\nexport const mapResponse = (input: MapResponseInput, ...deepLinkKeys: DeeplinkKeys[]): CTAFormatted | undefined => {\n  const ctaKeys = [\n    CTAKeys.Primary,\n    CTAKeys.Secondary,\n    CTAKeys.Shop,\n    CTAKeys.Configurator,\n    CTAKeys.Info,\n    CTAKeys.TestDrive,\n    CTAKeys.Enquiry,\n  ];\n\n  if (!deepLinkKeys.length) {\n    return;\n  }\n\n    return deepLinkKeys.reduce((ctaConfig, deepLinkKey, index) => {\n    const ctaKey = ctaKeys[index];\n\n    const camelKey = toCamel(deepLinkKey);\n    const lowerKey = deepLinkKey.toLowerCase();\n    const ctaData =\n      (input as Record<string, any>)[deepLinkKey] ??\n      (input as Record<string, any>)[camelKey] ??\n      (input as Record<string, any>)[lowerKey];\n  \n    if (ctaKey && ctaData) {\n      const ctaWithType = buildCTA(ctaData, deepLinkKey);\n      ctaConfig[ctaKey] = ctaWithType;\n    }\n\n    return ctaConfig;\n  }, {} as CTAFormatted);\n};","import { mapDeeplinksResponse } from '../mapDeeplinksResponse/mapDeeplinksResponse';\nimport { DeeplinkResponse } from '../../types';\nimport { getConnectionVehicleDataDispatchers } from '@dh-io-globalelem/vehicle-data-store-connection';\n\nexport const dispatchDeeplinksData = async (data: DeeplinkResponse) => {\n  const deeplinksData = mapDeeplinksResponse(data);\n\n  const dispatchers = await getConnectionVehicleDataDispatchers();\n  dispatchers.setCta(deeplinksData);\n};\n","import { DeeplinkResponse, CTAFormatted } from '../../types';\nimport { CTAEntry } from '@dh-io-globalelem/vehicle-data-store-connection';\nimport { DeeplinkKeys } from '../../enums';\nimport { buildCTA } from '../buildCTA/buildCTA';\n\nexport const mapDeeplinksResponse = (data: DeeplinkResponse): CTAFormatted => {\n  const mappedCtas: { [key: string]: CTAEntry } = {} as CTAFormatted;\n\n  for (const key in DeeplinkKeys) {\n    const deeplinkKey = DeeplinkKeys[key as keyof typeof DeeplinkKeys];\n\n    if (data[deeplinkKey]) {\n      const cta = buildCTA(data[deeplinkKey], deeplinkKey);\n      const currentKey = deeplinkKey.toLowerCase();\n\n      mappedCtas[currentKey] = cta;\n    }\n  }\n  return mappedCtas as CTAFormatted;\n};\n","import { DeeplinkKeys, DynamicParams } from '../../enums';\nimport { CTAData, CTAKeys } from '@dh-io-globalelem/vehicle-data-store-connection';\n\n/**\n * Here we encapsulate all the mapping logic for the dynamic params.\n * The key of the object will be the deep link type\n * The value is an array of tuples containing the name:\n * - the parameter we receive from the setConfigurationId\n * - the query parameter we should set on the url\n */\nconst paramsToDeepLink: Partial<Record<DeeplinkKeys, [optionName: DynamicParams, paramName: string][]>> = {\n  [DeeplinkKeys.Configurator]: [[DynamicParams.VehicleId, 'vehicleId']],\n  [DeeplinkKeys.OnlineShop]: [[DynamicParams.ColorGroup, 'emhcolor']],\n}\n\nexport const assignDynamicValues = (ctaData: CTAData, configurationIds?: string | Record<string, string>): CTAData => {\n  const updatedCTAData: CTAData = { ...ctaData };\n\n  // treat a plain string as the vehicleId for backwards compatibility\n  if (!configurationIds || (typeof configurationIds === 'object' && Object.keys(configurationIds).length === 0)) {\n    return updatedCTAData;\n  }\n\n  const configMap: Record<string, string> =\n    typeof configurationIds === 'string' ? { [DynamicParams.VehicleId]: configurationIds } : configurationIds;\n\n  Object.keys(updatedCTAData).forEach((key) => {\n    const ctaItem = updatedCTAData[key as CTAKeys];\n    if (!ctaItem) return;\n\n    const dynamicOptions = paramsToDeepLink[ctaItem.type as DeeplinkKeys];\n    if (!dynamicOptions) return;\n\n    let url = ctaItem.baseUrl;\n    for (const [opt, param] of dynamicOptions) {\n      if (!configMap[opt]) continue;\n      url = appendURLParam(url, param, configMap[opt]);\n    }\n\n    updatedCTAData[key as CTAKeys] = { ...ctaItem, url };\n  });\n\n  return updatedCTAData;\n};\n\nconst appendURLParam = (baseUrl: string, paramName: string, paramValue: string): string => {\n  const url = new URL(baseUrl);\n\n  if (url.hash) {\n    appendURLParamToHash(url, paramName, paramValue);\n  } else {\n    url.searchParams.set(paramName, paramValue);\n  }\n\n  return url.toString();\n};\n\nconst appendURLParamToHash = (url: URL, paramName: string, paramValue: string): void => {\n  const existingParams = url.hash.indexOf('?') > -1 ? url.hash.substring(url.hash.lastIndexOf('?') + 1) : '';\n  const queryParams = new URLSearchParams(existingParams);\n\n  queryParams.set(paramName, paramValue);\n  url.hash = `${url.hash.replace(`?${existingParams}`, '')}?${queryParams.toString()}`;\n};\n","import { initializeStore } from '@seamless/store';\nimport {\n  connectionName as vehicleDataConnectionName,\n  ConnectionVehicleDataState,\n} from '@dh-io-globalelem/vehicle-data-store-connection';\n\nimport { subscribe } from '@seamless/one-context';\nimport type {\n  PageEnvironmentConnectionState,\n  PageEnvironmentVariables,\n  EnvironmentVariables,\n} from '@seamless/one-context';\n\ntype ABTestingConnectionState = Record<string, unknown>;\n\nconst nameOfTenant = 'globalelem';\nconst ABTEST_PARAM = 'abtest-new_cta_print';\nconst ABTEST_PARAM_VALUE = 'target';\n\nexport const getPageEnvironmentState = async (\n  componentName: string,\n  tenantName?: string,\n): Promise<PageEnvironmentVariables> => {\n  return new Promise((resolve) => {\n    const tenant = tenantName ?? nameOfTenant;\n    subscribe<PageEnvironmentConnectionState>('PageConnection', {\n      tenant,\n      componentName,\n      callback: (state: PageEnvironmentConnectionState) => {\n        resolve(state.pageEnvironmentVariables);\n      },\n    });\n  });\n};\n\nexport const getPageEnvironmentVariables = async (\n  componentName: string,\n  tenantName?: string,\n): Promise<EnvironmentVariables> => {\n  return new Promise((resolve) => {\n    const tenant = tenantName ?? nameOfTenant;\n    subscribe<PageEnvironmentConnectionState>('PageConnection', {\n      tenant,\n      componentName,\n      callback: (state: PageEnvironmentConnectionState) => {\n        resolve(state.environmentVariables);\n      },\n    });\n  });\n};\n\nexport const getVehicleDataStoreState = (): Promise<ConnectionVehicleDataState> =>\n  new Promise((resolve) => {\n    const store = initializeStore();\n    store.subscribe(vehicleDataConnectionName, resolve);\n  });\n\nexport const subscribeToVehicleDataByConfigurationId = (\n  callback: (state: ConnectionVehicleDataState) => void,\n): void => {\n  const store = initializeStore();\n  let previousConfigurationId: string | Record<string, string> | undefined;\n\n  store.subscribe(vehicleDataConnectionName, (state) => {\n    const currentConfigurationId = state.configurationId;\n\n    if (currentConfigurationId && currentConfigurationId !== previousConfigurationId) {\n      previousConfigurationId = currentConfigurationId;\n      callback(state);\n    }\n  });\n};\n\nexport const doesExistABTestUrlParam = (): boolean => {\n  const params = new URLSearchParams(window.location.search);\n  const abTestParam = params.get(ABTEST_PARAM);\n  return abTestParam === ABTEST_PARAM_VALUE;\n};\n\nexport const subscribeToABTestingState = (\n  componentName: string,\n  callback: (isTarget: boolean) => void,\n  tenantName?: string,\n): void => {\n  const tenant = tenantName ?? nameOfTenant;\n  const abTestParameterName = ABTEST_PARAM;\n\n  subscribe<ABTestingConnectionState>('ABTestingConnection', {\n    tenant,\n    componentName,\n    callback: (state) => {\n      callback(state[abTestParameterName] === ABTEST_PARAM_VALUE);\n    },\n  });\n};\n","import { subscribeToABTestingState } from '../../../../utils';\nimport { getVehicleDataStoreState } from '../../../../utils/provideDataFromStore/provideDataFromStore';\nimport { assignABCtaScenario } from '../../utils/assignCtaScenario/assignABCtaScenario';\nimport { mapResponse } from '../../utils/mapResponse/mapResponse';\nimport { getConnectionVehicleDataDispatchers } from '@dh-io-globalelem/vehicle-data-store-connection';\nimport { initializeLogger } from '@seamless/logger';\nimport { SERVICE_NAMESPACE } from './../../consts';\n\nconst logger = initializeLogger(SERVICE_NAMESPACE);\n\nexport const initializeABTestStoreListener = async (): Promise<void> => {\n  subscribeToABTestingState(SERVICE_NAMESPACE, async (isTarget) => {\n    if (isTarget) {\n      const { cta = {}, modelSeries } = await getVehicleDataStoreState();\n      const scenario = assignABCtaScenario(cta);\n      const mappedCtas = mapResponse(cta, ...scenario);\n\n      if (cta?.enquiry?.url === '#') {\n        logger.log(`Skipping A/B test because enquiry URL is not set for ${modelSeries}.`);\n        return;\n      } else if (mappedCtas) {\n        const dispatchers = await getConnectionVehicleDataDispatchers();\n        dispatchers.setCta(mappedCtas);\n\n        logger.log(`A/B Testing buttons for ${modelSeries} have been added to the store:`, mappedCtas);\n      }\n    }\n  });\n};\n","import { DeeplinkKeys } from '../../enums';\nimport { CTAData } from '@dh-io-globalelem/vehicle-data-store-connection';\n\nexport const assignABCtaScenario = (\n  ctaData: CTAData,\n): DeeplinkKeys[] => {\n  if (ctaData.test_drive) {\n    return [DeeplinkKeys.Enquiry, DeeplinkKeys.TestDrive];\n  }\n  return [DeeplinkKeys.Enquiry];\n};\n","import { CTA_SERVICE_INITIALIZATION_KEY } from '../../consts';\n\nexport const isCTAServiceInitialized = () => {\n  const flag = sessionStorage.getItem(CTA_SERVICE_INITIALIZATION_KEY);\n  return flag === 'true';\n};\n\nexport const setInitializationFlag = (flag: boolean) => {\n  sessionStorage.setItem(CTA_SERVICE_INITIALIZATION_KEY, String(flag));\n};\n","import { getEnquiryFallbackLabel } from '@dh-io-globalelem/phrase-translations';\nimport { DeeplinkUrlBase } from '../../types';\nimport { CTAEntry } from '@dh-io-globalelem/vehicle-data-store-connection';\n\nfunction getFormAnchor(): string | undefined {\n  if (typeof window === 'undefined' || typeof document === 'undefined') {\n    return '#'; // Return a default anchor if not in a browser environment to support open in modal functionality on cta-wc\n  }\n  let form = document.querySelector('aemf-form-container');\n\n  if (!form) {\n    // Try alternative selector if custom element does not exist check for PI-SPA and check if it has a form, return generic #contact anchor\n    form = document.querySelector('[data-component-name*=\"owpi-spa\"]');\n    const componentId = form?.getAttribute('component-id');\n    const componentData = (window.top?.aemNamespace as any)?.componentData;\n    if (componentId) {\n      const hasSpaFormActivated = Boolean(\n        componentData?.[componentId]?.payload.hideContactForm && componentData?.[componentId]?.payload.formId,\n      );\n      if (hasSpaFormActivated) return '#contact';\n    }\n  }\n\n  if (form) {\n    let anchorHash = form.getAttribute('data-anchor-id');\n    if (!anchorHash) {\n      anchorHash = `form-anchor-${crypto.randomUUID ? crypto.randomUUID() : Date.now()}`;\n      form.setAttribute('data-anchor-id', anchorHash);\n    }\n    return `#${anchorHash}`;\n  }\n  return undefined;\n}\n\nexport const getEnquiryData = async (\n  enquiry?: CTAEntry | DeeplinkUrlBase | undefined,\n): Promise<DeeplinkUrlBase | undefined> => {\n  let url = enquiry?.url;\n  //1.) Check if a form is present and if so, use the anchor from it\n  if (!url) {\n    url = getFormAnchor();\n  }\n\n  return {\n    url,\n    label: await getEnquiryFallbackLabel(),\n  };\n};\n","export const PRODUCT_PAGE_TEMPLATE = 'generic-product-template';\n","import { initializeLogger } from '@seamless/logger';\nimport { getConnectionVehicleDataDispatchers, CTAData } from '@dh-io-globalelem/vehicle-data-store-connection';\nimport { SERVICE_NAMESPACE, PROD_API_URL } from './consts';\nimport { LoadCTAConfigurationFunction } from './types';\nimport { DeeplinkKeys } from './enums';\nimport {\n  assignCtaScenario,\n  loadDataFromDeeplinkService,\n  mapResponse,\n  makeDeepLinkServiceUrl,\n  assignDynamicValues,\n  dispatchDeeplinksData,\n} from './utils';\nimport { doesExistABTestUrlParam, getPageEnvironmentState, getVehicleDataStoreState } from '../../utils';\nimport { isCTAServiceInitialized, setInitializationFlag } from './utils/initialization/initialization';\nimport { getEnquiryData } from './utils/getEnquiryData/getEnquiryData';\nimport { PRODUCT_PAGE_TEMPLATE } from '../../consts';\nimport { assignABCtaScenario } from './utils/index';\n\nconst logger = initializeLogger(SERVICE_NAMESPACE);\n\n//AESISU-877 - pointing API call always to PROD - incase of an improvement on lower environments remove this const and get the apiUrl from the AEM store\nconst apiUri = PROD_API_URL;\n\nexport const initializeCtaAutomationService = async (): Promise<void> => {\n  // reset the initialization flag\n  setInitializationFlag(false);\n  const { country, language, templateName } = await getPageEnvironmentState(SERVICE_NAMESPACE);\n  const { modelSeries, subBrands, cta = {}, engineConcept } = await getVehicleDataStoreState();\n  try {\n    const { enquiry } = cta;\n    let data;\n\n    if (templateName !== PRODUCT_PAGE_TEMPLATE) {\n      logger.log('Skipping CTA service initialization outside of product page.');\n      return;\n    }\n    if (isCTAServiceInitialized()) {\n      logger.log('CTA service is already initialized');\n      return;\n    }\n    errorHandler(!apiUri || !modelSeries, 'No apiUri or modelSeries found, skipping CTA service initialization');\n    errorHandler(!enquiry, `No enquiry configuration loaded for ${modelSeries}`);\n\n    setInitializationFlag(true);\n\n    const deepLinkUrl = makeDeepLinkServiceUrl(apiUri, {\n      runMode: 'PUBLISH',\n      country,\n      language,\n      modelSeries,\n      subBrands,\n      engineConcept,\n    });\n\n    data = await loadDataFromDeeplinkService(deepLinkUrl);\n    if (!data) {\n      logger.error(`No data loaded from deep link service for ${modelSeries}.`);\n    } else {\n      logger.log(`Data for ${modelSeries} has been loaded:`, data);\n    }\n\n    data = {\n      ...data,\n      [DeeplinkKeys.Enquiry]: await getEnquiryData(enquiry),\n    };\n\n    dispatchDeeplinksData(data);\n\n    // Because of store late response, mostly due to cookie consent\n    // We are checking if abTest Parameter exist in url, act act based on this.\n    const isABTestParamPresent = doesExistABTestUrlParam();\n    const scenario = assignCtaScenario(data, true, cta.scenario, isABTestParamPresent);\n    logger.log(\n      `Mapping buttons for the following scenario${isABTestParamPresent ? ' (A/B test mapping active)' : ''}:`,\n      scenario,\n    );\n\n    const mappedCtas = mapResponse(data, ...scenario);\n    if (mappedCtas) {\n      const dispatchers = await getConnectionVehicleDataDispatchers();\n      dispatchers.setCta(mappedCtas);\n\n      logger.log(`Buttons for ${modelSeries} have been added to the store:`, mappedCtas);\n    }\n  } catch (error) {\n    logger.error(error);\n  }\n};\n\nconst errorHandler = (condition: boolean, message: string) => {\n  if (condition) {\n    logger.error(message);\n  }\n};\n\nexport const loadCtaConfiguration: LoadCTAConfigurationFunction = async (\n  modelSeries,\n  subBrands = [],\n  enquiryCta?,\n  CTAscenario?,\n  configurationId?,\n  engineConcept = '',\n) => {\n  const { country, language, runMode } = await getPageEnvironmentState(SERVICE_NAMESPACE);\n\n  const deepLinkUrl = makeDeepLinkServiceUrl(apiUri, {\n    runMode,\n    country,\n    language,\n    modelSeries,\n    subBrands,\n    engineConcept,\n  });\n  let data;\n  let formattedCtas: CTAData | undefined = undefined;\n\n  try {\n    data = await loadDataFromDeeplinkService(deepLinkUrl);\n\n    if (data) {\n      logger.log(`Data for ${modelSeries} has been loaded:`, data);\n    } else {\n      logger.error(`No data loaded from deep link service for ${modelSeries}.`);\n    }\n  } catch (error: any) {\n    logger.error(error.message);\n  } finally {\n    data = {\n      ...data,\n    };\n\n    data[DeeplinkKeys.Enquiry] = await getEnquiryData(enquiryCta);\n    const isABTestParamPresent = doesExistABTestUrlParam();\n    const scenario = assignCtaScenario(data, false, CTAscenario, isABTestParamPresent);\n\n    logger.log('Mapping buttons for the following scenario:', scenario);\n\n    const mappedCtas = mapResponse(data, ...scenario);\n\n    if (mappedCtas) {\n      formattedCtas = assignDynamicValues(mappedCtas, configurationId);\n      logger.log(`Buttons for ${modelSeries} have been mapped:`, formattedCtas);\n    }\n  }\n\n  return formattedCtas;\n};\n","export const SERVICE_NAMESPACE = 'price-automation-service';\nexport const VMDS_ENDPOINT_URL = '/vmds-highlights-api/v1/highlights/';\n","import { initializeLogger } from '@seamless/logger';\nimport { SERVICE_NAMESPACE } from '../../consts';\nimport { VmdsResponse } from '../../types';\n\nconst logger = initializeLogger(SERVICE_NAMESPACE);\n\nexport const loadDataFromVmdsService = async (url: string): Promise<VmdsResponse | undefined> => {\n  try {\n    logger.log(`Sending request to ${url}`);\n    const response = await fetch(url);\n    const data = await response.json();\n    if (response.ok) {\n      return data;\n    }\n  } catch (error) {\n    throw Error('Error caused during processing request to VMDS service');\n  }\n};\n","import { ConnectionVehicleDataState } from '@dh-io-globalelem/vehicle-data-store-connection';\n\nexport type VmdsUrlParams = {\n  country: string;\n  language: string;\n} & Pick<ConnectionVehicleDataState, 'modelSeries' | 'subBrands' | 'engineConcept'>;\n\n  export type formatPriceParams = {\n    country: string;\n    language: string;\n  } & Pick<ConnectionResponse, 'min' | 'max' | 'unit'>;\n\nexport enum VmdsHighlightKeys {\n  Price = 'PRICE',\n}\n\nexport interface VmdsHighlightValue {\n  min: number;\n  max: number;\n  unit: string;\n  footnoteI18nKey?: string;\n}\n\nexport interface VmdsResponse {\n  highlights: {\n    [key in VmdsHighlightKeys]: VmdsHighlightValue;\n  };\n  i18n: {\n    [key: string]: string;\n  };\n}\n\nexport interface ConnectionResponse {\n  max: string;\n  min: string;\n  unit: string;\n  pricePrefixLabel: string;\n  priceFootnoteLabel?: string;\n}\n\nexport type LoadPriceDataFunction = (\n  modelSeries: string,\n  engineConcept: string,\n  subBrands?: ConnectionVehicleDataState['subBrands'],\n) => Promise<ConnectionResponse | undefined>;\n","import { formatPriceParams } from '../../types';\nimport { formatToMarketSpecificCurrency, SupportedLocale } from '@workbench/core';\n/**\n *\n * @param params object which passes 'min', 'max', 'unit' from price\n * and 'language', 'country' from store response in order to set local properly.\n * @param minOrMax 'min' or 'max' -\n * defining which price property do we need to format and return.\n * @returns formatted price string, for example: 123.456,79 €\n */\nexport const formatPrice = (params: formatPriceParams, minOrMax: string): string => {\n  const countryAndLanguage = `${params.language}-${params.country}` as SupportedLocale;\n  const priceToFormat = Number(minOrMax === 'min' ? params.min : params.max);\n  const formattedPrice: string = formatToMarketSpecificCurrency(priceToFormat, countryAndLanguage);\n  return formattedPrice;\n};\n","import { initializeLogger } from '@seamless/logger';\nimport { SERVICE_NAMESPACE } from './consts';\nimport { getPageEnvironmentState, getVehicleDataStoreState } from '../../utils';\nimport { loadDataFromVmdsService, makeVmdsServiceUrl, formatResponse } from './utils';\nimport { getConnectionVehicleDataDispatchers } from '@dh-io-globalelem/vehicle-data-store-connection';\nimport { LoadPriceDataFunction } from './types';\nimport { PRODUCT_PAGE_TEMPLATE } from '../../consts';\n\nconst logger = initializeLogger(SERVICE_NAMESPACE);\n\nexport const initializePriceAutomationService = async (): Promise<void> => {\n  const { modelSeries, engineConcept, subBrands } = await getVehicleDataStoreState();\n  const priceData = await loadPriceData(modelSeries, engineConcept, subBrands);\n  if (priceData) {\n    const dispatchers = await getConnectionVehicleDataDispatchers();\n    dispatchers.setPrice(priceData);\n    logger.log(`Price data for ${modelSeries} have been added to the store:`, priceData);\n  } else {\n    logger.error(`No price data for ${modelSeries} added to the store.`);\n  }\n};\n\nexport const loadPriceData: LoadPriceDataFunction = async (\n  modelSeries: string,\n  engineConcept: string,\n  subBrands = [],\n) => {\n  const { apiUri, country, language, templateName } = await getPageEnvironmentState(SERVICE_NAMESPACE);\n\n  if (templateName !== PRODUCT_PAGE_TEMPLATE) {\n    logger.log('Skipping price automation service initialization outside of product page.');\n    return;\n  }\n  if (!apiUri || !modelSeries) {\n    logger.error('No apiUri or modelSeries found, skipping price service initialization.');\n    return;\n  }\n\n  try {\n    const vmdsServiceUrl = makeVmdsServiceUrl(apiUri, {\n      country,\n      language,\n      modelSeries,\n      engineConcept,\n      subBrands,\n    });\n\n    const data = await loadDataFromVmdsService(vmdsServiceUrl);\n\n    if (!data) {\n      logger.error(`No data loaded from VMDS service for ${modelSeries}.`);\n      return;\n    }\n\n    logger.log(`Data for ${modelSeries} has been loaded:`, data);\n\n    const formattedPrice = formatResponse(data, language, country);\n\n    logger.log(`Formatted price for ${modelSeries} have been returned:`, formattedPrice);\n\n    return formattedPrice;\n  } catch (error: any) {\n    logger.error(error.message);\n  }\n};\n","import { VMDS_ENDPOINT_URL } from '../../consts';\nimport { VmdsUrlParams } from '../../types';\n\nexport const makeVmdsServiceUrl = (\n  apiUrl: string,\n  { country, language, modelSeries, engineConcept, subBrands }: VmdsUrlParams,\n): string => {\n  const url = new URL(`${apiUrl}${VMDS_ENDPOINT_URL}${country}/${language}/${modelSeries}`);\n\n  for (const subBrand of subBrands) {\n    url.searchParams.append('subBrands', subBrand);\n  }\n\n  if (engineConcept) {\n    url.searchParams.append('engineConcept', engineConcept);\n  }\n\n  return url.toString();\n};\n","import { ConnectionResponse, formatPriceParams, VmdsHighlightKeys, VmdsResponse } from '../../types';\nimport { formatPrice } from '../formatPrice/formatPrice';\n\nexport const formatResponse = (data: VmdsResponse, language: string, country: string): ConnectionResponse => {\n  const i18n = data.i18n;\n  const price = data.highlights[VmdsHighlightKeys.Price];\n  const { unit, footnoteI18nKey } = price;\n  const priceParams: formatPriceParams = {\n    min: String(price.min),\n    max: String(price.max),\n    unit: price.unit,\n    language,\n    country,\n  };\n  const min = formatPrice(priceParams, 'min');\n  const max = formatPrice(priceParams, 'max');\n  const response: ConnectionResponse = {\n    unit,\n    min,\n    max,\n    pricePrefixLabel: i18n.PRICE,\n  };\n\n  if (footnoteI18nKey && i18n[footnoteI18nKey]) {\n    response.priceFootnoteLabel = i18n[footnoteI18nKey];\n  }\n\n  return response;\n};\n","import { initializeCtaAutomationService } from './packages/cta-automation';\nimport { initializePriceAutomationService } from './packages/price-automation';\nimport { initializeCtaStoreListener, initializeABTestStoreListener } from './packages/cta-automation/utils';\n\nexport { loadCtaConfiguration } from './packages/cta-automation';\nexport { loadPriceData } from './packages/price-automation';\nexport { CTAFormatted, CTAKeysMap, DeeplinkUrlBaseFormatted } from './packages/cta-automation/types';\nexport { DeeplinkKeys as CTATypes, CtaIcons } from './packages/cta-automation/enums';\nexport * from './utils';\nexport * from './consts';\n\n// Only auto-initialize if running as a script in the browser (not as a module)\nexport const initVCAService = () => {\n  if (typeof window !== 'undefined' && (window as any).ctaAutomationAutoInit !== false) {\n    initializePriceAutomationService();\n\n    initializeCtaAutomationService().then(() => {\n      initializeABTestStoreListener();\n      initializeCtaStoreListener();\n    });\n  }\n};\n\ninitVCAService();\n","import { getVehicleDataStoreState, subscribeToVehicleDataByConfigurationId } from './../../../../utils';\nimport { assignDynamicValues } from './../../utils';\nimport { SERVICE_NAMESPACE } from './../../consts';\nimport { getConnectionVehicleDataDispatchers } from '@dh-io-globalelem/vehicle-data-store-connection';\nimport { initializeLogger } from '@seamless/logger';\n\nexport const initializeCtaStoreListener = async (): Promise<void> => {\n  subscribeToVehicleDataByConfigurationId(async ({ configurationId }) => {\n    const { cta } = await getVehicleDataStoreState();\n    if (configurationId !== undefined && cta) {\n      const ctas = assignDynamicValues(cta, configurationId);\n      const dispatchers = await getConnectionVehicleDataDispatchers();\n      dispatchers.setCta(ctas);\n      const logger = initializeLogger(SERVICE_NAMESPACE);\n      logger.log(`Updated CTAs with configurationID: ${configurationId} added`);\n    }\n  });\n};\n"],"names":["SERVICE_NAMESPACE","CTA_SERVICE_INITIALIZATION_KEY","DeeplinkKeys","DeeplinkCmsInstance","CTAKeys","CtaIcons","ScenarioKeys","DynamicParams","SubBrands","logger","initializeLogger","fullScenario","Configurator","OnlineShop","noShopScenario","noCarConfiguratorScenario","ProductPage","noShopAndCarConfiguratorScenario","onlyShopScenario","abTest","Enquiry","TestDrive","validateDeeplinkResponse","response","ctaScenario","every","key","Object","keys","includes","assignCtaScenario","productPageContext","scenario","Default","isAbTest","assignCTAAlternativeScenario","error","loadDataFromDeeplinkService","async","url","mockData","storedMockData","localStorage","getItem","JSON","parse","log","message","getMockData","fetch","data","json","ok","makeDeepLinkServiceUrl","apiUrl","runMode","country","language","modelSeries","subBrands","engineConcept","cmsInstance","Author","Publish","URLSearchParams","map","subBrand","AMG","buildCTA","deeplinkData","deeplinkKey","icon","getIconForDeeplinkKey","type","baseUrl","mapResponse","input","deepLinkKeys","ctaKeys","Primary","Secondary","Shop","Info","length","reduce","ctaConfig","deepLinkKey","index","ctaKey","camelKey","toLowerCase","replace","_","c","toUpperCase","lowerKey","ctaData","ctaWithType","dispatchDeeplinksData","deeplinksData","mappedCtas","cta","mapDeeplinksResponse","getConnectionVehicleDataDispatchers","setCta","paramsToDeepLink","VehicleId","ColorGroup","assignDynamicValues","configurationIds","updatedCTAData","configMap","forEach","ctaItem","dynamicOptions","opt","param","appendURLParam","paramName","paramValue","URL","hash","appendURLParamToHash","searchParams","set","toString","existingParams","indexOf","substring","lastIndexOf","queryParams","nameOfTenant","ABTEST_PARAM","ABTEST_PARAM_VALUE","getPageEnvironmentState","componentName","tenantName","Promise","resolve","subscribe","tenant","callback","state","pageEnvironmentVariables","getPageEnvironmentVariables","environmentVariables","getVehicleDataStoreState","initializeStore","vehicleDataConnectionName","subscribeToVehicleDataByConfigurationId","previousConfigurationId","currentConfigurationId","configurationId","doesExistABTestUrlParam","window","location","search","get","subscribeToABTestingState","abTestParameterName","initializeABTestStoreListener","isTarget","test_drive","enquiry","setInitializationFlag","flag","sessionStorage","setItem","String","getEnquiryData","document","form","querySelector","componentId","getAttribute","componentData","top","aemNamespace","Boolean","payload","hideContactForm","formId","anchorHash","crypto","randomUUID","Date","now","setAttribute","getFormAnchor","label","getEnquiryFallbackLabel","PRODUCT_PAGE_TEMPLATE","apiUri","initializeCtaAutomationService","templateName","errorHandler","deepLinkUrl","isABTestParamPresent","condition","loadCtaConfiguration","enquiryCta","CTAscenario","formattedCtas","VmdsHighlightKeys","formatPrice","params","minOrMax","countryAndLanguage","priceToFormat","Number","min","max","formatToMarketSpecificCurrency","loadPriceData","vmdsServiceUrl","append","makeVmdsServiceUrl","Error","loadDataFromVmdsService","formattedPrice","i18n","price","highlights","Price","unit","footnoteI18nKey","priceParams","pricePrefixLabel","PRICE","priceFootnoteLabel","formatResponse","initVCAService","ctaAutomationAutoInit","priceData","setPrice","initializePriceAutomationService","then","undefined","ctas","initializeCtaStoreListener"],"mappings":"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"}