# Commerce / Shopware Store API configuration.
# The existing Commerce and Shopware services stay unchanged; these values only centralize wiring.
parameters:
  retriex.commerce.enabled: true
  retriex.commerce.max_shop_results: '%env(SHOPWARE_STORE_API_MAX_RESULT)%'
  retriex.commerce.shop_timeout: 15
  retriex.commerce.store_api_base_url: '%env(SHOPWARE_STORE_API_BASE_URL)%'
  retriex.commerce.sales_channel_access_key: '%env(SHOPWARE_SALES_CHANNEL_ACCESS_KEY)%'

  retriex.commerce.search_repair.enabled: true
  retriex.commerce.search_repair.max_queries: 2
  retriex.commerce.search_repair.min_primary_results_without_repair: 2

  # Commerce query parser configuration.
  # YAML is the only operative source of truth; PHP must not contain parser defaults.
  retriex.commerce_query.config:
    known_brands:
      - heyl
      - horiba
      - neomeris

    phrases_to_remove:
      - ich suche
      - suche
      - habt ihr
      - gibt es
      - gebe mir
      - gib mir
      - zeige mir
      - welches gerät
      - welche gerät
      - welches modell
      - welches ist besser
      - welches ist am besten
      - alternative
      - alternativen
      - unter anderem
      - u a
      - welche
      - welcher
      - welches
      - welchen
      - sind
      - ist
      - geeignet
      - geeigent
      - verfügbarkeit
      - verfuegbarkeit

    filter_search_tokens:
      - auch
      - noch
      - nochmal
      - zusätzlich
      - dazu
      - davon
      - stattdessen
      - bitte
      - gern
      - gerne
      - zeige
      - zeig
      - such
      - suche
      - finde
      - find
      - mir
      - mal
      - von
      - im
      - in
      - für
      - fuer
      - welche
      - welcher
      - welches
      - welchen
      - sind
      - ist
      - geeignet
      - geeigent
      - verfügbarkeit
      - verfuegbarkeit
      - prüfe
      - pruefe
      - den
      - die
      - das
      - der
      - dem
      - des
      - und
      - oder
      - sowie
      - seine
      - seinen
      - seiner
      - seinem
      - seines
      - siene
      - sienen
      - siener
      - sienem
      - sienes
      - gebe
      - gib
      - nenne
      - nenn
      - preis
      - preise
      - preisen
      - kostet
      - kpstet
      - ksotet
      - kosten
      - ua
      - also
      - gut
      - gute
      - guten
      - guter
      - gutes
      - passen
      - passend

    search_control_tokens:
      - shop
      - store
      - produkt
      - produkte
      - artikel
      - kaufen
      - kaufe
      - bestellen
      - bestelle
      - online

    search_token_corrections:
      siene: seine
      sienen: seinen
      siener: seiner
      sienem: seinem
      sienes: seines
      indicatoren: indikatoren
      schwinnbad: schwimmbad
      schwimbad: schwimmbad
      kpstet: kostet
      ksotet: kostet

    search_token_canonical_map:
      indikatoren: indikator
      indicators: indikator
      indicator: indikator
      reagenzien: reagenz
      reagents: reagenz
      reagent: reagenz
      produkte: produkt

    semantic_shop_search_tokens:
      - indikator
      - indicator
      - reagenz
      - reagent
      - zubehör
      - zubehor
      - ersatzteil
      - anschlusskabel
      - kabel
      - sensorkabel
      - elektrodenkabel
      - verbrauchsmaterial
      - chemie
      - indikatorchemie
      - reagenzchemie
      - kit
      - set
      - filter
      - pumpe
      - pumpenkopf
      - motorblock
      - lösung
      - loesung
      - solution
      - teststreifen
      - gerät
      - geraet
      - messgerät
      - messgeraet
      - analysegerät
      - analysegeraet
      - analysator
      - monitor
      - controller
      - system

    normalization:
      search: ['€']
      replace: [' euro ']

    text:
      trim_characters:
        - space
        - tab
        - lf
        - cr
        - nul
        - vertical_tab
        - '-'
        - '.'
        - ','

    limits:
      min_search_token_length: 1
      min_direct_product_token_length: 1
      direct_product_max_tokens: 4
      model_context_token_window: 4
      min_meaningful_alpha_token_length: 2
      max_shop_search_tokens: 6

    patterns:
      history_context: 'chat|auch|noch|nochmal|zusätzlich|dazu|davon|stattdessen|alternative|alternativen|größer|groesser|kleiner|gleich(?:e|en|er|es)?|derselbe|dieselbe|dasselbe|wie oben|wie zuvor|wie gehabt'
      history_context_value_template: '/\b({fragment})\b/u'
      prompt_sanitize: '/[^\p{L}\p{N}\s.,\-]/u'
      whitespace_collapse: '/\s+/u'
      whitespace_split: '/\s+/u'
      history_question: '/^Question:\s*(.+)$/m'
      price_between: '/\bzwischen\s+(\d+(?:[.,]\d+)?)\s+und\s+(\d+(?:[.,]\d+)?)\s+euro\b/u'
      price_max: '/\b(?:unter|bis|max(?:imal)?)\s+(\d+(?:[.,]\d+)?)\s+euro\b/u'
      price_min: '/\b(?:ab|mindestens|min)\s+(\d+(?:[.,]\d+)?)\s+euro\b/u'
      price_removal_between: '/\bzwischen\s+\d+(?:[.,]\d+)?\s+und\s+\d+(?:[.,]\d+)?\s*euro\b/u'
      price_removal_minmax: '/\b(?:unter|bis|max(?:imal)?|ab|mindestens|min)\s+\d+(?:[.,]\d+)?\s*euro\b/u'
      price_removal_intent_template: '/\b(?:{price_pattern})\b/u'
      direct_product_digit: '/\d/u'
      model_like: '/\b[a-zäöüß][a-zäöüß®\-]*(?:\s+[a-zäöüß][a-zäöüß®\-]*){0,2}\s+\d{2,5}[a-z0-9\-]*\b/u'
      accessory_like: '/\b(?:indikator|indicator|reagenz|reagent|kit|set)\s+\d{1,5}[a-z0-9\-]*\b/u'
      contains_digit: '/\d/u'
      model_number_token: '/^(?:\d{2,5}[a-z0-9\-]*|[a-z]{1,6}\d{1,5}[a-z0-9\-]*)$/u'
      model_context_token: '/^[\p{L}][\p{L}0-9®\-]{2,}$/u'
      model_suffix_token: '/^[a-z]{1,4}\d{0,3}$/u'
      instruction_or_presentation_token: '/^(?:zeig(?:e)?|such(?:e)?|find(?:e)?|gib|gebe|nenn(?:e)?|liefer(?:e)?|erstelle?|mach(?:e)?|brauch(?:e)?|will|möchte|moechte|hätte|haette|kannst|bitte|mal|alle|alles|komplett|vollständig|vollstaendig|gesamt|ganze|ganzen|liste|listung|auflistung|tabelle|tabellarisch|übersicht|uebersicht|anzeigen?|ausgeben?|darstellen?|antwort(?:e)?|erklär(?:e)?|erklaer(?:e)?|info|infos|informationen|dazu|hierzu|damit|davon|an|als|mit|ohne|inkl|inklusive|also|gut|gute|guten|guter|gutes|passend|passen)$/u'
      measurement_value_token: '/^\d+[.,]\d+$/u'
      exact_token_removal_template: '/\b{token}\b/u'
      brand_part_of_model_template: '/\b{brand}\s+\d{2,5}[a-z0-9\-]*\b/u'

  # Commerce reference resolver configuration.
  # YAML is the only operative source of truth for conversation product and focus-term patterns.
  retriex.commerce_reference_resolver.config:
    conversation_product_patterns:
      - '/\b(Testomat\s+2000\s+THCL)\b/ui'
      - '/\b(Testomat\s+808)\b/ui'
      - '/\b(Testomat\s+EVO\s+TH)\b/ui'
      - '/\b(Testomat\s+EVO\s+CALC)\b/ui'
      - '/\b(Testomat\s+ECO\s+PLUS)\b/ui'
      - '/\b(Testomat\s+ECO\s+C)\b/ui'
      - '/\b(Testomat\s+ECO)\b/ui'
      - '/\b(Testomat\s+LAB\s+CL)\b/ui'
      - '/\b(Testomat\s+LAB\s+MONO)\b/ui'
      - '/\b(Testomat\s+2000)\b/ui'

    focus_term_patterns:
      indikator: '/\bindikator(?:en)?\b/u'
      indikatoren: '/\bindikator(?:en)?\b/u'
      reagenz: '/\breagenz(?:ien)?\b/u'
      reagenzien: '/\breagenz(?:ien)?\b/u'
      zubehör: '/\bzubeh[oö]r\b/u'
      ersatzteil: '/\bersatzteile?\b/u'
      ersatzteile: '/\bersatzteile?\b/u'
      service-set: '/\bservice(?:\s|-)?set\b/u'
      filter: '/\bfilter\b/u'
      pumpenkopf: '/\bpumpenkopf\b/u'
      motorblock: '/\bmotorblock\b/u'
      mehrwertpaket: '/\bmehrwertpaket\b/u'
      neotecmaster: '/\bneotecmaster\b/u'

  # Shop matching and presentation configuration.
  # YAML is the only operative source of truth; PHP must not contain shop matching defaults.
  retriex.shop_matching.config:
    top_product_log_limit: 3

    # Shop role and focus lists are resolved from config/retriex/vocabulary.yaml.
    # Direct list overrides may still be added to this parameter if a project needs them.
    vocabulary_views:
      device_focus_keywords: shop.device_focus
      accessory_focus_keywords: shop.accessory_focus
      device_query_keywords: shop.device_query
      accessory_query_keywords: shop.accessory_query
      accessory_product_keywords: shop.accessory_product
      device_product_keywords: shop.device_product

    vocabulary_maps:
      accessory_focus_variant_map: shop.accessory_focus_variants

    role_guard:
      filter_accessory_products_for_device_queries: true
      keep_ambiguous_products_for_device_queries: true

    scores:
      exact_product_number_phrase: 160
      exact_product_name_phrase: 90
      exact_manufacturer_match: 40
      brand_contained_in_name: 20
      name_token_overlap_weight: 6
      product_number_token_overlap_weight: 10
      corpus_token_overlap_weight: 2
      name_number_overlap_weight: 18
      product_number_number_overlap_weight: 28
      corpus_number_overlap_weight: 8
      size_match: 12
      availability_bonus: 1
      device_query_device_product_bonus: 60
      device_query_accessory_penalty: 120
      accessory_query_accessory_product_bonus: 30
      accessory_query_device_product_bonus: 10

    patterns:
      contains_digit: '/\d/u'
      matching_cleanup: '/[^\p{L}\p{N}]+/u'
      whitespace_collapse: '/\s+/u'
      token_split: '/[^\p{L}\p{N}]+/u'

    padding:
      prefix: ' '
      suffix: ' '

    price:
      normalization_search: ['€', ' ', '.']
      normalization_replace: ['', '', '']
      decimals: 2
      decimal_separator: ','
      thousands_separator: '.'
      suffix: ' €'

    custom_fields:
      primary: migration_Backup_product_attr1
      secondary: migration_Backup_product_attr2
      use_cases: migration_Backup_product_attr4
      languages: migration_Backup_product_attr5

    text:
      primary_secondary_separator: ': '
      use_cases_label: 'Einsatzgebiete: '
      languages_label: 'Sprachen: '
      custom_field_join_separator: ' | '

    description:
      empty_line_pattern: '/^[ \t]*\R/m'
      whitespace_cleanup_pattern: '/[ \t]{2,}/'
      max_length: 1500

    seo:
      relative_prefix: '/'

    highlight:
      available_label: Verfügbar
      unavailable_label: Nicht verfügbar
      product_number_prefix: 'Produktnummer: '

    image:
      missing_placeholder: no-image

    deduplication:
      separator: '|'
