// app/modules/loyalty/static/storefront/js/loyalty-enroll.js
// Self-service loyalty enrollment
const loyaltyEnrollLog = window.LogConfig.loggers.loyaltyEnroll || window.LogConfig.createLogger('loyaltyEnroll');

function customerLoyaltyEnroll() {
    return {
        ...storefrontLayoutData(),

        // Program info
        program: null,

        // Form data
        form: {
            email: '',
            first_name: '',
            last_name: '',
            phone: '',
            birthday: '',
            terms_accepted: false,
            marketing_consent: false
        },

        // State
        loading: false,
        enrolling: false,
        enrolled: false,
        enrolledCard: null,
        error: null,
        showTerms: false,
        termsHtml: null,

        async init() {
            loyaltyEnrollLog.info('Customer loyalty enroll initializing...');
            await this.loadProgram();
            // Load CMS T&C content if a page slug is configured
            if (this.program?.terms_cms_page_slug) {
                this.loadTermsFromCms(this.program.terms_cms_page_slug);
            }
        },

        async loadTermsFromCms(slug) {
            try {
                const response = await apiClient.get(`/storefront/cms/pages/${slug}`);
                if (response?.content_html) {
                    this.termsHtml = response.content_html;
                }
            } catch (e) {
                loyaltyEnrollLog.warn('Could not load CMS T&C page:', e.message);
            }
        },

        async loadProgram() {
            this.loading = true;
            try {
                const response = await apiClient.get('/storefront/loyalty/program');
                if (response) {
                    this.program = response;
                    loyaltyEnrollLog.info('Program loaded:', this.program.display_name);
                }
            } catch (error) {
                if (error.status === 404) {
                    loyaltyEnrollLog.info('No loyalty program available');
                    this.program = null;
                } else {
                    loyaltyEnrollLog.error('Failed to load program:', error);
                    this.error = I18n.t('loyalty.enrollment.errors.load_failed');
                }
            } finally {
                this.loading = false;
            }
        },

        async submitEnrollment() {
            if (!this.form.email || !this.form.first_name || !this.form.terms_accepted) {
                return;
            }

            this.enrolling = true;
            this.error = null;

            try {
                const response = await apiClient.post('/storefront/loyalty/enroll', {
                    email: this.form.email,
                    customer_name: [this.form.first_name, this.form.last_name].filter(Boolean).join(' '),
                    customer_phone: this.form.phone || null,
                    customer_birthday: this.form.birthday || null,
                    marketing_email_consent: this.form.marketing_consent,
                    marketing_sms_consent: this.form.marketing_consent
                });

                if (response) {
                    const cardNumber = response.card?.card_number || response.card_number;
                    loyaltyEnrollLog.info('Enrollment successful:', cardNumber);

                    // Store wallet URLs for the success page (no auth needed)
                    if (response.wallet_urls) {
                        sessionStorage.setItem('loyalty_wallet_urls', JSON.stringify(response.wallet_urls));
                    }

                    // Store enrollment context for the success page
                    sessionStorage.setItem('loyalty_enroll_context', JSON.stringify({
                        already_enrolled: response.already_enrolled || false,
                        allow_cross_location: response.allow_cross_location ?? true,
                        enrolled_at_store_name: response.enrolled_at_store_name || null,
                        merchant_locations: response.merchant_locations || [],
                    }));

                    // Redirect to success page — pass already_enrolled in the
                    // URL so the message survives page refreshes (sessionStorage
                    // is supplementary for the location list).
                    const currentPath = window.location.pathname;
                    const alreadyFlag = response.already_enrolled ? '&already=1' : '';
                    const successUrl = currentPath.replace(/\/join\/?$/, '/join/success') +
                        '?card=' + encodeURIComponent(cardNumber) + alreadyFlag;
                    window.location.href = successUrl;
                }
            } catch (error) {
                loyaltyEnrollLog.error('Enrollment failed:', error);
                if (error.message?.includes('already')) {
                    this.error = I18n.t('loyalty.enrollment.errors.email_exists');
                } else {
                    this.error = error.message || I18n.t('loyalty.enrollment.errors.failed');
                }
            } finally {
                this.enrolling = false;
            }
        }
    };
}
