# hangul_number.py

from hangulpy.utils import UNITS, NUMBERS

def number_to_hangul(num):
	"""
	주어진 숫자를 한글로 변환합니다.
	
	:param num: 변환할 숫자
	:return: 한글 숫자 문자열
	"""
	if num == 0:
		return "영"
	
	if isinstance(num, float):
		return float_to_hangul(num)
	
	result = ""
	str_num = str(num)[::-1]
	
	for i, digit in enumerate(str_num):
		digit = int(digit)
		if digit != 0:
			if i == 4:
				result = "만" + result
			elif i > 4 and i % 4 == 0:
				result = UNITS[4 * (i // 4)] + result
			part = NUMBERS[digit] + UNITS[i % 4]
			if i % 4 == 0 and digit == 1 and i != 0:
				part = UNITS[i % 4]  # 1은 생략
			result = part + result

	if result.startswith('일'):
		result = result[1:]
	
	return result

def float_to_hangul(num):
	"""
	주어진 소수를 한글로 변환합니다.
	
	:param num: 변환할 소수
	:return: 한글 숫자 문자열
	"""
	int_part, frac_part = str(num).split('.')
	return f"{number_to_hangul(int(int_part))} 점 {''.join(NUMBERS[int(d)] for d in frac_part)}"

def hangul_to_number(hangul):
	"""
	주어진 한글 숫자 문자열을 숫자로 변환합니다.
	
	:param hangul: 변환할 한글 숫자 문자열
	:return: 숫자
	"""
	num_map = {name: value for value, name in enumerate(NUMBERS) if name}
	unit_map = {name: 10**idx for idx, name in enumerate(UNITS) if name}
	num = 0
	tmp = 0
	stack = []
	is_float = False
	float_part = 0
	float_div = 1

	# 소수점 분리
	if '점' in hangul:
		integer_part, fractional_part = hangul.split('점')
	else:
		integer_part, fractional_part = hangul, ''

	# 정수 부분 처리
	for char in integer_part:
		if char in num_map:
			stack.append(num_map[char])
		elif char in unit_map:
			if not stack:
				stack.append(1)
			tmp += sum(stack) * unit_map[char]
			stack = []
		else:
			if stack:
				tmp += sum(stack)
			stack = []
			num += tmp
			tmp = 0

	if stack:
		tmp += sum(stack)
	num += tmp

	# 소수 부분 처리
	if fractional_part:
		for char in fractional_part:
			if char in num_map:
				float_part = float_part * 10 + num_map[char]
				float_div *= 10
		return num + float_part / float_div

	return num
