"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const actions_core_1 = require("@segment/actions-core");
const ga4_types_1 = require("../ga4-types");
const ga4_functions_1 = require("../ga4-functions");
const ga4_properties_1 = require("../ga4-properties");
const action = {
    title: 'Add Payment Info',
    description: 'Send event when a user submits their payment information',
    defaultSubscription: 'type = "track" and event = "Payment Info Entered"',
    fields: {
        data_stream_type: { ...ga4_properties_1.data_stream_type },
        app_instance_id: { ...ga4_properties_1.app_instance_id },
        client_id: { ...ga4_properties_1.client_id },
        user_id: { ...ga4_properties_1.user_id },
        timestamp_micros: { ...ga4_properties_1.timestamp_micros },
        currency: { ...ga4_properties_1.currency },
        value: { ...ga4_properties_1.value },
        coupon: { ...ga4_properties_1.coupon },
        payment_type: { ...ga4_properties_1.payment_type },
        items: {
            ...ga4_properties_1.items_multi_products,
            required: true
        },
        user_properties: ga4_properties_1.user_properties,
        engagement_time_msec: ga4_properties_1.engagement_time_msec,
        params: ga4_properties_1.params,
        ad_user_data_consent: ga4_properties_1.ad_user_data_consent,
        ad_personalization_consent: ga4_properties_1.ad_personalization_consent
    },
    perform: (request, { payload, settings }) => {
        const data_stream_type = payload.data_stream_type ?? ga4_types_1.DataStreamType.Web;
        const stream_params = data_stream_type === ga4_types_1.DataStreamType.MobileApp
            ? (0, ga4_functions_1.getMobileStreamParams)(settings.apiSecret, settings.firebaseAppId, payload.app_instance_id)
            : (0, ga4_functions_1.getWebStreamParams)(settings.apiSecret, settings.measurementId, payload.client_id);
        if (payload.items && !payload.items.length) {
            throw new actions_core_1.PayloadValidationError('Google requires one or more products in add_payment_info events.');
        }
        if (payload.currency) {
            (0, ga4_functions_1.verifyCurrency)(payload.currency);
        }
        if (payload.value && payload.currency === undefined) {
            throw new actions_core_1.PayloadValidationError('Currency is required if value is set.');
        }
        if (payload.currency === undefined && payload.items[0].currency === undefined) {
            throw new actions_core_1.PayloadValidationError('One of item-level currency or top-level currency is required.');
        }
        let googleItems = [];
        if (payload.items) {
            googleItems = payload.items.map((product) => {
                if (product.item_name === undefined && product.item_id === undefined) {
                    throw new actions_core_1.PayloadValidationError('One of product name or product id is required for product or impression data.');
                }
                if (product.currency) {
                    (0, ga4_functions_1.verifyCurrency)(product.currency);
                }
                return product;
            });
        }
        (0, ga4_functions_1.verifyParams)(payload.params);
        (0, ga4_functions_1.verifyUserProps)(payload.user_properties);
        const request_object = {
            ...stream_params.identifier,
            user_id: payload.user_id,
            events: [
                {
                    name: 'add_payment_info',
                    params: {
                        currency: payload.currency,
                        value: payload.value,
                        coupon: payload.coupon,
                        payment_type: payload.payment_type,
                        items: googleItems,
                        engagement_time_msec: payload.engagement_time_msec,
                        ...payload.params
                    }
                }
            ],
            ...(0, ga4_properties_1.formatUserProperties)(payload.user_properties),
            timestamp_micros: (0, ga4_functions_1.convertTimestamp)(payload.timestamp_micros),
            ...(0, ga4_functions_1.formatConsent)({
                ad_personalization_consent: payload.ad_personalization_consent,
                ad_user_data_consent: payload.ad_user_data_consent
            })
        };
        return (0, ga4_functions_1.sendData)(request, stream_params.search_params, request_object);
    }
};
exports.default = action;
//# sourceMappingURL=index.js.map