
import {
	I18N_SOURCE_LANGUAGE, I18N_STORE,
	OSR_ROOT
	} from './config'

import { IOptions as IOptionsI18n } from '@plastichub/osr-i18n/types'

import { CONFIG_DEFAULT } from '@plastichub/osr-cli-commons'

import { translateDeepL, getTranslation, translate } from '@plastichub/osr-i18n/lib/translate'
import { sync as read } from '@plastichub/fs/read'
import { sync as write } from '@plastichub/fs/write'

import { sanitize } from '@plastichub/osr-i18n/_cli'

import { createHash } from 'crypto'

const removeNonPrintableCharacters = (text: string): string => text.replace(/[^\x20-\x7E]/g, '')

export const clean = (text: string = "") => text.trim()
export const hash = (text: string) => createHash('md5').update(clean(text)).digest('base64')

export const store = (storePath: string, text: string, file: string = '') => {
	const _hash: string = hash(text)
	const store = read(storePath, 'json') || {}
	store[_hash] = clean(text)
	write(storePath, store)
}

export const translateText = async (text: string, srcLang: string, dstLang: string, storePath: string) => {
	if (text.length === 0) {
		return ''
	}
	if (srcLang === dstLang) {
		store(storePath, text)
		return
	}
	const config: any = CONFIG_DEFAULT()
	text = clean(text)
	const _hash: string = hash(text)
	const db = read(storePath, 'json') || {}
	if (db[text]) {
		return db[text]
	}
	const out = await translateDeepL(
		text,
		srcLang,
		dstLang,
		{
			...config.deepl
		}, {

	}, "")

	const translation = getTranslation((out as any), false)

	if (translation) {
		db[text] = translation
		write(storePath, db)
		return translation
	}
}

export const translateString = (str: string, srcLang: string, dstLanguage: string) => {

	const translateProductAssets = async () => {
		const config: any = CONFIG_DEFAULT()
		if (dstLanguage === I18N_SOURCE_LANGUAGE) {
			return
		}
		const i18nOptions: IOptionsI18n = {
			srcLang: I18N_SOURCE_LANGUAGE,
			dstLang: dstLanguage,
			store: I18N_STORE(OSR_ROOT(), dstLanguage),
			noCache: true,
			api_key: config.deepl.auth_key,
			logLevel: 'warn'
		}
		const ret = await translate(sanitize(i18nOptions) as any)
		return ret
	}
}
