import Service, {inject as service} from '@ember/service';

export default class MembersUtilsService extends Service {
    @service config;
    @service settings;
    @service feature;
    @service store;

    get isMembersEnabled() {
        return this.settings.get('membersSignupAccess') !== 'none';
    }

    get isStripeEnabled() {
        const stripeDirect = this.config.get('stripeDirect');

        const hasDirectKeys = !!this.settings.get('stripeSecretKey') && !!this.settings.get('stripePublishableKey');
        const hasConnectKeys = !!this.settings.get('stripeConnectSecretKey') && !!this.settings.get('stripeConnectPublishableKey');

        if (stripeDirect) {
            return hasDirectKeys;
        }

        return hasConnectKeys || hasDirectKeys;
    }

    // Button / Icon helpers ---------------------------------------------------

    get defaultButtonIcons() {
        return [
            {
                icon: 'portal-icon-1',
                value: 'icon-1'
            },
            {
                icon: 'portal-icon-2',
                value: 'icon-2'
            },
            {
                icon: 'portal-icon-3',
                value: 'icon-3'
            },
            {
                icon: 'portal-icon-4',
                value: 'icon-4'
            },
            {
                icon: 'portal-icon-5',
                value: 'icon-5'
            }
        ];
    }

    get defaultIconKeys() {
        return this.defaultButtonIcons.map(buttonIcon => buttonIcon.value);
    }

    get buttonIcon() {
        return this.settings.get('portalButtonIcon') || this.defaultIconKeys[0];
    }

    // Plan helpers ------------------------------------------------------------

    get isFreeChecked() {
        const allowedPlans = this.settings.get('portalPlans') || [];
        return !!(this.settings.get('membersSignupAccess') === 'all' && allowedPlans.includes('free'));
    }

    get isMonthlyChecked() {
        const allowedPlans = this.settings.get('portalPlans') || [];
        return !!(this.isStripeConfigured && allowedPlans.includes('monthly'));
    }

    get isYearlyChecked() {
        const allowedPlans = this.settings.get('portalPlans') || [];
        return !!(this.isStripeConfigured && allowedPlans.includes('yearly'));
    }

    // Portal preview ----------------------------------------------------------

    getPortalPreviewUrl(overrides) {
        let {
            disableBackground = false,
            page = 'signup',
            button = this.settings.get('portalButton'),
            buttonIcon = this.buttonIcon,
            isFreeChecked = this.isFreeChecked,
            isMonthlyChecked = this.isMonthlyChecked,
            isYearlyChecked = this.isYearlyChecked,
            monthlyPrice,
            yearlyPrice,
            portalPlans = this.settings.get('portalPlans'),
            portalProducts,
            currency,
            membersSignupAccess = this.settings.get('membersSignupAccess')
        } = overrides;

        const tiers = this.store.peekAll('product') || [];

        portalProducts = portalProducts || tiers.filter((t) => {
            return t.visibility === 'public' && t.type === 'paid';
        }).map(t => t.id);

        const baseUrl = this.config.get('blogUrl');
        const portalBase = '/#/portal/preview';
        const settingsParam = new URLSearchParams();
        const signupButtonText = this.settings.get('portalButtonSignupText') || '';
        const allowSelfSignup = membersSignupAccess === 'all' && (!this.isStripeEnabled || isFreeChecked);

        settingsParam.append('button', button);
        settingsParam.append('name', this.settings.get('portalName'));
        settingsParam.append('isFree', isFreeChecked);
        settingsParam.append('isMonthly', isMonthlyChecked);
        settingsParam.append('isYearly', isYearlyChecked);
        settingsParam.append('page', page);
        settingsParam.append('buttonIcon', encodeURIComponent(buttonIcon));
        settingsParam.append('signupButtonText', encodeURIComponent(signupButtonText));
        settingsParam.append('membersSignupAccess', membersSignupAccess);
        settingsParam.append('allowSelfSignup', allowSelfSignup);

        if (portalPlans) {
            settingsParam.append('portalPrices', encodeURIComponent(portalPlans));
        }

        if (portalProducts && this.feature.get('multipleProducts')) {
            settingsParam.append('portalProducts', encodeURIComponent(portalProducts));
        }

        if (this.settings.get('accentColor') === '' || this.settings.get('accentColor')) {
            settingsParam.append('accentColor', encodeURIComponent(`${this.settings.get('accentColor')}`));
        }
        if (this.settings.get('portalButtonStyle')) {
            settingsParam.append('buttonStyle', encodeURIComponent(this.settings.get('portalButtonStyle')));
        }

        if (monthlyPrice) {
            settingsParam.append('monthlyPrice', monthlyPrice);
        }
        if (yearlyPrice) {
            settingsParam.append('yearlyPrice', yearlyPrice);
        }
        if (currency) {
            settingsParam.append('currency', currency);
        }

        if (disableBackground) {
            settingsParam.append('disableBackground', true);
        }

        return `${baseUrl}${portalBase}?${settingsParam.toString()}`;
    }

    getOfferPortalPreviewUrl(overrides) {
        const {
            disableBackground = false,
            name,
            code,
            displayTitle = '',
            displayDescription = '',
            type,
            cadence,
            amount = 0,
            duration,
            durationInMonths,
            currency = 'usd',
            status,
            tierId
        } = overrides;

        const baseUrl = this.config.get('blogUrl');
        const portalBase = '/#/portal/preview/offer';
        const settingsParam = new URLSearchParams();

        settingsParam.append('name', encodeURIComponent(name));
        settingsParam.append('code', encodeURIComponent(code));
        settingsParam.append('display_title', encodeURIComponent(displayTitle));
        settingsParam.append('display_description', encodeURIComponent(displayDescription));
        settingsParam.append('type', encodeURIComponent(type));
        settingsParam.append('cadence', encodeURIComponent(cadence));
        settingsParam.append('amount', encodeURIComponent(amount));
        settingsParam.append('duration', encodeURIComponent(duration));
        settingsParam.append('duration_in_months', encodeURIComponent(durationInMonths));
        settingsParam.append('currency', encodeURIComponent(currency));
        settingsParam.append('status', encodeURIComponent(status));
        settingsParam.append('tier_id', encodeURIComponent(tierId));

        if (disableBackground) {
            settingsParam.append('disableBackground', 'true');
        }

        return `${baseUrl}${portalBase}?${settingsParam.toString()}`;
    }
}
