{% import 'include/can-read-app-data.twig' as appDataAcl %}

{% if not appDataAcl.canReadAppData() %}
    {% return %}
{% endif %}

{% set criteria = {
    filter: [
        { 'field': 'handlerIdentifier', 'type': 'prefix', 'value': 'app\\ShopwarePayments_' },
        { 'field': 'active', 'type': 'equals', 'value': true },
        { 'field': 'salesChannels.id', 'type': 'equals', 'value': hook.salesChannelContext.salesChannel.id }
    ],
    fields: ['handlerIdentifier'],
} %}

{% set paymentMethods = services.repository.search('payment_method', criteria)|map(e => e.handlerIdentifier) %}
{% set spContextGatewaySupported = version_compare(shopware.version, '6.7.4.0', '>=') %}
{% set spLanguageInfo = null %}

{# Resolve the languages we still need in a single search: the sales channel context's own language (when the
   shop did not provide its languageInfo, i.e. <6.6.10.0) and, on the edit-order page, the order's language —
   which can differ from the current session language. The order's language is then written back onto the order
   so the server derives the experience-context locale from the order itself, not the session context. #}
{% set spLanguageOrder = spOrder|default(hook.page.order) %}
{% set spLanguageInfo = null %}
{% set spLanguageIdsToResolve = [] %}

{% if hook.salesChannelContext.languageInfo is defined and hook.salesChannelContext.languageInfo is not null %}
    {% set spLanguageInfo = {
        name: hook.salesChannelContext.languageInfo.name,
        localeCode: hook.salesChannelContext.languageInfo.localeCode,
    } %}
{% else %}
    {# Language info has not been created by the shop. For version <6.6.10.0 #}
    {% set spLanguageIdsToResolve = spLanguageIdsToResolve|merge([hook.salesChannelContext.languageId]) %}
{% endif %}

{% if spLanguageOrder and spLanguageOrder.languageId and spLanguageOrder.languageId not in spLanguageIdsToResolve %}
    {% set spLanguageIdsToResolve = spLanguageIdsToResolve|merge([spLanguageOrder.languageId]) %}
{% endif %}

{% set spResolvedLanguages = {} %}
{% if spLanguageIdsToResolve is not empty %}
    {% set spLanguages = services.repository.search('language', {
        ids: spLanguageIdsToResolve,
        associations: {
            locale: {},
            translationCode: {},
        },
    }) %}
    {% for spLanguage in spLanguages %}
        {% set spResolvedLanguages = spResolvedLanguages|merge({ (spLanguage.id): spLanguage }) %}
    {% endfor %}
{% endif %}

{% if spLanguageInfo is null %}
    {% set spContextLanguage = spResolvedLanguages[hook.salesChannelContext.languageId] ?? null %}
    {% if spContextLanguage %}
        {% set spContextLocale = spContextLanguage.translationCode ?? spContextLanguage.locale %}
        {% set spLanguageInfo = {
            name: spContextLanguage.translated.name ?? spContextLanguage.name,
            localeCode: spContextLocale ? spContextLocale.code : null,
        } %}
    {% endif %}
{% endif %}

{# Write the resolved language onto the order so the server reads it. #}
{% if spLanguageOrder and spLanguageOrder.languageId and spResolvedLanguages[spLanguageOrder.languageId] is defined %}
    {% do spLanguageOrder.setLanguage(spResolvedLanguages[spLanguageOrder.languageId]) %}
{% endif %}

{% set spCustomer = null %}
{% if hook.salesChannelContext.customer %}
    {% set customer = hook.salesChannelContext.customer %}
    {% set activeBilling = customer.activeBillingAddress %}
    {% set activeShipping = customer.activeShippingAddress %}
    {% set spCustomer = {
        firstName: customer.firstName,
        lastName: customer.lastName,
        email: customer.email,
        activeBillingAddress: {
            firstName: activeBilling.firstName,
            lastName: activeBilling.lastName,
            street: activeBilling.street,
            city: activeBilling.city,
            zipcode: activeBilling.zipCode,
            country: { iso: activeBilling.country.iso },
            additionalAddressLine1: activeBilling.additionalAddressLine1,
            countryState: activeBilling.countryState ? { shortCode: activeBilling.countryState.shortCode } : null,
        },
        activeShippingAddress: {
            firstName: activeShipping.firstName,
            lastName: activeShipping.lastName,
            street: activeShipping.street,
            city: activeShipping.city,
            zipcode: activeShipping.zipCode,
            country: { iso: activeShipping.country.iso },
            additionalAddressLine1: activeShipping.additionalAddressLine1,
            countryState: activeShipping.countryState ? { shortCode: activeShipping.countryState.shortCode } : null,
        },
    } %}
{% endif %}

{% set spSubscription = hook.salesChannelContext.extensions['subscription']
    ?? (hook.salesChannelContext.extensions.subscriptionManagedContexts.all|length > 0) %}

{% set spSalesChannelContext = {
    salesChannel: { id: hook.salesChannelContext.salesChannel.id },
    currency: { isoCode: hook.salesChannelContext.currency.isoCode },
    languageInfo: spLanguageInfo,
    customer: spCustomer,
    subscription: spSubscription,
    shippingLocation: { country: { iso: hook.salesChannelContext.shippingLocation.country.iso } },
} %}

{% do hook.page.addArrayExtension('spApp', {
    baseAppUrl: "https://shopware-payments.services.shopware.io",
    cdnAppUrl: "https://storefront.shopware-payments.services.shopware.io/latest",
    cart: hook.page.cart,
    salesChannelContext: spSalesChannelContext,
    order: spOrder|default(hook.page.order),
    paymentMethods: paymentMethods,
    enabled: paymentMethods is not empty,
    contextGatewaySupported: spContextGatewaySupported,
}) %}
