import { DEVICE_ARRAY } from './Constants';

// タイポグラフィのcssプロパティ毎にデバイス（desktop,tablet,mobile）のデータを週出する.
export function extractTypographyData(source: { [key: string]: string }, properties: string[]) {
	return properties.reduce((result: { [key: string]: { [key in device]: string } }, property: string) => {

		result[property] = { desktop: '', tablet: '', mobile: '' }; // 初期化

		DEVICE_ARRAY.forEach((device: device) => {
			const key = device === 'desktop' ? property : `${device}_${property}`; // 正しいキー名を生成
			if (source.hasOwnProperty(key)) {
				result[property][device] = source[key];
			}
		});
		return result;
	}, {});
}

export function parseCssValue(cssValue: string|number): { value: number | null; unit: string } {
	if (typeof cssValue === 'number') {
		cssValue = cssValue.toString();
	}
	const match = cssValue.match(/^(-?[\d.]+)?([a-z%]+)?$/i);
	// const match = cssValue.match(/^([\d.]+)(px|rem|em|%)$/i);
	if (!match) {
		throw new Error(`Invalid CSS value: ${cssValue}`);
	}

	const [_, value, unit] = match;
	return {
		value: parseFloat(value), // 数値部分を解析
		unit: unit || '-',              // 単位部分
	};
}

// 共通ロジック: unitData を取得
export const getUnitData = (value: any, units: unitData[]): unitData =>
	value?.unit ? units.find((item) => item.value === value.unit) || { value: '' } : { value: '' };

// 値とデフォルトを生成
export const createDeviceValue = (
	device: device,
	parsedValue: any,
	parsedDefaults: any,
	sizeUnits: unitData[]
): { value: RangeControlDeviceValue; default: RangeControlDeviceValue } => {

	const unitData = getUnitData(parsedValue, sizeUnits);

	const defaultUnitData = getUnitData(parsedDefaults, sizeUnits);

	return {
		value: {
			device,
			number: parsedValue?.value,
			unit: unitData.value,
			min: unitData?.min || 0,
			max: unitData?.max || 100,
			step: unitData?.step || 1,
		},
		default: {
			device,
			number: parsedDefaults?.value,
			unit: defaultUnitData.value, // デフォルトにも同じユニットを適用
			min: defaultUnitData?.min || 0,
			max: defaultUnitData?.max || 100,
			step: defaultUnitData?.step || 1,
		},
	};
};


export const parseRangeToArray = (range: string): string[] => {
	if (!range) return [];
	// 入力文字列を ".." で分割
	const rangeWithoutItalic = range.indexOf('italic') !== -1 ? range.replace('italic', '') : range;
	const [start, end] = rangeWithoutItalic.split("..").map(Number);

	// 範囲のチェック
	if (isNaN(start) || isNaN(end) || start > end) {
		return [range];
		// throw new Error("Invalid range format. Make sure it follows '100..900'.");
	}

	// 配列を生成
	const result = [];
	for (let i = start; i <= end; i += 100) {
		result.push(`${i}`); // 数値を文字列として追加
	}

	return result;
}
