
// convertCurrencies provides functions to converting between different currencies
// Currency rate data is sourced from the network parameters. The admin(s) update the rates manually.

package convertCurrencies

// All currency rates use 1 kilogram of gold as the exchange pair
// The crypto/gold rates are used to calculate identity scores, so the parameters must contain historical gold rates.
// The parameters do not contain historical fiat rates.
// Fiat is only used to display message/profile/report funding costs and user income/wealth in a user's currency

// Each networkType has its own parameters, and thus its own currency exchange rates.
// The currency exchange rates might be updated less often for test networks than for Mainnet.

import "seekia/internal/helpers"

import "errors"

//TODO: Complete package
// Each function will get its data from the getParameters package
// We have to consider if we should replace kilograms/grams with a better unit (milligrams?)

func CheckIfExchangeRatesAreDownloaded(networkType byte)(bool, error){

	//TODO

	return true, nil
}

// Converts cryptocurrency atomic units to whole units
// For example, an Ethereum atomic unit is called Wei and a whole unit is called an Ether
func ConvertCryptocurrencyAtomicUnitsToWholeUnits(cryptocurrencyName string, inputAtomicUnits int64)(float64, error){

	if (cryptocurrencyName == "Ethereum"){

		// 1 Ether = 10^18 Wei = 1,000,000,000,000,000,000

		ethereumAmount := float64(inputAtomicUnits) / float64(1000000000000000000)

		return ethereumAmount, nil

	} else if (cryptocurrencyName == "Cardano"){

		// 1 ADA = 1,000,000 Lovelace

		cardanoAmount := float64(inputAtomicUnits) / float64(1000000)

		return cardanoAmount, nil
	}

	return 0, errors.New("ConvertCryptocurrencyAtomicUnitsToWholeUnits called with invalid cryptocurrencyName: " + cryptocurrencyName)
}

//Outputs:
//	-bool: Parameters exist
//	-float64: Output Currency units
//	-error
func ConvertCryptoAtomicUnitsToAnyCurrency(networkType byte, inputCryptocurrency string, inputAtomicUnits int64, outputCurrencyCode string)(bool, float64, error){

	isValid := helpers.VerifyNetworkType(networkType)
	if (isValid == false){
		networkTypeString := helpers.ConvertByteToString(networkType)
		return false, 0, errors.New("ConvertCryptoAtomicUnitsToAnyCurrency called with invalid networkType: " + networkTypeString)
	}

	if (inputCryptocurrency != "Ethereum" && inputCryptocurrency != "Cardano"){
		return false, 0, errors.New("ConvertCryptoAtomicUnitsToAnyCurrency called with invalid inputCryptocurrency: " + inputCryptocurrency)
	}

	//TODO

	result := float64(inputAtomicUnits/2)

	return true, result, nil
}

//Outputs:
//	-bool: Parameters exist
//	-float64: Output Cryptocurrency atomic units
//	-error
func ConvertAnyCurrencyToCryptoAtomicUnits(networkType byte, inputCurrencyCode string, inputCurrencyAmount float64, outputCryptocurrency string)(bool, int64, error){
	
	isValid := helpers.VerifyNetworkType(networkType)
	if (isValid == false){
		networkTypeString := helpers.ConvertByteToString(networkType)
		return false, 0, errors.New("ConvertAnyCurrencyToCryptoAtomicUnits called with invalid networkType: " + networkTypeString)
	}

	if (outputCryptocurrency != "Ethereum" && outputCryptocurrency != "Cardano"){
		return false, 0, errors.New("ConvertAnyCurrencyToCryptoAtomicUnits called with invalid outputCryptocurrency: " + outputCryptocurrency)
	}

	//TODO

	result := int64(inputCurrencyAmount*2)

	return true, result, nil
}

// This function will still return a valid amount, even if parameters are missing
// It will use a fallback currency exchange rate, coded within the client
//Outputs:
//	-bool: Parameters exist
//	-float64: Currency value in kilograms of gold
//	-error
func ConvertCurrencyToKilogramsOfGold(networkType byte, inputCurrencyCode string, inputValue float64)(bool, float64, error){

	//TODO

	result := inputValue/3

	return true, result, nil
}

// This function will still return a valid amount, even if parameters are missing
// It will use a fallback currency exchange rate, coded within the client
//Outputs:
//	-bool: Parameters exist
//	-float64: Value in input currency
//	-error:
func ConvertKilogramsOfGoldToAnyCurrency(networkType byte, inputKilogramsAmount float64, outputCurrencyCode string)(bool, float64, error){

	//TODO

	result := inputKilogramsAmount*3000

	return true, result, nil
}

//Outputs:
//	-bool: Parameters exist
//	-float64: Crypto atomic units amount converted to kilograms of gold
//	-error
func ConvertCryptoAtomicUnitsToKilogramsOfGold(networkType byte, inputCryptocurrency string, depositTime int64, cryptoAtomicUnitsAmount int64)(bool, float64, error){

	//TODO
	// This function will use the parameters which contain historical data

	result := float64(cryptoAtomicUnitsAmount/500)

	return true, result, nil
}

//Outputs:
//	-bool: Parameters exist
//	-int64: Input kilograms amount converted to crypto atomic units
//	-error
func ConvertKilogramsOfGoldToCryptoAtomicUnits(networkType byte, inputKilogramsAmount float64, outputCryptocurrency string)(bool, int64, error){

	//TODO

	result := int64(inputKilogramsAmount/1000)	

	return true, result, nil
}




