import {
	JETPACK_REDIRECT_CHECKOUT_TO_WPADMIN,
	TERM_MONTHLY,
	PLAN_MONTHLY_PERIOD,
	TERM_ANNUALLY,
	PLAN_ANNUAL_PERIOD,
	TERM_BIENNIALLY,
	PLAN_BIENNIAL_PERIOD,
	TERM_TRIENNIALLY,
	PLAN_TRIENNIAL_PERIOD,
	TERM_QUADRENNIALLY,
	TERM_QUINQUENNIALLY,
	TERM_SEXENNIALLY,
	PLAN_DECENNIAL_PERIOD,
	PLAN_NOVENNIAL_PERIOD,
	PLAN_OCTENNIAL_PERIOD,
	PLAN_QUADRENNIAL_PERIOD,
	PLAN_QUINQUENNIAL_PERIOD,
	PLAN_SEPTENNIAL_PERIOD,
	PLAN_SEXENNIAL_PERIOD,
	TERM_DECENNIALLY,
	TERM_NOVENNIALLY,
	TERM_OCTENNIALLY,
	TERM_SEPTENNIALLY,
	PLAN_CENTENNIAL_PERIOD,
	TERM_CENTENNIALLY,
} from './constants';
import { BillingTerm } from './types';

export { getPlanSlugForTermVariant } from './get-plan-term-variant';
export { getPlanMultipleTermsVariantSlugs } from './get-plan-multiple-terms-variant-slugs';

/**
 * Return estimated duration of given PLAN_TERM in days
 * @param {string} term TERM_ constant
 * @returns {number} Term duration
 */
export function getTermDuration( term: string ): number | undefined {
	switch ( term ) {
		case TERM_MONTHLY:
			return PLAN_MONTHLY_PERIOD;
		case TERM_ANNUALLY:
			return PLAN_ANNUAL_PERIOD;
		case TERM_BIENNIALLY:
			return PLAN_BIENNIAL_PERIOD;
		case TERM_TRIENNIALLY:
			return PLAN_TRIENNIAL_PERIOD;
		case TERM_QUADRENNIALLY:
			return PLAN_QUADRENNIAL_PERIOD;
		case TERM_QUINQUENNIALLY:
			return PLAN_QUINQUENNIAL_PERIOD;
		case TERM_SEXENNIALLY:
			return PLAN_SEXENNIAL_PERIOD;
		case TERM_SEPTENNIALLY:
			return PLAN_SEPTENNIAL_PERIOD;
		case TERM_OCTENNIALLY:
			return PLAN_OCTENNIAL_PERIOD;
		case TERM_NOVENNIALLY:
			return PLAN_NOVENNIAL_PERIOD;
		case TERM_DECENNIALLY:
			return PLAN_DECENNIAL_PERIOD;
		case TERM_CENTENNIALLY:
			return PLAN_CENTENNIAL_PERIOD;
	}
}

/**
 * Gvien duration in days returnn the PLAN_TERM
 * @param {number} days Term duration in days
 * @returns {string} TERM_ constant
 */
export function getTermFromDuration( days: number ): BillingTerm[ 'term' ] | undefined {
	switch ( days ) {
		case PLAN_MONTHLY_PERIOD:
			return TERM_MONTHLY;
		case PLAN_ANNUAL_PERIOD:
			return TERM_ANNUALLY;
		case PLAN_BIENNIAL_PERIOD:
			return TERM_BIENNIALLY;
		case PLAN_TRIENNIAL_PERIOD:
			return TERM_TRIENNIALLY;
		case PLAN_QUADRENNIAL_PERIOD:
			return TERM_QUADRENNIALLY;
		case PLAN_QUINQUENNIAL_PERIOD:
			return TERM_QUINQUENNIALLY;
		case PLAN_SEXENNIAL_PERIOD:
			return TERM_SEXENNIALLY;
		case PLAN_SEPTENNIAL_PERIOD:
			return TERM_SEPTENNIALLY;
		case PLAN_OCTENNIAL_PERIOD:
			return TERM_OCTENNIALLY;
		case PLAN_NOVENNIAL_PERIOD:
			return TERM_NOVENNIALLY;
		case PLAN_DECENNIAL_PERIOD:
			return TERM_DECENNIALLY;
		case PLAN_CENTENNIAL_PERIOD:
			return TERM_CENTENNIALLY;
	}
}

export const redirectCheckoutToWpAdmin = (): boolean => !! JETPACK_REDIRECT_CHECKOUT_TO_WPADMIN;

/**
 * Given an array of plan Features and an array of Product slugs, it returns which products are
 * included in the plan Features.
 * @param {ReadonlyArray< string >} planFeatures Array of plan Feature slugs
 * @param {ReadonlyArray< string >} products Array of Product slugs
 * @returns {string[]} Array of Product slugs
 */
export const planFeaturesIncludesProducts = (
	planFeatures: ReadonlyArray< string >,
	products: ReadonlyArray< string >
) => {
	return products.some( ( product ) => planFeatures.includes( product ) );
};
