/**
 * Feature Definitions
 * 機能定義の一元管理
 */

import { isPro } from '../utils/is-pro';

/**
 * 機能定義
 * 各機能のtier（free/pro）と制限を定義
 */
export const FEATURES = {
	// カルーセルブロック関連
	carousel_slides: {
		name: 'スライド数',
		tier: 'free',
		limit: 3, // 無料版: 3枚まで
		proLimit: Infinity, // Pro版: 無制限
		description: '無料版は3枚まで、Pro版は無制限',
	},
	carousel_autoplay: {
		name: '自動再生',
		tier: 'pro',
		description: 'スライドの自動再生機能',
	},
	carousel_animations: {
		name: 'カスタムアニメーション',
		tier: 'pro',
		options: [ 'fade', 'slide', 'zoom', 'flip', 'cube', '3d-flow' ],
		description: '高度なアニメーション効果',
	},
	carousel_lazy_load: {
		name: '遅延読み込み',
		tier: 'pro',
		description: '画像の遅延読み込みによるパフォーマンス最適化',
	},
	carousel_navigation: {
		name: 'ナビゲーション',
		tier: 'free',
		options: {
			free: [ 'arrows', 'dots' ],
			pro: [ 'arrows', 'dots', 'thumbnails', 'progress', 'fraction' ],
		},
		description: 'Pro版では高度なナビゲーションが利用可能',
	},

	// 今後追加される機能の例
	// advanced_typography: {
	//     name: '高度なタイポグラフィ',
	//     tier: 'pro',
	//     description: 'カスタムフォント、行間、字間の詳細設定',
	// },
	// custom_css: {
	//     name: 'カスタムCSS',
	//     tier: 'pro',
	//     description: 'ブロックごとのカスタムCSS',
	// },
	// dynamic_content: {
	//     name: '動的コンテンツ',
	//     tier: 'pro',
	//     description: 'カスタムフィールドからの動的コンテンツ表示',
	// },
};

/**
 * 機能が利用可能かチェック
 * @param {string} featureName 機能名
 * @return {boolean}
 */
export function isFeatureAvailable( featureName ) {
	const feature = FEATURES[ featureName ];

	// 未定義の機能は許可
	if ( ! feature ) {
		return true;
	}

	// 無料版機能は常に利用可能
	if ( feature.tier === 'free' ) {
		return true;
	}

	// Pro版機能はライセンスチェック
	if ( feature.tier === 'pro' ) {
		return isPro();
	}

	return true;
}

/**
 * 機能の制限値を取得
 * @param {string} featureName 機能名
 * @return {number|null}
 */
export function getFeatureLimit( featureName ) {
	const feature = FEATURES[ featureName ];

	if ( ! feature || ! feature.limit ) {
		return null;
	}

	return isPro() ? feature.proLimit : feature.limit;
}

/**
 * 機能のオプションを取得
 * @param {string} featureName 機能名
 * @return {Array|Object|null}
 */
export function getFeatureOptions( featureName ) {
	const feature = FEATURES[ featureName ];

	if ( ! feature || ! feature.options ) {
		return null;
	}

	// シンプルな配列の場合
	if ( Array.isArray( feature.options ) ) {
		return feature.options;
	}

	// free/proで分かれている場合
	if ( typeof feature.options === 'object' && feature.options.free ) {
		return isPro() ? feature.options.pro : feature.options.free;
	}

	return feature.options;
}

/**
 * 機能情報を取得
 * @param {string} featureName 機能名
 * @return {Object|null}
 */
export function getFeatureInfo( featureName ) {
	const feature = FEATURES[ featureName ];

	if ( ! feature ) {
		return null;
	}

	return {
		name: feature.name,
		tier: feature.tier,
		available: isFeatureAvailable( featureName ),
		limit: getFeatureLimit( featureName ),
		options: getFeatureOptions( featureName ),
		description: feature.description,
	};
}

/**
 * すべての機能一覧を取得
 * @param {string} filterTier 'free' | 'pro' | null
 * @return {Array}
 */
export function getAllFeatures( filterTier = null ) {
	const features = Object.entries( FEATURES ).map( ( [ key ] ) => ( {
		key,
		...getFeatureInfo( key ),
	} ) );

	if ( filterTier ) {
		return features.filter( ( f ) => f.tier === filterTier );
	}

	return features;
}

/**
 * Pro版の機能一覧を取得
 * @return {Array}
 */
export function getProFeatures() {
	return getAllFeatures( 'pro' );
}

/**
 * 無料版の機能一覧を取得
 * @return {Array}
 */
export function getFreeFeatures() {
	return getAllFeatures( 'free' );
}

/**
 * 機能が存在するかチェック
 * @param {string} featureName 機能名
 * @return {boolean}
 */
export function featureExists( featureName ) {
	return featureName in FEATURES;
}

// デフォルトエクスポート
export default {
	FEATURES,
	isFeatureAvailable,
	getFeatureLimit,
	getFeatureOptions,
	getFeatureInfo,
	getAllFeatures,
	getProFeatures,
	getFreeFeatures,
	featureExists,
};
