#include <ccan/array_size/array_size.h>
#include <ccan/mem/mem.h>
#include <common/iso4217.h>

/* Wikipedia leads me to: https://www.currency-iso.org/en/home/tables/table-a1.html

   "List one: Currency, fund and precious metal codes",,,,,
   Published:,,,,,
   "August 29, 2018", ,,,,
   ENTITY,Currency,Alphabetic Code,Numeric Code,Minor unit,Fund
*/
static const struct iso4217_name_and_divisor iso4217[] = {
	{ "AED", 2 },
	{ "AFN", 2 },
	{ "ALL", 2 },
	{ "AMD", 2 },
	{ "ANG", 2 },
	{ "AOA", 2 },
	{ "ARS", 2 },
	{ "AUD", 2 },
	{ "AWG", 2 },
	{ "AZN", 2 },
	{ "BAM", 2 },
	{ "BBD", 2 },
	{ "BDT", 2 },
	{ "BGN", 2 },
	{ "BHD", 3 },
	{ "BIF", 0 },
	{ "BMD", 2 },
	{ "BND", 2 },
	{ "BOB", 2 },
	{ "BOV", 2 },
	{ "BRL", 2 },
	{ "BSD", 2 },
	{ "BTN", 2 },
	{ "BWP", 2 },
	{ "BYN", 2 },
	{ "BZD", 2 },
	{ "CAD", 2 },
	{ "CDF", 2 },
	{ "CHE", 2 },
	{ "CHF", 2 },
	{ "CHW", 2 },
	{ "CLF", 4 },
	{ "CLP", 0 },
	{ "CNY", 2 },
	{ "COP", 2 },
	{ "COU", 2 },
	{ "CRC", 2 },
	{ "CUC", 2 },
	{ "CUP", 2 },
	{ "CVE", 2 },
	{ "CZK", 2 },
	{ "DJF", 0 },
	{ "DKK", 2 },
	{ "DOP", 2 },
	{ "DZD", 2 },
	{ "EGP", 2 },
	{ "ERN", 2 },
	{ "ETB", 2 },
	{ "EUR", 2 },
	{ "FJD", 2 },
	{ "FKP", 2 },
	{ "GBP", 2 },
	{ "GEL", 2 },
	{ "GHS", 2 },
	{ "GIP", 2 },
	{ "GMD", 2 },
	{ "GNF", 0 },
	{ "GTQ", 2 },
	{ "GYD", 2 },
	{ "HKD", 2 },
	{ "HNL", 2 },
	{ "HRK", 2 },
	{ "HTG", 2 },
	{ "HUF", 2 },
	{ "IDR", 2 },
	{ "ILS", 2 },
	{ "INR", 2 },
	{ "IQD", 3 },
	{ "IRR", 2 },
	{ "ISK", 0 },
	{ "JMD", 2 },
	{ "JOD", 3 },
	{ "JPY", 0 },
	{ "KES", 2 },
	{ "KGS", 2 },
	{ "KHR", 2 },
	{ "KMF", 0 },
	{ "KPW", 2 },
	{ "KRW", 0 },
	{ "KWD", 3 },
	{ "KYD", 2 },
	{ "KZT", 2 },
	{ "LAK", 2 },
	{ "LBP", 2 },
	{ "LKR", 2 },
	{ "LRD", 2 },
	{ "LSL", 2 },
	{ "LYD", 3 },
	{ "MAD", 2 },
	{ "MDL", 2 },
	{ "MGA", 2 },
	{ "MKD", 2 },
	{ "MMK", 2 },
	{ "MNT", 2 },
	{ "MOP", 2 },
	{ "MRU", 2 },
	{ "MUR", 2 },
	{ "MVR", 2 },
	{ "MWK", 2 },
	{ "MXN", 2 },
	{ "MXV", 2 },
	{ "MYR", 2 },
	{ "MZN", 2 },
	{ "NAD", 2 },
	{ "NGN", 2 },
	{ "NIO", 2 },
	{ "NOK", 2 },
	{ "NPR", 2 },
	{ "NZD", 2 },
	{ "OMR", 3 },
	{ "PAB", 2 },
	{ "PEN", 2 },
	{ "PGK", 2 },
	{ "PHP", 2 },
	{ "PKR", 2 },
	{ "PLN", 2 },
	{ "PYG", 0 },
	{ "QAR", 2 },
	{ "RON", 2 },
	{ "RSD", 2 },
	{ "RUB", 2 },
	{ "RWF", 0 },
	{ "SAR", 2 },
	{ "SBD", 2 },
	{ "SCR", 2 },
	{ "SDG", 2 },
	{ "SEK", 2 },
	{ "SGD", 2 },
	{ "SHP", 2 },
	{ "SLL", 2 },
	{ "SOS", 2 },
	{ "SRD", 2 },
	{ "SSP", 2 },
	{ "STN", 2 },
	{ "SVC", 2 },
	{ "SYP", 2 },
	{ "SZL", 2 },
	{ "THB", 2 },
	{ "TJS", 2 },
	{ "TMT", 2 },
	{ "TND", 3 },
	{ "TOP", 2 },
	{ "TRY", 2 },
	{ "TTD", 2 },
	{ "TWD", 2 },
	{ "TZS", 2 },
	{ "UAH", 2 },
	{ "UGX", 0 },
	{ "USD", 2 },
	{ "USN", 2 },
	{ "UYI", 0 },
	{ "UYU", 2 },
	{ "UYW", 4 },
	{ "UZS", 2 },
	{ "VES", 2 },
	{ "VND", 0 },
	{ "VUV", 0 },
	{ "WST", 2 },
	{ "XAF", 0 },
	{ "XAG", 0 },
	{ "XAU", 0 },
	{ "XBA", 0 },
	{ "XBB", 0 },
	{ "XBC", 0 },
	{ "XBD", 0 },
	{ "XCD", 2 },
	{ "XDR", 0 },
	{ "XOF", 0 },
	{ "XPD", 0 },
	{ "XPF", 0 },
	{ "XPT", 0 },
	{ "XSU", 0 },
	{ "XTS", 0 },
	{ "XUA", 0 },
	{ "XXX", 0 },
	{ "YER", 2 },
	{ "ZAR", 2 },
	{ "ZMW", 2 },
	{ "ZWL", 2 },
};

const struct iso4217_name_and_divisor *find_iso4217(const utf8 *prefix,
						    size_t len)
{
	for (size_t i = 0; i < ARRAY_SIZE(iso4217); i++) {
		if (memeq(iso4217[i].name, strlen(iso4217[i].name),
			  prefix, len))
			return &iso4217[i];
	}
	return NULL;
}