const BufferB = require('buffer/').Buffer
import { base58 } from 'ethers/lib/utils'

const compress = (str: string): string => {
	return base58.encode(BufferB.from(str, 'utf8'))
}

const decompress = (str: string): string => {
	return BufferB.from(base58.decode(str)).toString('utf8')
}

// Join Unique Keys With Fast Zip Hash and a solid simple separator
export const uniqueKeyJoin = (keys: string[]): string => {
	const preProcessedKeys = keys.map((key) => {
		return key.replace('|x', '|:x')
	})
	const joinedKeys = preProcessedKeys.join('|x')
	return compress(joinedKeys)
}

// undo the above operation and return the keys after unzip and split
export const uniqueKeySplit = (uniqueKey: string): string[] => {
	try {
		const unzipped = decompress(uniqueKey)
		const split = unzipped.split('|x')
		const postProcessedKeys = split.map((key) => {
			return key.replace('|:x', '|x')
		})
		return postProcessedKeys
	} catch (e) {
		throw new Error(
			`uniqueKeySplit Error: Are u sure this is a valid uniqueKey? ${uniqueKey}`,
		)
	}
}

export const getUniqueStrategyReference = (
	chain: string,
	contractAddress: string,
	creatorAddress: string,
	strategyKey: string,
): string => {
	return uniqueKeyJoin([chain, contractAddress, creatorAddress, strategyKey])
}

export const decomposeUniqueStrategyReference = (
	uniqueStrategyReference: string,
): {
	chain: string
	contractAddress: string
	creatorAddress: string
	strategyKey: string
} => {
	const decomposed = uniqueKeySplit(uniqueStrategyReference)
	if (decomposed[1] === undefined) {
		throw new Error(
			'decomposeUniqueStrategyReference Error: Are u sure this is a valid uniqueStrategyReference? ' +
				uniqueStrategyReference,
		)
	}
	return {
		chain: decomposed[0],
		contractAddress: decomposed[1],
		creatorAddress: decomposed[2],
		strategyKey: decomposed[3],
	}
}
