module strconv

const base_digits = '0123456789abcdefghijklmnopqrstuvwxyz'

// format_int returns the string representation of the number n in base `radix`
// for digit values > 10, this function uses the small latin leters a-z.
[direct_array_access; manualfree]
pub fn format_int(n i64, radix int) string {
	unsafe {
		if radix < 2 || radix > 36 {
			panic('invalid radix: $radix . It should be => 2 and <= 36')
		}
		if n == 0 {
			return '0'
		}
		mut n_copy := n
		mut have_minus := false
		if n < 0 {
			have_minus = true
			n_copy = -n_copy
		}
		mut res := ''
		for n_copy != 0 {
			tmp_0 := res
			bdx := int(n_copy % radix)
			tmp_1 := strconv.base_digits[bdx].ascii_str()
			res = tmp_1 + res
			tmp_0.free()
			tmp_1.free()
			// res = base_digits[n_copy % radix].ascii_str() + res
			n_copy /= radix
		}
		if have_minus {
			final_res := '-' + res
			res.free()
			return final_res
		}
		return res
	}
}

// format_uint returns the string representation of the number n in base `radix`
// for digit values > 10, this function uses the small latin leters a-z.
[manualfree]
pub fn format_uint(n u64, radix int) string {
	unsafe {
		if radix < 2 || radix > 36 {
			panic('invalid radix: $radix . It should be => 2 and <= 36')
		}
		if n == 0 {
			return '0'
		}
		mut n_copy := n
		mut res := ''
		uradix := u64(radix)
		for n_copy != 0 {
			tmp_0 := res
			tmp_1 := strconv.base_digits[n_copy % uradix].ascii_str()
			res = tmp_1 + res
			tmp_0.free()
			tmp_1.free()
			// res = base_digits[n_copy % uradix].ascii_str() + res
			n_copy /= uradix
		}
		return res
	}
}